J'ai un bon moyen de charger dynamiquement des scripts! J'utilise maintenant ng6, echarts4 (> 700Kb), ngx-echarts3 dans mon projet. quand je les utilise par les docs de ngx-echarts, j'ai besoin d'importer des echarts dans angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] donc dans le module de connexion, page lors du chargement des scripts .js, c'est un gros fichier! Je n'en veux pas.
Donc, je pense que angular charge chaque module sous forme de fichier, je peux insérer un résolveur de routeur pour précharger js, puis commencer le chargement du module!
// 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);
}
}
Puis dans le submodule-routing.module.ts , importez ce PreloadScriptResolver:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
Ce code fonctionne bien, et il promet que: Une fois le fichier js chargé, le module commence le chargement! ce résolveur peut utiliser dans de nombreux routeurs