在我的应用程序中,我不需要在初始化阶段加载模块(通过在 中枚举它们./modules/modules
),而是稍后根据某些条件(例如用户授权结果)按需加载。想象一下,我想为用户 A提供计算器模块,为用户 B提供文本编辑器模块。
为简单起见,让我们以样板jssampleModule1
示例应用程序为例,并假设它sampleModule2
是按需加载的。
所以我从src\modules\modules.js的初始加载序列中删除了模块:
return [
require('./baseModule/module'),
/*require('./sampleModule1/module'),
require('./sampleModule2/module')*/
];
并将控件添加到摘要页面(src\modules\baseModule\landingPage\view.html)以按需加载它们:
<div>
Congratulations! You are one step closer to creating your next large scale Javascript application!
</div>
<div>
<select id="ModuleLoader">
<option value="">Select module to load...</option>
<option value="./modules/sampleModule1/module">sampleModule1</option>
<option value="./modules/sampleModule2/module">sampleModule2</option>
</select>
</div>
然后我修补src\modules\baseModule\module.js以将上下文传递给LandingPageComponent(由于某种原因它不在原始源代码中):
controller.addRoutes({
"/" : new LandingPageComponent(context)
});
最后将加载代码添加到src\modules\baseModule\landingPage\component.js:
$('#ModuleLoader').on('change', function(){
require([this.value], function(mod){
moduleContext.loadChildContexts([mod]);
alert('Module enabled. Use can now use it.');
});
});
这似乎有效,但这是最好的方法吗?
它是否正确处理上下文加载?
如何防止两次加载相同的模块?