RequireJS implementa l' API AMD (sorgente) .
CommonJS è un modo per definire i moduli con l'aiuto di un exports
oggetto, che definisce i contenuti del modulo. In poche parole, un'implementazione di CommonJS potrebbe funzionare in questo modo:
// someModule.js
exports.doSomething = function() { return "foo"; };
//otherModule.js
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
Fondamentalmente, CommonJS specifica che è necessario disporre di una require()
funzione per recuperare le dipendenze, una exports
variabile per esportare il contenuto del modulo e un identificatore del modulo (che descrive la posizione del modulo in questione in relazione a questo modulo) che viene utilizzato per richiedere le dipendenze ( sorgente ). CommonJS ha varie implementazioni, tra cui Node.js , che hai citato.
CommonJS non è stato progettato appositamente per i browser, quindi non si adatta molto bene all'ambiente del browser (non ho davvero alcuna fonte per questo - lo dice semplicemente ovunque, incluso il sito RequireJS. ) Apparentemente, questo ha qualcosa da fare con caricamento asincrono, ecc.
D'altra parte, RequireJS implementa AMD, progettato per adattarsi all'ambiente del browser ( sorgente ). Apparentemente, AMD è iniziato come uno spin-off del formato di trasporto CommonJS e si è evoluto nella propria API di definizione del modulo. Da qui le somiglianze tra i due. La nuova funzionalità di AMD è la define()
funzione che consente al modulo di dichiarare le proprie dipendenze prima di essere caricato. Ad esempio, la definizione potrebbe essere:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
Quindi, CommonJS e AMD sono JavaScript API di definizione del modulo che hanno implementazioni diverse, ma entrambe provengono dalle stesse origini.
- AMD è più adatto per il browser, perché supporta il caricamento asincrono delle dipendenze del modulo.
- RequireJS è un'implementazione di AMD , mentre allo stesso tempo cerca di mantenere lo spirito di CommonJS (principalmente negli identificatori del modulo).
Per confondervi ancora di più, RequireJS, pur essendo un'implementazione AMD, offre un wrapper CommonJS in modo che i moduli CommonJS possano essere importati quasi direttamente per l'uso con RequireJS.
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
Spero che questo aiuti a chiarire le cose!