Mam dobry sposób na dynamiczne ładowanie skryptów! Teraz używam w moim projekcie ng6, echarts4 (> 700Kb), ngx-echarts3. kiedy używam ich w dokumentach ngx-echarts, potrzebuję importu echarts w angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"], więc w module logowania, strona podczas ładowania skryptów .js, to jest duży plik! Nie chcę tego.
Myślę więc, że kątowe ładuje każdy moduł jako plik, mogę wstawić program rozpoznawania nazw routera, aby wstępnie załadować js, a następnie rozpocząć ładowanie modułu!
// 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);
}
}
Następnie w submodule-routing.module.ts , zaimportuj ten PreloadScriptResolver:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
Ten kod działa dobrze i obiecuje, że: Po załadowaniu pliku js rozpocznie się ładowanie modułu! ten Resolver może być używany w wielu routerach