2011-09-26 119 views
0

我正在将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请求的初始目的,以及一些模块绑定的事件处理程序,这是不能被绑定两次。一些模块不仅是函数定义,而且有立即运行的代码。

有没有一种方法,我可以强制所有模块可用并注册为负载,而无需实际运行的每个模块内的代码,直到整个文件已运行?我知道这可能不是一个简单的解决方案,可能需要进行范式转变。

回答

0

我们的网络应用程序也由模块组成。它的工作原理可能会给你一些想法的方式:

最常见的模块,嵌入在初始HTML页面(HTML,JS,CSS,数据图像)。 该应用程序从该页面开始(300-400kb,然后从缓存中),以及一个HTTP数据调用。
这使得应用程序启动非常快。

然后,如果用户选择一个新的模块,尚未加载。它通过iframe。 HTML,CSS和Javascript对象由父页面导入。

然后新模块从父页面启动。