ngx-script-optimizer
Version:
**A lightweight Angular library designed to supercharge your third-party script handling.**
187 lines (138 loc) • 6.78 kB
Markdown
# NgxScriptOptimizer
**A lightweight Angular library designed to supercharge your third-party script handling.**
### **Note**:
Supports **Angular 15** onwards. Not compatible with versions older than Angular 15.
## Features 🎯
### **Optimize Your Third-Party Scripts:**
Effortlessly improve the performance and management of third-party JavaScript, whether inline or external, while minimizing Total Blocking Time (TBT) and First Contentful Paint (FCP) improving page speed and performance.
### **Seamless Integration with SSR and CSR:**
Designed for both Server-Side Rendering (SSR) and Client-Side Rendering (CSR), ensuring compatibility and flexibility for modern web applications.
### **Asynchronous and Efficient Loading:**
Supports multiple loading strategies:
- **Eager:** Runs scripts as soon as they are available.
- **Lazy:** Defer execution until the page is fully loaded.
- **Idle:** Leverages `requestIdleCallback` to execute when the main thread is free.
- **Worker:** Runs scripts in a Web Worker for non-blocking execution.
### **Customizable Script Placement:**
Choose where scripts are appended (head or body), giving you full control over your HTML structure. Call scripts exclusively on a page to page basis or globally based on your need. The scripts are automatically removed from the DOM once the page is destroyed.
### **Lightning Fast & Lightweight:**
Minimal impact on your bundle size with a developer-friendly API that focuses on speed and simplicity.
## **Who Benefits from NgxScriptOptimizer?**
### Industries That Rely Heavily on Third-Party Scripts:
1. **E-Commerce:** Enhance loading speed for analytics, payment gateways, and dynamic content.
2. **Media & Publishing:** Optimize ads, comments plugins, and embedded videos.
3. **SaaS Platforms:** Load tracking tools and third-party SDKs efficiently.
4. **Finance:** Ensure secure and performant integrations of banking APIs and fraud detection tools.
5. **Education:** Optimize learning platforms with third-party integrations like video conferencing or quiz tools.
## **Installation**
```bash
npm install ngx-script-optimizer
```
## **Usage**
### **Basic Example**
Import the package and include it in your standalone Angular component:
```typescript
import { ScriptOptimizerComponent } from 'ngx-script-optimizer';
@Component({
selector: 'app-root',
standalone: true,
imports: [CommonModule, ScriptOptimizerComponent],
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {}
```
In your HTML:
```html
<ngx-script-optimizer
src="https://example.com/api.js"
(onLoad)="runAfterLoad()"
renderStrategy="client"
loadStrategy="lazy"
appendTo="head"
contentType="text/javascript"
></ngx-script-optimizer>
```
## **Detailed Examples**
### **1. Server-Side Rendering (SSR)**
##### **Note**: Please note that for SSR, only the `lazy` and `eager` loading strategies are available. For CSR all options are available.
For SSR, scripts are rendered and run on the server, becoming part of the initial HTML sent to the browser.
```html
<ngx-script-optimizer
[scriptContent]="'console.log(\'SSR Script Executed\');'"
renderStrategy="server"
loadStrategy="eager"
appendTo="body"
contentType="text/javascript"
></ngx-script-optimizer>
```
### **2. Client-Side Rendering (CSR)**
#### **Lazy Loading Example**
Load the script after the page content has finished loading. The `lazy` load strategy will attach the `defer` flag to the script tag:
```html
<ngx-script-optimizer
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"
renderStrategy="client"
loadStrategy="lazy"
appendTo="head"
contentType="text/javascript"
(onLoad)="console.log('Moment.js loaded')"
></ngx-script-optimizer>
```
#### **Idle Loading Example**
Execute the script when the browser's main thread is idle:
```html
<ngx-script-optimizer
[scriptContent]="'console.log(\'Idle Script Executed\');'"
renderStrategy="client"
loadStrategy="idle"
appendTo="head"
contentType="text/javascript"
></ngx-script-optimizer>
```
#### **Web Worker Execution Example**
Run a script in a Web Worker:
##### **Note**: Please note that only the `scriptContent` attribute is currently compatible with the web worker option.
```html
<ngx-script-optimizer
[scriptContent]="`onmessage = function(e) {
const result = e.data.num1 * e.data.num2;
postMessage(result);
};`"
renderStrategy="client"
loadStrategy="worker"
appendTo="body"
contentType="text/javascript"
></ngx-script-optimizer>
```
## **Options**
| Input | Value | Description |
|------------------|------------------|-----------------------------------------------------------------------------|
| `scriptContent` | `string` | Inline JavaScript code to execute. Cannot be run simultaneoulsy with the `src` attribute. |
| `src` | `string` | External script URL (not supported in Web Worker mode). Cannot be run simultaneoulsy with the `scriptContent` attribute. |
| `renderStrategy` | `server` / `client` | Determines where the script runs (SSR or CSR). Default value is `server`. |
| `loadStrategy` | `eager` / `lazy` / `idle` / `worker` | Controls when and how the script loads. Default value is `lazy`. |
| `appendTo` | `head` / `body` | Specifies where to attach the script in the DOM. Default value is `head` |
| `contentType` | `text/javascript` | Specifies the MIME type of the script. Default value is `text/javascript` |
| `(onLoad)` | `function` | Event triggered immediately after the script is executed. Note that the onLoad method cannot be used in conjunction with SSR as it can only be called on the client side. |
| `integrity` | `string` | Optionally provide the script `integrity` attribute. |
| `origin` | `string` | Optionally provide the script `crossorigin` attribute. |
## **Default Values**
- **Render Strategy:** `server`
- **Load Strategy:** `lazy`
- **Append To:** `head`
- **Content Type:** `text/javascript`
## **Contributing**
Feel free to contribute to this library! Raise issues, suggest features, or submit pull requests.
## **License**
This project is licensed under the MIT License.