RequireJS реалізує API AMD (джерело) .
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"; };
});
Я сподіваюся, що це допомагає з’ясувати речі!