Skip to content

Instantly share code, notes, and snippets.

@changhuixu
Created March 24, 2019 02:09
Show Gist options
  • Save changhuixu/3ba85fab4be07e4617e103d1c2e72a87 to your computer and use it in GitHub Desktop.
Save changhuixu/3ba85fab4be07e4617e103d1c2e72a87 to your computer and use it in GitHub Desktop.
Lazy Load External JavaScript Library in Angular
import { Injectable, Inject } from '@angular/core';
import { ReplaySubject, Observable, forkJoin } from 'rxjs';
import { DOCUMENT } from '@angular/common';
@Injectable({
providedIn: 'root'
})
export class QuillEditorService {
private _loadedLibraries: { [url: string]: ReplaySubject<any> } = {};
constructor(@Inject(DOCUMENT) private readonly document: any) {}
lazyLoadQuill(): Observable<any> {
return forkJoin([
this.loadScript('assets/quill/quill.min.js'),
this.loadStyle('assets/quill/quill.snow.css')
]);
}
private loadScript(url: string): Observable<any> {
if (this._loadedLibraries[url]) {
return this._loadedLibraries[url].asObservable();
}
this._loadedLibraries[url] = new ReplaySubject();
const script = this.document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = url;
script.onload = () => {
this._loadedLibraries[url].next();
this._loadedLibraries[url].complete();
};
this.document.body.appendChild(script);
return this._loadedLibraries[url].asObservable();
}
private loadStyle(url: string): Observable<any> {
if (this._loadedLibraries[url]) {
return this._loadedLibraries[url].asObservable();
}
this._loadedLibraries[url] = new ReplaySubject();
const style = this.document.createElement('link');
style.type = 'text/css';
style.href = url;
style.rel = 'stylesheet';
style.onload = () => {
this._loadedLibraries[url].next();
this._loadedLibraries[url].complete();
};
const head = document.getElementsByTagName('head')[0];
head.appendChild(style);
return this._loadedLibraries[url].asObservable();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment