在我的应用程序需要不是在初始化阶段加载模块(通过枚举它们./modules/modules
),但在后来的需求基于一些条件(例如,用户授权的结果)。 想象一下,我想提供用户A使用计算器模块,并用文本编辑器模块, 用户B。
让我们以简单boilerplatejs示例应用程序,并假定sampleModule1
和sampleModule2
是按需加载。
所以我删除从最初的装料程序模块将src \ \模块modules.js:
return [
require('./baseModule/module'),
/*require('./sampleModule1/module'),
require('./sampleModule2/module')*/
];
并添加控件摘要页面(SRC \模块\ 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 \模块\ baseModule \ module.js传递上下文到LandingPageComponent(由于某种原因,它并不在原始源代码):
controller.addRoutes({
"/" : new LandingPageComponent(context)
});
最后加载代码添加到SRC \模块\ baseModule \的LandingPage \ component.js:
$('#ModuleLoader').on('change', function(){
require([this.value], function(mod){
moduleContext.loadChildContexts([mod]);
alert('Module enabled. Use can now use it.');
});
});
这似乎是工作,但是这是做的最好的方法是什么?
是否正确处理上下文加载?
如何防止加载在同一模块的两倍?