Ich habe eine gute Möglichkeit, Skripte dynamisch zu laden! Jetzt verwende ich in meinem Projekt ng6, echarts4 (> 700 KB), ngx-echarts3. Wenn ich sie in den Dokumenten von ngx-echarts verwende, muss ich Echarts in angle.json importieren: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"], also im Anmeldemodul, Seite beim Laden von Skripten .js, das ist eine große Datei! Ich will es nicht
Ich denke also, jedes Modul wird als Datei per Winkel geladen. Ich kann einen Router-Resolver einfügen, um js vorzuladen, und dann mit dem Laden des Moduls beginnen!
// 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);
}
}
Importieren Sie dann in submodule-routing.module.ts Pr diesen PreloadScriptResolver:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
Dieser Code funktioniert gut und verspricht Folgendes: Nachdem die js-Datei geladen wurde, beginnt das Laden des Moduls! Dieser Resolver kann in vielen Routern verwendet werden