2011-09-26 161 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對象由父頁面導入。

然後新模塊從父頁面啓動。