Ho un buon modo per caricare gli script in modo dinamico! Ora uso ng6, echarts4 (> 700Kb), ngx-echarts3 nel mio progetto. quando li utilizzo dai documenti di ngx-echarts, ho bisogno di importare echarts in angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] quindi nel modulo di login, pagina durante il caricamento degli script .js, questo è un file di grandi dimensioni! Non lo voglio
Quindi, penso che angolare carichi ogni modulo come un file, posso inserire un resolver del router per precaricare js, quindi iniziare il caricamento del modulo!
// 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);
}
}
Quindi in submodule-routing.module.ts , importa questo PreloadScriptResolver:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
Questo codice funziona bene e promette che: Dopo aver caricato il file js, il modulo inizia a caricarsi! questo resolver può essere utilizzato su molti router