3

私はRequireJSr.jsオプティマイザーを使用して、本番対応のアプリを構築しています。require()変数を呼び出しに渡すと、すべてが期待どおりに機能することに気付きました。

var someDependencies = ["dependency-1", "dependency-2", "dependency-3"];
require(someDependencies);

ただし、オプティマイザーを実行すると、依存関係は変数から読み取られないため、連結されたアプリ スクリプトには含まれません。私が理解しているように、これは呼び出しr.js内で文字列リテラルを検索するためです。require()JavaScript を処理しないため、変数は何の意味もありません。これはr.js のドキュメントにも記載されています。

オプティマイザーは、最上位の require および define 呼び出し、または単純化された CommonJS ラッピングでの require('name') 文字列リテラル呼び出しに渡される文字列リテラルの配列で指定されたモジュールのみを結合します。そのため、変数名を介してロードされたモジュールは見つかりません。

私の質問は次のとおりです。変数をrequire()呼び出しに渡すことができるように、これを克服する方法はありますか?

4

1 に答える 1

3

プログラムでオプティマイザーに渡す前に、ソースを変更します。ビルド構成で次を指定します。

onBuildRead: function (moduleName, path, contents) {
    // modify contents here
    return contents;
}

これは、オプティマイザがソースの処理を開始する前に呼び出されます。その後、依存関係を一致させて置き換えることができます。シンプルなコンセプト:

var content = 'var someDependencies = ["dependency-1", "dependency-2", "dependency-3"];\n' +
    'require(someDependencies, function(){\n' +
    '  });';

var varName = /require\((\w+)/.exec(content)[1];
var regex = new RegExp(varName + '\\s*=\\s*(\\[.*\\])');
var dependencies = regex.exec(content)[1];
var modifiedContent = content.replace('require(' + varName, 'require(' + dependencies);

console.log(modifiedContent);

FIDDLERデモを参照してください。

于 2013-05-24T20:36:10.880 に答える