兼容 CommonJS 和 CommonJS-like规范(1~38)

CommonJS是服务器端模块的规范,Node.js采用了这个规范。

根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。

如果jquery要在node中使用,要解决两个问题:

1.以module.exports的方式导入(CommonJS模块引入)

2.因为是服务器环境,是没有window变量的。

/*!

 * jQuery JavaScript Library v2.1.1

 * http://jquery.com/

 *

 * Includes Sizzle.js

 * http://sizzlejs.com/

 *

 * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors

 * Released under the MIT license

 * http://jquery.org/license

 *

 * Date: 2014-05-01T17:11Z

 */



(function( global, factory ) {



    if ( typeof module === "object" && typeof module.exports === "object" ) {

        // For CommonJS and CommonJS-like environments where a proper window is present,

        // execute the factory and get jQuery

        // For environments that do not inherently posses a window with a document

        // (such as Node.js), expose a jQuery-making factory as module.exports

        // This accentuates the need for the creation of a real window

        // e.g. var jQuery = require("jquery")(window);

        // See ticket #14549 for more info

        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 );

    }



// Pass this if window is not defined yet

}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

    //factory code....

}))

根据代码,jquery采用一个立即调用函数,判断是否是CommonJS规范(typeof module === "object" && typeof module.exports === "object"),不是则调用库函数,是则再判断有没有document(走到这步是判断过没有window,开启没有window模式),有则调用库函数,

无则返回一个等待传入window的匿名函数。

你可能感兴趣的:(CommonJS)