2015-09-08 48 views
1

我已經看到以下IIFE模式(有名字嗎?),根據this博客文章防止其他插件,提高縮小和具有微小的性能優勢。我也親自給IIFE添​​加了一個命名空間:我已經在每個JavaScript文件中看到了這種模式。在連接和縮小之後怎麼樣?我如何確保我的代碼僅包含上述IIFE的一個?在這方面做像NPM,Gulp/Grunt這樣的工具?有沒有處理這種情況的標準方法?避免多個副本的IIFE模式

+0

這對性能的影響很小,由於模式的多次使用,你有什麼問題? – Barmar

+0

這是您必須在每個文件中複製的代碼。連接和縮小後,您只需要它的一個副本,這將進一步幫助縮小。這似乎是一個相當常見的模式,我曾希望有人解決了這個問題。 –

+1

在什麼狀態下運行您的構建工具?作爲最後一步,觀看還是更多? – atmd

回答

1

經過一番調查之後,像jQuery和knockout這樣的庫編寫者通過預先掛起並將IFFE附加到JavaScript來處理此問題。然後他們有一個將所有內容連接在一起的make文件。

jQuery IIFE的開始處理非瀏覽器場景要複雜得多。

jQuery intro.js

(function(global, factory) { 
    if (typeof module === "object" && typeof module.exports === "object") { 
     module.exports = global.document ? 
      factory(global, true) : 
      function(w) { 
       if (!w.document) { 
        throw new Error("jQuery requires a window with a document"); 
       } 
       return factory(w); 
      }; 
    } else { 
     factory(global); 
    } 
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) { 

jQuery outro.js

return jQuery; 
})); 

淘汰賽(感謝@JamesThorpe)採用一種略微不同的方法來解決窗口和它的後代。

Knockout extern-pre.js

(function(undefined){ 
    var window = this || (0, eval)('this'), 
     document = window['document'], 
     navigator = window['navigator'], 
     jQueryInstance = window["jQuery"], 
     JSON = window["JSON"]; 

Knockout extern-post.js

}()); 

然後,您可以使用類似gulp-concat夾在你自己的腳本文件的前奏和結尾的文件。