JQuery库模块导出

Beg*_*ner 9 javascript jquery module umd

我试图了解jQuery如何设置自己.

在开始时,jQuery会自动调用一个导出模块的函数.

设置如何工作?

这里有一些更详细的子问题可能会回答更一般的问题:

  • 什么是使用递归调用的function(w)module.exports
  • noGlobal变量有什么用?
  • factory实际设置在哪里,它的类型是什么?
  • 为什么factory参数可以用一个参数和两个参数调用?
  • 什么是global应该包含的论点?(我希望有类似c ++的类型...)

(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 have a `window` with a `document`
        // (such as Node.js), expose a 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 ) {
Run Code Online (Sandbox Code Playgroud)

Ale*_*ara 17

什么是使用递归调用的function(w)module.exports

它不是递归调用,更像是延迟初始化函数.在某些CommonJS环境中,如Node.JS,全局对象没有document属性,而其他如Browserify和Webpack则有.

jQuery需要对document属性进行初始化,因此首先检查全局对象是否包含document属性.如果是这样,它会立即初始化,使浏览器中的CommonJS环境变得愉快.如果没有,则返回一个可用于稍后初始化jQuery的函数.以后可以在伪窗口上调用此函数,使用jsdom之类的东西创建.


noGlobal变量有什么用?

noGlobal变量在这里使用.

摘自jQuery:

// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( typeof noGlobal === strundefined ) {
    window.jQuery = window.$ = jQuery;
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,如果noGlobalundefined,jQuery会将自己添加到全局window对象中.唯一不会这样做的是它是由CommonJS加载器加载的,document在全局对象上有一个属性,比如Browserify或Webpack.下面的电话就是noGlobalundefined.

factory( global, true )
Run Code Online (Sandbox Code Playgroud)

factory实际设置在哪里,它的类型是什么?

factory变量是function,正是在这里宣布:

function( window, noGlobal ) {
Run Code Online (Sandbox Code Playgroud)

这是传递给IIFE的第二个论点.


为什么factory参数可以用一个参数和两个参数调用?

因为JavaScript.

在JavaScript中,不需要匹配声明函数的参数数量.任何省略的参数都有值undefined.


什么是global应该包含的论点?(我希望有类似c ++的类型...)

它应该包含JavaScript环境的全局对象.在浏览器中,此对象称为window,在Node中,此对象称为global.在这两种环境中,this无论全局名称是什么,在全局范围内使用都将解析为全局对象.

但是,由于某些第三方包装器可以更改jQuery初始化的范围,jQuery将首先检查该window对象是否可用并在其中使用它.如果不使用,它将默认使用this.

typeof window !== "undefined" ? window : this
Run Code Online (Sandbox Code Playgroud)

还有一个问题:w论证来自哪里?

当全局对象不包含a时document,它返回一个接受一个参数的函数w.这个对象是一个类似window的对象document,可以使用像jsdom这样的东西创建.