2012-04-17 4 views
20

tl; dr:すべてのテキスト依存関係がインライン展開されていると、最適化されたファイルからtext.jsプラグインを削除するにはどうすればよいですか?Require.jsオプティマイザが最適化されたファイルにテキストプラグインを含めないようにするにはどうすればよいですか?

Require.js optimizer(ノード経由)を使用して、プロジェクト内のいくつかのJSファイルを最適化しています。私はtext pluginを使ってテキストの依存関係(HTMLテンプレート、CSS)を読み込みます。私はこのように、私はその依存関係を含め、最適化するモジュールを持っている:

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

Require.jsドキュメントは私が起動していr.jsオプティマイザを実行するとcore/core.cssファイルがインライン化されることを言いますこのように:

$ 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はそれほどではありませんが、コードを高度に最適化しています。テキストの依存関係がインライン化されていれば、テキストプラグインのコードは必要ではありません。私はr.jsコールにexclude=textを追加してテキストプラグインを保つことができますが、そうした場合、ブラウザでtext.jsプラグインをロードできなかったことをブラウザで最適化したコードを使用しようとするとエラーが発生します。だから、

  1. がtext.jsプラグインが実際にここにを必要とする任意の理由がありますか?

  2. ない場合は、この動作を修正することができますr.jsため設定オプションがあり、または

  3. は私が必要と説得するために含めることができるtext.jsプラグインの簡単シムがあります。 jsは不要なプラグインが読み込まれていますか?

答えて

15

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

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

の将来のバージョンに着陸する必要があります

編集:

r.jsは今の設定はまさにそのことstubModules呼ばれています:もっとr.jsオペアンプについては

//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'] 

example.build.jsファイルを確認してください。

+0

よろしくお願いいたします。これを試してみます。本質的に答えは(3)シムを作ることです。私は自分のビルドプロセスでうまくいくことができます。 – nrabinowitz

+1

後継のために、私は 'define(" text "、{load:function {)}};'のようにshimを作成し、最適化されたファイルの先頭に追加しました。細かく動作すると思われる – nrabinowitz

+1

同じことが不思議でした。 'stubModules:['text']'は新しいバージョンのRequireJSでトリックを行います。 – superlukas

関連する問題