2012-06-11 8 views
37

私たちは開発中にRequireJSとAMDを愛用しています。ここでモジュールを編集し、ブラウザでリロードしてすぐに結果を見ることができます。しかし、モジュールを1つのファイルに結合して実稼動環境を構築するときには、ローダーがRequireJSかそれとも小さいパートナー "アーモンド"であるかにかかわらず、ここに説明されているAMDローダーが存在する必要があります。連結されたRequireJS AMDモジュールにローダーが必要なのはなぜですか?

http://requirejs.org/docs/faq-optimization.html#wrap

私の混乱は:なぜローダーが必要なのですか?モジュール内でrequire()コールを行う必要がある非常に珍しい状況がない限り、一連のAMDモジュールをローダーなしで連結することができます。最も簡単な例は、次のようなモジュールのペアです。

ModA.js:

define([], function() { 
    return {a: 1}; 
}); 

ModB.js:これら二つのモジュールを考える

define(['ModA'], function(A) { 
    return {b : 2}; 
}); 

、結合演算子は、単に負担本番サーバ次のテキストを生成し、できなかったようですかRequireJSまたはAlmondのいずれかによって必要とされる余分な帯域幅または計算を備えたブラウザ。

私は、生成し(と私は上記の二つのモジュールからのスニペットが挿入されている場所を示すために、«»山形引用符を使用しています)連結子想像:

これまでのところ、私はできる限りこれを、 AMDのセマンティクスを正しく再現し、余分なグルーJavaScriptを最小限に抑えることができます。そのような連結子が利用可能ですか?そうでない場合は、私が書く必要があると思うのは愚かなのでしょうか?define()で書かれたシンプルでクリーンなモジュールで構成され、後でrequire()を呼び出す必要がないコードベースは、

+1

この問題をどうやって解決しましたか?私は、アーモンドを使用して、最小ファイルが3K、次に連結ファイル(9K対6K)が大きいことが分かった。 – Naor

答えて

14

AMDオプティマイザは、ダウンロードするファイル数よりも最適化する範囲があります。また、メモリにロードされたモジュールの数を最適化することもできます。

たとえば、10個のモジュールがあり、1個のファイルに最適化できる場合は、9個のダウンロードを保存しています。

Page1が10個のモジュールをすべて使用している場合、それは素晴らしいことです。しかし、もしPage2が1を使うのであれば? AMDローダは、モジュールがrequire 'になるまで、「ファクトリ関数」の実行を遅延させることができます。したがって、Page2は、実行する単一の「ファクトリ関数」をトリガするだけです。

各モジュールがrequireの時に100kbのメモリを消費する場合、実行時最適化を持つAMDフレームワークもPage2に900kbのメモリを節約します。

この例は、[About Box]スタイルダイアログです。 99%のケースではアクセスされないため、実行が非常に遅い場合は非常に遅くなります。例えば。 (緩いjQueryの構文で):

aboutBoxBtn.click(function() { 
    require(['aboutBox'], function (aboutBox) { 
     aboutBox.show(); 
    } 
}); 

あなたはそれが必要だと確信しているまで「についてボックス」でJSオブジェクトとDOMの関連を作成するための費用を節約。

詳細については、を参照してください。独立したモジュールをキャッシュするメリットがありますので、あなたはセクション全体のモジュールを使用する場合

+1

面白い!だから、あなたが何を言っているのか分かっていれば、オブジェクトを作成し、DOM *を単に必須の副作用として修正するコードを置いています*、それは正しいのですか?私はそのことを考えていないでしょう。もしその実践が一般的であれば、JSコーディング担当者がAMDローダーを生産しているような理由にうってつけかもしれません。おそらく私のPythonの背景のために、私のコードはインポート時に実行されることはありません。それは、副作用が最終的に必要になったときに呼び出す関数でいっぱいのオブジェクトを返します。 –

+0

メモリ使用に関するあなたの例は、I/Oオーバーヘッドによって混乱させられることがよくあります。以前のようにロードすると勝つが、初期化を遅らせるようなボックスの場合、大きなインタラクティブなレイテンシヒットなしにメモリとセットアップを節約できます。 –

+0

@Chris、私はあなたの意見に同意しましたが、実行時にAMDローダーが存在するケースを提示したかっただけです。私は起動時に実行するコードが多すぎることを心配するかもしれませんが、あなたは待ち時間を心配するかもしれません。軽度の場合を除けば、私はパフォーマンスになると、一応の大きさはないと思います。そして私の例では、すべてのJSがロードされているので、レイテンシヒットはありませんでした。単に実行されませんでした。 –

1

唯一の本当の利点があります。

0

あなたは生産のための単一の大きなファイルにrequire.jsでコーディングしてコンパイルする場合には、あなたは完全に必要と交換するalmond.jsを使用することができます。

アーモンドのみモジュールの参照の管理ではない、もはや必要とされているロード自体を処理します。

restrictionsアーモンドのように注意してくださいは

0

は、あなたが提案する一つとして、ビルド・ツールは存在しない理由はありませんが動作するために課しています。

私は、オプティマイザの出力を見て*最後の時間は、それが明示的にモジュールを命名するためのモジュールを変換した後、一緒にそれらを連結。それは、ファクトリ関数が正しい順序で呼び出され、適切なモジュールオブジェクトが渡されたことを確認するためにrequire自体に依存していました。あなたが望むようなツールを構築するには、モジュールを明示的に線形化する必要があります。不可能ではありませんが、もっと多くの作業が必要です。それはおそらくそれが行われていない理由です。

私は、オプティマイザが自動的に一つだけのダウンロードを持っている必要がありますように、構築されたファイルに自身(またはアーモンド)が必要含めるする機能を持っていること**信じています。それはあなたが望むビルド・ツールの出力よりも大きいでしょうが、そうでなければ同じです。

あなたが求めている種類の出力を生成するビルドツールがある場合は、同期の場合はrequireの場合はもっと慎重にしなければならず、返品の代わりにexportsを使用し、その他のCommonJS互換特徴。

*数年前です。 2010年、私は思う。

**しかし、今は見つからないようです。

1

私は同じ必要性があったので、その目的のために単純なAMD "コンパイラ"を作成しました。あなたはそれが欠けている多くの機能を持っていることに注意してくださいhttps://github.com/amitayh/amd-compiler

でそれを得ることができますが、それは(私のために少なくとも)仕事をしていません。コードベースに貢献してください。

関連する問題