¡Tengo una buena forma de cargar scripts dinámicamente! Ahora uso ng6, echarts4 (> 700Kb), ngx-echarts3 en mi proyecto. cuando los uso en los documentos de ngx-echarts, necesito importar echarts en angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] por lo tanto en el módulo de inicio de sesión, página mientras se cargan los scripts .js, este es un archivo grande! No lo quiero
Entonces, creo que angular carga cada módulo como un archivo, puedo insertar un enrutador para precargar js, ¡y luego comenzar la carga del módulo!
// 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);
}
}
Luego, en submodule-routing.module.ts, importe este PreloadScriptResolver:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
Este código funciona bien y promete que: ¡Después de cargar el archivo js, el módulo comenzará a cargar! este Resolver puede usar en muchos enrutadores