Экспорт модуля библиотеки 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
переменная используется здесь.
// 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.