operator modules es6 javascript jquery module umd

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) en module.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í.

Extracto de 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; }

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) en module.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 ) {