ngx-script-optimizer
Version:
**A lightweight Angular library designed to supercharge your third-party script handling.**
1 lines • 9.27 kB
Source Map (JSON)
{"version":3,"file":"ngx-script-optimizer.mjs","sources":["../../../projects/ngx-script-optimizer/src/lib/script-optimizer.component.ts","../../../projects/ngx-script-optimizer/src/public-api.ts","../../../projects/ngx-script-optimizer/src/ngx-script-optimizer.ts"],"sourcesContent":["import { DOCUMENT, isPlatformServer } from '@angular/common';\r\nimport { afterNextRender, ChangeDetectionStrategy, Component, EventEmitter, Inject, Injector, Input, OnDestroy, OnInit, Output, PLATFORM_ID } from '@angular/core';\r\n\r\ntype ScriptLoadingStrategy = 'eager' | 'lazy' | 'idle' | 'worker';\r\ntype ScriptAppendStrategy = 'body' | 'head';\r\ntype ScriptRenderStrategy = 'server' | 'client';\r\n@Component({\r\n selector: 'ngx-script-optimizer',\r\n imports: [],\r\n template: ``,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ScriptOptimizerComponent implements OnInit, OnDestroy {\r\n constructor(\r\n @Inject(DOCUMENT) private document: Document,\r\n @Inject(PLATFORM_ID) private platformId: any,\r\n private injector: Injector\r\n ) { }\r\n\r\n @Input() src?: string;\r\n @Input() scriptContent?: any;\r\n @Input() appendTo: ScriptAppendStrategy = 'head';\r\n @Input() loadStrategy: ScriptLoadingStrategy = 'lazy';\r\n @Input() renderStrategy: ScriptRenderStrategy = 'server';\r\n @Input() contentType: string = 'text/javascript';\r\n @Input() integrity?: string | any;\r\n @Input() origin?: string | any;\r\n @Output() onLoad = new EventEmitter<void>();\r\n private worker?: Worker;\r\n private scriptElem!: HTMLScriptElement;\r\n\r\n ngOnInit(): void {\r\n try {\r\n if (isPlatformServer(this.platformId) && this.renderStrategy == 'server') {\r\n this.addScriptToHead();\r\n }\r\n if(this.renderStrategy == 'client') {\r\n afterNextRender(() => {\r\n this.addScriptToHead();\r\n }, {injector: this.injector})\r\n }\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n }\r\n\r\n private addScriptToHead(): void {\r\n if(!this.scriptContent && !this.src) {\r\n throw new Error(\r\n 'ScriptOptimizerComponent: Either `src` or `scriptContent` must be provided.'\r\n );\r\n }\r\n if(this.scriptContent && this.src) {\r\n throw new Error(\r\n 'ScriptOptimizerComponent: Both `src` or `scriptContent` cannot be provided at the same time.'\r\n );\r\n }\r\n if (this.loadStrategy == 'worker') {\r\n if (typeof Worker !== 'undefined') {\r\n if(this.scriptContent) {\r\n this.createAndExecuteWorker(this.scriptContent)\r\n return\r\n }\r\n throw new Error(\r\n 'ScriptOptimizerComponent: `scriptContent` must be provided.'\r\n );\r\n }\r\n return\r\n }\r\n this.scriptElem = this.document.createElement('script');\r\n this.scriptElem.type = this.contentType;\r\n this.scriptElem.integrity = this.integrity;\r\n this.scriptElem.crossOrigin = this.origin;\r\n if (this.src) {\r\n this.scriptElem.src = this.src;\r\n }\r\n if (this.scriptContent) {\r\n this.scriptElem.text = this.scriptContent;\r\n }\r\n this.scriptElem.onload = () => {\r\n this.onLoad.emit();\r\n }\r\n if (this.loadStrategy == 'eager') {\r\n this.scriptElem.defer = false;\r\n this.scriptElem.async = true;\r\n this.appendScripts();\r\n }\r\n if (this.loadStrategy == 'lazy') {\r\n this.scriptElem.defer = true;\r\n this.scriptElem.async = true;\r\n this.appendScripts();\r\n }\r\n if (this.loadStrategy == 'idle') {\r\n this.scriptElem.defer = true;\r\n this.scriptElem.async = true;\r\n if (typeof window != 'undefined' && 'requestIdleCallback' in window) {\r\n this.appendScripts();\r\n }\r\n }\r\n }\r\n\r\n private createAndExecuteWorker(scriptContent: string): void {\r\n const blob = new Blob([scriptContent], { type: 'application/javascript' });\r\n const workerUrl = URL.createObjectURL(blob);\r\n this.worker = new Worker(workerUrl);\r\n\r\n this.worker.onmessage = (event) => {\r\n console.log('Message from worker:', event.data);\r\n this.onLoad.emit();\r\n };\r\n\r\n this.worker.onerror = (error) => {\r\n console.error('Error in worker:', error.message);\r\n };\r\n }\r\n\r\n private appendScripts(): void {\r\n if (this.appendTo == 'head') {\r\n this.document.head.appendChild(this.scriptElem);\r\n }\r\n if (this.appendTo == 'body') {\r\n this.document.body.appendChild(this.scriptElem);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scriptElem && typeof document != 'undefined') {\r\n document?.body?.removeChild(this.scriptElem);\r\n document?.head?.removeChild(this.scriptElem);\r\n this.worker?.terminate();\r\n }\r\n }\r\n\r\n}\r\n","/*\r\n * Public API Surface of script-optimizer\r\n */\r\n\r\nexport * from './lib/script-optimizer.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}