【发布时间】:2013-02-18 15:59:01
【问题描述】:
在我的应用程序中,我需要加载模块而不是在初始化阶段(通过在./modules/modules 中枚举它们),而是稍后根据某些条件(例如用户授权结果)按需加载。想象一下,我想为 User A 提供计算器模块,并为 User B 提供文本编辑器模块。
为了简单起见,我们以 boilerplatejs 示例应用为例,并假设 sampleModule1 和 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.');
});
});
这似乎有效,但这是最好的方法吗?
它是否正确处理上下文加载?
如何防止两次加载同一个模块?
【问题讨论】:
标签: boilerplatejs