我正在将JavaScript编译器集成到我的Web框架中,并且遇到了一些问题。阻止js模块执行
当在开发模式运行时,所有的javascript模块由AJAX individualy加载,但切换到生产模式的情况下,它编译多个模块到一个文件中,以减少HTTP请求的数量。每个模块都可以调用一个功能来“需要”另一个模块。
我的问题是,如果moduleA需要moduleB,并且不会加载moduleB,它使一个Ajax请求。考虑下面的代码示例(非常简化),其中moduleA和moduleB被编译在一起。 moduleA需要moduleB,并且moduleB尚未被该脚本中的该点加载,所以它发出ajax请求。几行后,moduleB运行,所以它已经运行了两次。
/* compiled script file (multiple files combined) */
util.require = function(moduleName) {
if (moduleIsNotLoaded(moduleName)) {
loadByAjax(moduleName);
}
}
/* start module a */
util.require('moduleB');
moduleB.func();
/* end module a */
util.setModuleLoaded('moduleA');
/* start module b */
moduleB.func = function() {
alert('hello world');
};
bind_some_event();
/* end module b */
util.setModuleLoaded('moduleB');
这是unnacceptable,因为它违背了降低的HTTP请求的初始目的,以及一些模块绑定的事件处理程序,这是不能被绑定两次。一些模块不仅是函数定义,而且有立即运行的代码。
有没有一种方法,我可以强制所有模块可用并注册为负载,而无需实际运行的每个模块内的代码,直到整个文件已运行?我知道这可能不是一个简单的解决方案,可能需要进行范式转变。