CommonJSに関する注意点
- はじめに§ 1
- 手動変換§ 2
- 変換ツール§ 3
- エクスポート値の設定§ 4
- 代替構文§ 5
- CommonJSパッケージからのモジュールの読み込み§ 6
- 最適化ツール§ 7
はじめに§ 1
CommonJSはモジュール形式を定義しています。残念ながら、ブラウザを他のJavaScript環境と同等に扱うことなく定義されました。そのため、トランスポート形式と非同期requireに関するCommonJS仕様の提案があります。
RequireJSは、依存関係を参照するために文字列名を使用し、モジュールがグローバルオブジェクトを定義することを避けるというCommonJSの精神を維持しようとしますが、それでもブラウザでネイティブにうまく機能するモジュール形式のコーディングを可能にします。RequireJSは、非同期モジュール定義(以前のTransport/C)の提案を実装しています。
従来のCommonJSモジュール形式のモジュールがある場合、RequireJSで動作するように簡単に変換できます。すべてのモジュールが新しい形式にきれいに変換されるわけではありません。うまく変換されない可能性のあるモジュールの種類:
- 条件付きコードを使用してrequire呼び出しを行うモジュール。例:if(someCondition) require('a1') else require('a2');
- いくつかの種類の循環依存関係。
手動変換§ 2
変換するモジュールが数個しかない場合は、モジュールを次のコードでラップするだけです。
define(function(require, exports, module) {
//Put traditional CommonJS module content here
});
重要:関数引数は常に **require, exports, module** として、正確にこれらの名前で、この正確な順序でリストする必要があります。そうでない場合、混乱が生じます。リストからexportsとmoduleを省略できますが、必要な場合は、ここに示されている正確な順序で指定する必要があります。
変換ツール§ 3
変換するモジュールが多い場合は、r.jsプロジェクトにr.jsファイルに組み込まれたコンバーターツールがあります。変換するディレクトリへのパスと出力ディレクトリを指定します。
node r.js -convert path/to/commonjs/modules/ path/to/output
少数のCommonJSモジュールは、define() でラップされたモジュールとしてはうまく機能しません。詳細はr.jsのREADMEを参照してください。
エクスポート値の設定§ 4
エクスポートされた値をmodule.exportsとして割り当てることでエクスポートされた値を設定できるCommonJSシステム(主にNode)があります。そのイディオムはRequireJSでサポートされていますが、別のより簡単な方法があります。**define**に渡された関数から値を返すだけです。
define(function (require) {
var foo = require('foo');
//Define this module as exporting a function
return function () {
foo.doSomething();
};
});
この方法では、通常、exportsおよびmodule関数引数は必要ないため、モジュール定義から省略できます。
代替構文§ 5
define() に渡された関数内でrequire() を使用して依存関係を取得する代わりに、define() に依存関係配列引数として指定することもできます。依存関係配列内の名前の順序は、define() に渡された定義関数に渡された引数の順序と一致します。そのため、モジュール **foo** を使用する上記の例は
define(['foo'], function (foo) {
return function () {
foo.doSomething();
};
});
その構文の詳細については、APIドキュメントを参照してください。
CommonJSパッケージからのモジュールの読み込み§ 6
CommonJSパッケージ内のモジュールは、場所とパッケージ属性を知るようにRequireJS構成を設定することで、RequireJSによってロードできます。詳細はパッケージAPIセクションを参照してください。