Экспорт модуля библиотеки JQuery

Я пытаюсь понять, как 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 ) {

1 ответ

Решение

Какая польза от рекурсивного вызова 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;
}

По сути, если noGlobal является undefined, JQuery добавит себя в глобальный window объект. Единственный раз, когда это не будет сделано, это если он загружен загрузчиком CommonJS, с document свойство глобального объекта, такого как Browserify или Webpack. Звонок ниже, где noGlobal не является undefined,

factory( global, true )

Где factory на самом деле настроен и каков его тип?

factory переменная является functionи здесь заявлено:

function( window, noGlobal ) {

Это второй аргумент, переданный во IIFE.


Почему может factory аргумент вызывается с одним и двумя аргументами?

Потому что JavaScript.

В JavaScript нет требования совпадать с количеством аргументов, с которыми объявлена ​​функция. Любые пропущенные аргументы имеют значение undefined,


Что global аргумент должен содержать? (Я бы хотел, чтобы был тип, как в C++...)

Предполагается, что он содержит глобальный объект для среды JavaScript. В браузере этот объект известен как windowи в Узле этот объект известен как global, В обеих средах, используя this в глобальной области видимости будет преобразовываться в глобальный объект, каким бы ни было его глобальное имя.

Однако из-за некоторых сторонних оболочек, которые могут изменить область, в которой инициализируется jQuery, jQuery сначала проверит, window объект доступен и используйте его, если он есть. Если не использовать, он будет по умолчанию использовать this,

typeof window !== "undefined" ? window : this

еще один вопрос: откуда берется аргумент w?

Когда глобальный объект не содержит document, он возвращает функцию, которая принимает один аргумент, w, Этот объект будет window-подобный объект с document это может быть создано с чем-то вроде jsdom.

Другие вопросы по тегам