স্ক্রিপ্টগুলি ডায়নামিকভাবে লোড করার আমার একটি ভাল উপায় আছে! এখন আমি আমার প্রকল্পে এনজি 6, ইচার্টস 4 (> 700 কেবি), এনজিএক্স-ইচার্ট 3 ব্যবহার করি। যখন আমি এগুলিকে এনজিএক্স-ইচার্টস ডক্স দ্বারা ব্যবহার করি, তখন আমার কৌণিক.জসন এচার্টগুলি আমদানি করা দরকার: "স্ক্রিপ্টস": ["./ নোড_মডিউলস / এচার্টস / ডিস্ট / এচার্টস.মিন.জেস"] এভাবে লগইন মডিউলে, স্ক্রিপ্টগুলি লোড করার সময় পৃষ্ঠাতে .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);
}
}
তারপরে সাব-মডিউল-রাউটিং.মডিউল.টায় this এই প্রিলোডস্ক্রিপ্ট রিসোলভারটি আমদানি করুন:
const routes: Routes = [
{
path: "",
component: DashboardComponent,
canActivate: [AuthGuardService],
canActivateChild: [AuthGuardService],
resolve: {
preloadScripts: PreloadScriptResolver
},
data: {
preloadScripts: ["echarts"] // important!
},
children: [.....]
}
এই কোডটি ভাল কাজ করে এবং এর প্রতিশ্রুতি দেয় যে: জেএস ফাইল লোড হওয়ার পরে, মডিউলটি লোড শুরু করবে! এই সমাধানকারীটি অনেক রাউটারে ব্যবহার করতে পারে