O RequireJS implementa a API da AMD (origem) .
CommonJS é uma maneira de definir módulos com a ajuda de um exports
objeto, que define o conteúdo do módulo. Simplificando, uma implementação do CommonJS pode funcionar assim:
// 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"; };
Basicamente, o CommonJS especifica que você precisa ter uma require()
função para buscar dependências, uma exports
variável para exportar o conteúdo do módulo e um identificador de módulo (que descreve o local do módulo em questão em relação a este módulo) que é usado para exigir as dependências ( origem ) O CommonJS possui várias implementações, incluindo o Node.js , que você mencionou.
O CommonJS não foi especialmente projetado com os navegadores em mente, por isso não se encaixa muito bem no ambiente do navegador ( eu realmente não tenho uma fonte para isso - apenas diz isso em todos os lugares, incluindo o site RequireJS. ) Aparentemente, isso tem algo a fazer com carregamento assíncrono, etc.
Por outro lado, o RequireJS implementa a AMD, projetada para se adequar ao ambiente do navegador ( fonte ). Aparentemente, a AMD começou como um spinoff do formato CommonJS Transport e evoluiu para sua própria API de definição de módulo. Daí as semelhanças entre os dois. O novo recurso da AMD é a define()
função que permite ao módulo declarar suas dependências antes de ser carregado. Por exemplo, a definição pode ser:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
Portanto, CommonJS e AMD são APIs de definição de módulo JavaScript que possuem implementações diferentes, mas ambas vêm da mesma origem.
- A AMD é mais adequada para o navegador, pois suporta o carregamento assíncrono das dependências do módulo.
- O RequireJS é uma implementação da AMD , ao mesmo tempo em que tenta manter o espírito do CommonJS (principalmente nos identificadores do módulo).
Para confundir ainda mais, o RequireJS, embora seja uma implementação da AMD, oferece um wrapper CommonJS para que os módulos CommonJS possam ser quase diretamente importados para uso com o RequireJS.
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
Espero que isso ajude a esclarecer as coisas!