RequireJS implementuje API AMD (źródło) .
CommonJS to sposób definiowania modułów za pomocą exports
obiektu, który definiuje zawartość modułu. Krótko mówiąc, implementacja CommonJS może działać w następujący sposób:
// 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"; };
Zasadniczo CommonJS określa, że potrzebujesz require()
funkcji do pobierania zależności, exports
zmiennej do eksportowania zawartości modułu i identyfikatora modułu (który opisuje lokalizację danego modułu w stosunku do tego modułu), który jest używany do żądania zależności ( źródło ). CommonJS ma różne implementacje, w tym Node.js , o których wspomniałeś.
CommonJS nie został specjalnie zaprojektowany z myślą o przeglądarkach, więc nie pasuje zbyt dobrze do środowiska przeglądarki ( naprawdę nie mam na to źródła - tak po prostu jest wszędzie, w tym strona RequireJS ) . Najwyraźniej ma to coś do zrobić z ładowaniem asynchronicznym itp.
Z drugiej strony RequireJS implementuje AMD, które jest zaprojektowane tak, aby pasowało do środowiska przeglądarki ( źródła ). Najwyraźniej AMD zaczęło jako wydzielenie formatu CommonJS Transport i przekształciło się we własny interfejs API definicji modułów. Stąd podobieństwa między nimi. Nowa funkcja AMD to define()
funkcja, która pozwala modułowi zadeklarować swoje zależności przed załadowaniem. Na przykład definicja może wyglądać następująco:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
Tak więc CommonJS i AMD to interfejsy API definicji modułów JavaScript , które mają różne implementacje, ale oba pochodzą z tego samego źródła.
- AMD jest bardziej odpowiedni dla przeglądarki, ponieważ obsługuje asynchroniczne ładowanie zależności modułów.
- RequireJS jest implementacją AMD , a jednocześnie stara się zachować ducha CommonJS (głównie w identyfikatorach modułów).
Aby jeszcze bardziej Cię zdezorientować, RequireJS, będąc implementacją AMD, oferuje opakowanie CommonJS, dzięki czemu moduły CommonJS można niemal zaimportować bezpośrednio do użycia z RequireJS.
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
Mam nadzieję, że to pomoże w wyjaśnieniu!