我正在將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請求的初始目的,以及一些模塊綁定的事件處理程序,這是不能被綁定兩次。一些模塊不僅是函數定義,而且有立即運行的代碼。
有沒有一種方法,我可以強制所有模塊可用並註冊爲負載,而無需實際運行的每個模塊內的代碼,直到整個文件已運行?我知道這可能不是一個簡單的解決方案,可能需要進行範式轉變。