避免IIFE模式的多个副本

时间:2015-09-08 14:27:09

标签: javascript gruntjs npm gulp iife

我已经看到了以下IIFE模式(它有名称吗?),根据this博客帖子可以防止其他插件,改善缩小并具有微小性能优势。我还亲自为IIFE添​​加了命名空间:

(function (MyNamespace, $, window, document, undefined) {
    "use strict";

    // My Code

})(window.MyNamespace = window.MyNamespace || {}, window.jQuery, window, document);

我在每个JavaScript文件中都看到过这种模式。串联和缩小后怎么样?如何确保我的代码只包含一个的上述IIFE?像NPM,Gulp / Grunt这样的工具在这方面有帮助吗?是否有处理此方案的标准方法?

1 个答案:

答案 0 :(得分: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;
}));

Knockout(感谢@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的内容将intro和outro文件夹在自己的脚本文件周围。