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
モジュールの内容をエクスポートする変数、および依存関係を要求するために使用されるモジュール識別子 (このモジュールに関連して問題のモジュールの場所を記述する) が必要であることを指定します ( source)。CommonJS には、あなたが言及したNode.jsを含むさまざまな実装があります。
CommonJS はブラウザーを念頭に置いて特別に設計されたわけではないため、ブラウザー環境にはあまり適合しません (*これに関するソースはありません。RequireJS サイトを含め、どこでもそう言っているだけです。* ) どうやら、これには非同期ロードなどと関係があります。
一方、RequireJS は、ブラウザ環境に合わせて設計された AMD を実装しています ( source )。どうやら、AMD は CommonJS Transport フォーマットのスピンオフとして始まり、独自のモジュール定義 API に発展したようです。したがって、2つの間の類似点。AMD の新機能はdefine()
、モジュールがロードされる前にその依存関係を宣言できるようにする機能です。たとえば、定義は次のようになります。
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
したがって、CommonJS と AMD は、実装が異なるJavaScriptモジュール定義 API ですが、どちらも同じ起源から来ています。
- 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"; };
});