20

tl;dr: すべてのテキスト依存関係がインライン化されている場合、最適化されたファイルから text.js プラグインを除外するにはどうすればよいですか?

Require.js オプティマイザー(Node 経由) を使用して、プロジェクト内の JS ファイルの一部を最適化しています。テキスト プラグインを使用して、テキストの依存関係 (HTML テンプレート、CSS) を読み込みます。次のように、依存関係を含めて最適化したいモジュールがあります。

define(['text!core/core.css'], function(styles) {
    // do setup stuff, return an object
});

Require.js のドキュメントには、オプティマイザーcore/core.cssを実行するとファイルがインライン化されると書かれており、次のr.jsように呼び出しています。

$ r.js -o baseUrl=./src name=core out=release/test.js

Tracing dependencies for: core
Uglifying file: c:/path/release/test.js

c:/path/release/test.js
----------------
c:/path/src/text.js
text!core/core.css
c:/path/src/core.js

良いニュースは、これが機能することです。最適化されたファイルを見ると、次のようなインライン テキストが表示されます。

define("text!core/core.css",[],function(){return"some CSS text"}),
define("core",["text!core/core.css"],function(a){ ... })

悪いニュースは、text.js プラグインも含まれていることです。約 3K 追加され、(私が知る限り) 外部テキスト ファイルをロードするための完全に不要なコードで構成されています。3K がそれほど多くないことはわかっていますが、コードを高度に最適化するように努めています。テキストの依存関係がインライン化されている場合、テキスト プラグインのコードはまったく必要ないことを理解しています。呼び出しに追加することでテキスト プラグインをexclude=text除外r.jsできますが、そうすると、ブラウザーで最適化されたコードを使用しようとすると、text.js プラグインを読み込めないというエラーが表示されます。

そう:

  1. ここで text.js プラグインが実際に必要な理由はありますか?

  2. そうでない場合、この動作を修正できる構成オプションはありますか、またはr.js

  3. 不要なプラグインが読み込まれていることを Require.js に納得させるために含めることができる、text.js プラグイン用の簡単な shimはありますか?

4

1 に答える 1

15

RequireJSはnormalize、適切なモジュールIDを取得する前に、プラグインがメソッドを実装しているかどうかを確認する必要があるため、テキストプラグインは本当に必要です。

ビルドからテキストプラグインを削除する方法はonBuildWrite、この問題のコメントで説明されているように、設定を使用して空のプラグインモジュールを作成することです:https: //github.com/jrburke/r.js/issues/116#issuecomment-4185237-この機能は、r.jsの将来のバージョンに搭載される予定です。

編集:

r.jsには、stubModulesまさにそれを行うという設定があります。

//Specify modules to stub out in the optimized file. The optimizer will
//use the source version of these modules for dependency tracing and for
//plugin use, but when writing the text into an optimized layer, these
//modules will get the following text instead:
//If the module is used as a plugin:
// define({load: function(id){throw new Error("Dynamic load not allowed: " + id);}});
//If just a plain module:
// define({});
//This is useful particularly for plugins that inline all their resources
//and use the default module resolution behavior (do *not* implement the
//normalize() method). In those cases, an AMD loader just needs to know
//that the module has a definition. These small stubs can be used instead of
//including the full source for a plugin.
stubModules : ['text']

その他のr.jsオプションについては、example.build.jsファイルを確認してください。

于 2012-04-18T16:23:38.630 に答える