operator - javascript modules es6
Exportación del módulo de biblioteca JQuery (1)
¿Cuál es el uso de la llamada recursiva para
function(w)
enmodule.exports
?
No es una llamada recursiva, más una función de inicialización diferida. En algunos entornos CommonJS, como Node.JS, el objeto global no tiene una propiedad de document
, mientras que otros como Browserify y Webpack sí lo tienen.
jQuery requiere la propiedad del document
para inicializarse, por lo que primero verifica si el objeto global contiene una propiedad del document
. Si lo hace, se inicializa de inmediato, haciendo que los entornos comunes de CommonJS sean felices. Si no lo hace, devuelve una función que se puede utilizar para inicializar jQuery. Esta función podría llamarse más tarde en una ventana falsa, creando algo así como jsdom.
¿Para qué sirve la variable
noGlobal
?
La variable noGlobal
se usa aquí.
// 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;
}
Básicamente, si noGlobal
undefined
está undefined
, jQuery se agregará al objeto de window
global. El único momento en que no hará esto es si lo carga un cargador CommonJS, con una propiedad de document
en el objeto global, como Browserify o Webpack. La llamada a continuación es donde noGlobal
no está undefined
.
factory( global, true )
¿Dónde está configurada la
factory
y cuál es su tipo?
La variable de factory
es una function
y se declara aquí:
function( window, noGlobal ) {
Es el segundo argumento pasado al IIFE .
¿Por qué se puede llamar al argumento de
factory
con un argumento y con dos también?
Porque JavaScript.
En JavaScript, no es necesario que coincida con la cantidad de argumentos con los que se declara una función. Cualquier argumento omitido tiene el valor undefined
.
¿Qué se supone que contiene el argumento
global
? (Ojalá hubiera un tipo como en c ++ ...)
Se supone que contiene el objeto global para el entorno de JavaScript. En un navegador, este objeto se conoce como window
, y en Nodo, este objeto se conoce como global
. En ambos entornos, usar this
en el ámbito global se resolverá en el objeto global, cualquiera que sea su nombre global.
Sin embargo, debido a algunas envolturas de terceros que pueden cambiar el alcance en el que jQuery se inicializa, jQuery primero verificará si el objeto de la window
está disponible y lo usará si lo está. Si no lo usa, usará esto de forma predeterminada.
typeof window !== "undefined" ? window : this
una pregunta más: ¿de dónde viene el argumento w?
Cuando el objeto global no contiene un document
, devuelve una función que acepta un argumento, el w
. Este objeto sería un objeto similar a una window
con un document
que se puede crear con algo como jsdom.
Estoy tratando de entender cómo se establece jQuery.
Justo al comienzo, jQuery llama automáticamente a una función, que exporta un módulo.
¿Cómo funciona la configuración?
Aquí algunas subpreguntas más detalladas que podrían responder a la pregunta más general:
- ¿Cuál es el uso de la llamada recursiva para
function(w)
enmodule.exports
? - ¿Para qué sirve la variable
noGlobal
? - ¿Dónde está configurada la
factory
y cuál es su tipo? - ¿Por qué se puede llamar al argumento de
factory
con un argumento y con dos también? - ¿Qué se supone que contiene el argumento
global
? (Ojalá hubiera un tipo como en 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 ) {