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, которая разработана для соответствия среде браузера ( источник ). Судя по всему, 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"; };
});
Я надеюсь, что это помогает уточнить вещи!