浏览器化只执行一次模块代码,在多个需要调用上
Browserify execute a module code only once , on multiple require calls
app.js
var MedicineManager = new Marionette.Application();
MedicineManager.addRegions({
mainRegion: "#main-region"
});
MedicineManager.navigate = function (route, options) {
options || (options = {});
Backbone.history.navigate(route, options);
};
MedicineManager.getCurrentRoute = function () {
return Backbone.history.fragment;
};
MedicineManager.on("start", function () {
if (Backbone.history) {
Backbone.history.start();
}
});
$(function () {
MedicineManager.start();
})
module.exports=MedicineManager;
我正在尝试将我的应用程序从木偶模块模式移动到浏览器化。
我在多个文件中调用require('app')
,这会导致 app.js 中的代码在每次进行require('app')
调用时执行。
正因为如此,我得到的错误Backbone.history has already been started
.此问题的解决方案是在初始化时仅调用一次代码。
我该如何解决?
您不希望对实例化对象使用 require
。它可以使用,但经验表明,虽然应该缓存模块导出,但在很多情况下,它不是,并且会抛出错误。我发现最好将require
用于静态对象/方法。 确保单一实例的最佳方法是在根方法中实例化,然后将实例传递到需要它的模块中。
如果要使用 require
重构现有代码库,可以将实例化的对象绑定到全局对象(如 window
),然后在启动部分中签入该全局对象上此对象的实例并改为返回它。
module.exports = function () {
if (!window.__medicineManager){
var MedicineManager = new Marionette.Application();
MedicineManager.addRegions({
mainRegion: "#main-region"
});
MedicineManager.navigate = function (route, options) {
options || (options = {});
Backbone.history.navigate(route, options);
};
MedicineManager.getCurrentRoute = function () {
return Backbone.history.fragment;
};
MedicineManager.on("start", function () {
if (Backbone.history) {
Backbone.history.start();
}
});
MedicineManager.start();
window.__medicineManager = MedicineManager;
}
return window.__medicineManager;
}()
更新:
顺便说一句,似乎Browerify特别有这个问题(比CommonJS或WebPack更严重)。 也许迁移到不同的模块系统将为您解决此问题。 最终,问题仍然是实例化模块对模式的滥用。 虽然污染全局范围并不理想,但我认为它更接近您想要的单例模式,并且无论构建工具的特定模块缓存方法如何,它都将始终有效。
相关文章:
- 在 SharePoint 中从 JavaScript 调用 C# 代码
- 从javascript调用C#代码
- (“NetworkError:401未经授权)从JavaScript调用代码隐藏方法
- 从Java脚本调用C#代码隐藏代码
- Dijkstra's”;针对GOTO声明的案件“;与函数一样适用于现代调用代码的命名封装
- ASP.net javascript调用代码behing方法
- 从 javascript 调用代码隐藏
- 无法从母版页调用代码页中的 Web 方法
- 在 {{#each}} 之后调用代码已在 ember.js 中呈现
- 使用 ajax 调用代码隐藏函数
- 从 Javascript 调用代码隐藏
- 多次上传调用代码点火器控制器
- 如何在PhoneGap Windows Phone中从JavaScript调用C#代码
- 从插件调用代码时出现问题:“org.eclipse.core.resources”在使用 eclipse 时
- JavaScript 理解递归调用代码清理中的上下文,没有“with”关键字
- 使用 Javascript 澄清调用代码隐藏
- 从 JavaScript 调用代码隐藏函数,该函数可能会返回另一个 JavaScript 函数
- 如何在 ajax 回调中从“成功”调用代码隐藏方法
- 用于从 aspx 页调用代码隐藏方法的 AJAX 代码不起作用
- 只有从html set onclick事件调用代码声明函数时,该函数才不存在