41

ブラウザで実行されるJavascriptを含むJavascriptの一般的なコンポーネントパターンとして使用してみませんか?

一見すると、私が現在取り組んでいるプロジェクトをモジュール化するのに良い方法のようです。このプロジェクトは、多数のコンポーネントを備えた大規模なJavascriptコードベースで構成されており、その一部は相互に作用します。

4

1 に答える 1

73

CommonJSは、いくつかの注意点がありますが、ブラウザーに間違いなく適しています。CommonJSモジュールパターンは(私の偏見では)非常に優れており、ECMAScript Harmony(JavaScript言語の次のリリースで計画されている)用に提案されたモジュールシステムへの良い足がかりにもなります。具体的には、Harmonyモジュールはグローバル(「ウィンドウ」)オブジェクトにアクセスできません。

CommonJSモジュールがブラウザに適していないという人がいる理由は、サーバー側の支援なしでは<script>タグを介してロードできないためです。たとえば、「convertToHTML」関数をエクスポートするマークダウンライブラリがあるとします。次に、次のようなモジュールを作成できます。

var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
    // do something then call convertToHTML
}

これは、いくつかの理由でスクリプトタグを介して機能しません(スコープがラップされていないため、convertToHTMLがウィンドウにアタッチされ、requireは通常定義されず、エクスポートはモジュールごとに個別に作成する必要があります)。

サーバー側のヘルプが少しあるクライアント側のライブラリを使用すると、スクリプトタグを介してこれを簡単に読み込むことができます。または、XMLHttpRequestを介してスクリプトをロードし、eval()を実行するクライアント側ライブラリも機能しますが、デバッグエクスペリエンスはそれほど良くないことがよくあります。

現時点でかなり合理的な解決策は、CommonJSメンバー間で論争の的となっているものですが、RequireJSです。RequireJSを使用すると、次のようにモジュールを作成できます。

define(function(require, exports, module) {

var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
    // do something then call convertToHTML
}

});

モジュールの周りにそのdefine()ビットを追加するだけでした。(サーバーにそれを非常に簡単に実行させることができるので、定義部分を手動で入力する必要さえありません)。

私は現在、いくつかのプロジェクトでRequireJSを個人的に使用しており、サーバー側のビットなしでCommonJSモジュールを使用する簡単な方法を見つけました。他にも多くの解決策があり、静的JSファイルの実行に依存していない場合は、標準のCommonJSモジュールが最適な方法です。

(ObDisclaimer:CommonJSプロジェクトを開始したので、明らかに偏見があります。)

于 2011-01-24T04:39:41.810 に答える