RequireJS реализует AMD API (источник) < / а>.
CommonJS - это способ определения модулей с помощью объекта exports
, который определяет содержимое модуля. Проще говоря, реализация CommonJS может работать так:
// 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"; };
По сути, CommonJS указывает, что вам нужна функция require()
для получения зависимостей, переменная exports
для экспорта содержимого модуля и идентификатор модуля (который описывает расположение рассматриваемого модуля по отношению к этому модулю), который используется для запроса зависимостей. (исходный код). CommonJS имеет различные реализации, включая упомянутый вами Node.js.
CommonJS не был специально разработан с учетом браузеров, поэтому он не очень хорошо вписывается в среду браузера (у меня действительно нет источника для этого - он просто говорит об этом везде, включая сайт RequireJS.) По-видимому, это как-то связано с асинхронной загрузкой и т. д.
С другой стороны, RequireJS реализует AMD, которая разработана для соответствия среде браузера (source а>). Судя по всему, AMD начинала как дочерний продукт транспортного формата CommonJS и превратилась в собственный API определения модулей. Отсюда сходство между ними. Новой функцией AMD является функция define()
, которая позволяет модулю объявлять свои зависимости перед загрузкой. Например, определение может быть таким:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
Итак, CommonJS и AMD - это API-интерфейсы определения модулей JavaScript, которые имеют разные реализации, но оба имеют одинаковое происхождение.
- AMD больше подходит для браузера, поскольку поддерживает асинхронную загрузку зависимостей модулей.
- RequireJS является реализацией AMD, но в то же время пытается сохранить дух CommonJS (в основном в идентификаторах модулей).
Чтобы запутать вас еще больше, RequireJS, будучи реализацией AMD, предлагает оболочку CommonJS, поэтому модули CommonJS можно почти напрямую импортировать для использования с RequireJS.
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
Надеюсь, это поможет прояснить ситуацию!
person
jakee
schedule
13.05.2013