2015-05-06 7 views
7

Sto cercando di capire come si imposta jQuery.Esportazione modulo libreria JQuery

Proprio all'inizio jQuery chiama automaticamente una funzione, che esporta un modulo.

Come funziona la configurazione?

Qui alcuni più dettagliati sotto-domande che potrebbero rispondere alla domanda più generale:

  • Qual è l'uso della chiamata ricorsiva a function(w) a module.exports?
  • Qual è l'uso della variabile noGlobal?
  • Dove si trova effettivamente lo factory e qual è il suo tipo?
  • Perché l'argomento factory viene chiamato con un argomento e anche con due?
  • Qual è l'argomento global che si suppone debba contenere? (Vorrei che ci fosse un tipo come in 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) { 

risposta

15

Qual è l'uso della chiamata ricorsiva a function(w) a module.exports?

Non è una chiamata ricorsiva, più una funzione di inizializzazione differita. In alcuni ambienti CommonJS, come Node.JS, l'oggetto globale non ha una proprietà document, mentre altri come Browserify e Webpack lo fanno.

jQuery richiede la proprietà document da inizializzare, quindi prima controlla se l'oggetto globale contiene una proprietà document. Se lo fa, si inizializza immediatamente, rendendo felici gli ambienti CommonJS nel browser. In caso contrario, restituisce una funzione che può essere utilizzata per inizializzare in seguito jQuery. Questa funzione potrebbe essere successivamente chiamata su una finta finestra, creando qualcosa come jsdom.


Qual è l'uso della variabile noGlobal?

La variabile noGlobal è utilizzata qui.

Excerpt from 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; 
} 

In sostanza, se noGlobal è undefined, jQuery sarà essa stessa a creare l'window oggetto globale. L'unica volta che non lo farà è se è caricato da un caricatore CommonJS, con una proprietà document sull'oggetto globale, ad esempio Browserify o Webpack. La seguente chiamata è dove noGlobal non è undefined.

factory(global, true) 

Dove è il factory effettivamente istituito e qual è il suo tipo?

La variabile factory è un function, e si precisa qui:

function(window, noGlobal) { 

E 'il secondo argomento passato alla IIFE.


Perché può l'argomento factory ottenere con un solo argomento e con due come bene?

Perché JavaScript.

In JavaScript, non è necessario abbinare il numero di argomenti con cui una funzione è dichiarata. Gli argomenti omessi hanno il valore undefined.


Qual è l'argomento global dovrebbe contenere? (Vorrei che ci fosse un tipo come in C++ ...)

Si suppone che contenga l'oggetto globale per l'ambiente JavaScript. In un browser, questo oggetto è noto come window e, nel nodo, questo oggetto è noto come global. In entrambi gli ambienti, l'utilizzo di this nell'ambito globale verrà risolto nell'oggetto globale, indipendentemente dal suo nome globale.

Tuttavia, a causa di alcuni wrapper di terze parti che possono modificare l'ambito di inizializzazione di jQuery, jQuery controlla innanzitutto se l'oggetto window è disponibile e lo utilizza se lo è. Se non si usa, per impostazione predefinita verrà utilizzato this.

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

un'altra domanda: dove sta l'argomento w provenienti da?

Quando l'oggetto globale non contiene un document, restituisce una funzione che accetta un argomento, il w. Questo oggetto sarebbe un oggetto simile a window con un document che può essere creato con qualcosa come jsdom.

+0

un'altra domanda: da dove viene l'argomento w? – Beginner

+0

@Beginner Quando l'oggetto globale non contiene un 'documento', restituisce una funzione che accetta un argomento, il' w'. Questo oggetto sarebbe un oggetto 'finestra' con un' documento' che può essere creato con qualcosa come jsdom. –

+0

Questo significa che w è una variabile globale che è disponibile nel caso in cui nessun documento sia disponibile? – Beginner