JavaScript Definizione di modulo asincrono (AMD)


Esempio

AMD è un sistema di definizione dei moduli che tenta di risolvere alcuni dei problemi comuni con altri sistemi come CommonJS e chiusure anonime.

AMD affronta questi problemi:

  • Registrare la funzione factory chiamando define (), invece di eseguirlo immediatamente
  • Passando le dipendenze come una matrice di nomi di moduli, che vengono poi caricati, invece di utilizzare globals
  • Esegui solo la funzione di fabbrica una volta caricate ed eseguite tutte le dipendenze
  • Passaggio dei moduli dipendenti come argomenti alla funzione di fabbrica

La cosa fondamentale qui è che un modulo può avere una dipendenza e non tenere tutto in attesa che si carichi, senza che lo sviluppatore debba scrivere codice complicato.

Ecco un esempio di AMD:

// Define a module "myModule" with two dependencies, jQuery and Lodash
define("myModule", ["jquery", "lodash"], function($, _) {
    // This publicly accessible object is our module
    // Here we use an object, but it can be of any type
    var myModule = {};

    var privateVar = "Nothing outside of this module can see me";

    var privateFn = function(param) {
        return "Here's what you said: " + param;
    };

    myModule.version = 1;

    myModule.moduleMethod = function() {
        // We can still access global variables from here, but it's better
        // if we use the passed ones
        return privateFn(windowTitle);
    };

    return myModule;
});

I moduli possono anche saltare il nome ed essere anonimi. Quando ciò è fatto, in genere vengono caricati in base al nome del file.

define(["jquery", "lodash"], function($, _) { /* factory */ });

Possono anche saltare le dipendenze:

define(function() { /* factory */ });

Alcuni caricatori AMD supportano la definizione di moduli come oggetti semplici:

define("myModule", { version: 1, value: "sample string" });