RequireJS implémente l' API AMD (source) .
CommonJS est un moyen de définir des modules à l'aide d'un exports
objet, qui définit le contenu du module. Autrement dit, une implémentation CommonJS pourrait fonctionner comme ceci:
// 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"; };
Fondamentalement, CommonJS spécifie que vous devez avoir une require()
fonction pour récupérer les dépendances, une exports
variable pour exporter le contenu du module et un identifiant de module (qui décrit l'emplacement du module en question par rapport à ce module) qui est utilisé pour exiger les dépendances ( source ). CommonJS a diverses implémentations, dont Node.js , que vous avez mentionné.
CommonJS n'a pas été spécialement conçu pour les navigateurs, il ne s'intègre donc pas très bien dans l'environnement du navigateur ( je n'ai vraiment aucune source pour cela - il le dit partout, y compris le site RequireJS. ) Apparemment, cela a quelque chose à faire avec le chargement asynchrone, etc.
D'autre part, RequireJS implémente AMD, qui est conçu pour convenir à l'environnement du navigateur ( source ). Apparemment, AMD a commencé comme un spin-off du format CommonJS Transport et est devenu sa propre API de définition de module. D'où les similitudes entre les deux. La nouvelle fonctionnalité d'AMD est la define()
fonction qui permet au module de déclarer ses dépendances avant d'être chargé. Par exemple, la définition pourrait être:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
Ainsi, CommonJS et AMD sont des API de définition de module JavaScript qui ont des implémentations différentes, mais les deux proviennent des mêmes origines.
- AMD est plus adapté au navigateur, car il prend en charge le chargement asynchrone des dépendances de module.
- RequireJS est une implémentation d' AMD , tout en essayant de garder l'esprit de CommonJS (principalement dans les identifiants des modules).
Pour vous embrouiller encore plus, RequireJS, tout en étant une implémentation AMD, propose un wrapper CommonJS afin que les modules CommonJS puissent presque directement être importés pour être utilisés avec RequireJS.
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
J'espère que cela aide à clarifier les choses!