Saya memiliki cara yang baik untuk memuat skrip secara dinamis! Sekarang saya menggunakan ng6, echarts4 (> 700Kb), ngx-echarts3 dalam proyek saya. ketika saya menggunakannya oleh ngx-echarts's docs, saya perlu mengimpor echarts di angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] sehingga dalam modul login, halaman saat memuat skrip .js, ini file besar! Saya tidak menginginkannya.
Jadi, saya pikir sudut memuat setiap modul sebagai file, saya dapat memasukkan resolver router untuk preload js, kemudian mulai memuat modul!
// PreloadScriptResolver.service.js
/**动态加载js的服务 */
@Injectable({
providedIn: 'root'
})
export class PreloadScriptResolver implements Resolve<IPreloadScriptResult[]> {
// Here import all dynamically js file
private scripts: any = {
echarts: { loaded: false, src: "assets/lib/echarts.min.js" }
};
constructor() { }
load(...scripts: string[]) {
const promises = scripts.map(script => this.loadScript(script));
return Promise.all(promises);
}
loadScript(name: string): Promise<IPreloadScriptResult> {
return new Promise((resolve, reject) => {
if (this.scripts[name].loaded) {
resolve({ script: name, loaded: true, status: 'Already Loaded' });
} else {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = this.scripts[name].src;
script.onload = () => {
this.scripts[name].loaded = true;
resolve({ script: name, loaded: true, status: 'Loaded' });
};
script.onerror = (error: any) => reject({ script: name, loaded: false, status: 'Loaded Error:' + error.toString() });
document.head.appendChild(script);
}
});
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<IPreloadScriptResult[]> {
return this.load(...route.routeConfig.data.preloadScripts);
}
}
Kemudian di submodule-routing.module.ts , impor PreloadScriptResolver ini:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
Kode ini berfungsi dengan baik, dan menjanjikan bahwa: Setelah file js dimuat, maka modul mulai memuat! Penyelesai ini dapat digunakan di banyak router