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 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の精神(主にモジュール識別子)を維持しようとします。
さらに困惑させるのは、AMD実装であるRequireJSがCommonJSラッパーを提供するため、CommonJSモジュールをほぼ直接インポートしてRequireJSで使用できるようにすることです。
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
これが説明を明確にするのに役立つことを願っています!