RequireJS implementa la API de AMD (fuente) .
CommonJS es una forma de definir módulos con la ayuda de un exports
objeto, que define el contenido del módulo. En pocas palabras, una implementación de CommonJS podría funcionar así:
// 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"; };
Básicamente, CommonJS especifica que debe tener una require()
función para buscar dependencias, una exports
variable para exportar el contenido del módulo y un identificador de módulo (que describe la ubicación del módulo en cuestión en relación con este módulo) que se utiliza para requerir las dependencias ( fuente ) CommonJS tiene varias implementaciones, incluyendo Node.js , que mencionó.
CommonJS no fue especialmente diseñado con los navegadores en mente, por lo que no encaja muy bien en el entorno del navegador ( realmente no tengo una fuente para esto, solo lo dice en todas partes, incluido el sitio RequireJS ) . Aparentemente, esto tiene algo que hacer con carga asincrónica, etc.
Por otro lado, RequireJS implementa AMD, que está diseñado para adaptarse al entorno del navegador ( fuente ). Aparentemente, AMD comenzó como un spin-off del formato de transporte CommonJS y evolucionó hacia su propia API de definición de módulo. De ahí las similitudes entre los dos. La nueva característica de AMD es la define()
función que permite al módulo declarar sus dependencias antes de cargarlo. Por ejemplo, la definición podría ser:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
Entonces, CommonJS y AMD son API de definición de módulo de JavaScript que tienen implementaciones diferentes, pero ambas provienen del mismo origen.
- AMD es más adecuado para el navegador, ya que admite la carga asincrónica de dependencias de módulos.
- RequireJS es una implementación de AMD , al mismo tiempo que trata de mantener el espíritu de CommonJS (principalmente en los identificadores del módulo).
Para confundirlo aún más, RequireJS, aunque es una implementación de AMD, ofrece un contenedor CommonJS para que los módulos CommonJS se puedan importar casi directamente para usar con RequireJS.
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
¡Espero que esto ayude a aclarar las cosas!