0

私は次のようにアーモンドで使用するために特定のモジュールをシムしようとしています:

<script>
requirejs.config({
  shim: {
    'jQuery': { exports: 'jQuery' },
  //etc.
</script>

特定のスクリプトが既に含まれているためです。ただし、このコード:

require(['jQuery', function($) {

});

「未定義の不足しているjQuery」という結果になります。jQuery を次のようにシムすると:

define('jQuery', function() {
  return jQuery;
});

できます。

AMD で新しいコンポーネントを開発できるように、almond.js を既存の Web ソフトウェアにドロップするだけです。新しいモジュール用に既存のグローバルをシムしたいと考えています。

シムはビルド時にのみ解決され、ビルドは上記で行っていることとまったく同じであると推測していますが、それは正しいですか?

4

1 に答える 1

1

jQuery の名前は「jquery」にハードコーディングされています。これを逸脱すると大変なことになります。しかし、それはあなただけの問題ではありません。

使用することは、モジュール名でshim呼び出すことと同じではありません。define質問のように使用するとshim、その名前のモジュールが存在し、そのモジュールがロードされると、RequireJS は変数の値をモジュール値として返す必要があることをローダーに伝えます。強調されたテキストは重要です。ローダーは、という名前のモジュールをフェッチしてロードします。jQueryjQueryjQuery

define質問に表示される は、通常、 への呼び出しと一緒に、その直前または直後に配置されますrequire.config。これは、という名前のモジュールを宣言しますjQuery。モジュールは既にあるため、ローダーがこのモジュールを取得する必要がある場合、フェッチするものはありません。これは、アーモンドに関しては重要な違いです。

アーモンドには制限があり、そのうちの 1 つは次のとおりです。

すべてのモジュールを 1 つのファイルに最適化します --動的なコードの読み込みはありません。

(強調を追加)この回答で使用した用語を使用すると、これは「フェッチなし」を意味します。define通話を使用する場合は、問題ありません。を使用する場合shimモジュールを 1 つのファイルに最適化しない限り、ローダーはモジュールを取得しようとする必要があります。アーモンドにはそれができません。

于 2015-05-04T10:44:37.573 に答える