我已经看到了以下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这样的工具在这方面有帮助吗?是否有处理此方案的标准方法?
答案 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文件夹在自己的脚本文件周围。