0

Require.jsを使用してモジュールに編成されたバックボーンアプリケーションがあります。これらのモジュールの1つには、Handlebarsヘルパーが含まれています。このヘルパーには、各ビューのすべてのHTMLテンプレートから正当なヘッダーを取得するために使用するメソッドがあります。ヘッダーはHTMLコメントに含まれているので、次の正規表現を使用してヘッダーを削除します。

/<!--[\s\S]*?-->/g

ここで、r.jsを使用してアプリケーションを最適化(連結/コンパイル/縮小)すると、onBuildWrite()r.jsのメソッドを使用してHTMLコメントの同じ削除を実行します。

onBuildWrite: function (moduleName, path, contents) {
    var htmlCommentRegex = /<!--[\s\S]*?-->/g;

    return contents.replace(htmlCommentRegex, "");
},

残念ながら、これは、Handlebarsヘルパーを含むRequire.jsモジュールがr.js最適化ビルドにプルされると、ヘルパー内の正規表現リテラルが削除され、r.jsビルド全体が爆破されることを意味します。

onBuildWrite()ヘルパーを除くすべてのモジュールに正規表現を選択的に適用することで、問題を解決しようとしました。

onBuildWrite: function (moduleName, path, contents) {
    var htmlCommentRegex = /<!--[\s\S]*?-->/g;

    if (moduleName !== "helpers/handlebars.compileClean") {
        contents = contents.replace(htmlCommentRegex, "");
    }

    return contents;
},

ただし、r.js構成で醜化が有効になっている場合、これは機能しないようです。正規表現は、ヘルパーを含むビルドされたスクリプト全体で実行されているようで、ビルドが爆破されます。

r.js構成でuglifyが無効になっている場合、すべてが正常に機能します。

uglifyがこれを壊す理由を誰かが知っていますか?HTMLコメントをキャプチャするがHTMLコメント正規表現リテラルを無視する別の正規表現に切り替えると、問題は解決しますか?もしそうなら、その正規表現はどのように見えるでしょうか?

4

1 に答える 1

1

正規表現を次のように変更します。

var htmlCommentRegex = /[<]!--[\s\S]*?-->/g;

単一文字クラスは、REプロセッサに関する限り[<]同等ですが、REはそれ自体と一致しなくなりました。<

もう1つの方法は、REのリテラル文字の1つをエスケープすることです。

var htmlCommentRegex = /<\!--[\s\S]*?-->/g;

または、文字列からREを構築することもできます。

var htmlCommentRegex = new RegExp('<!'+'--[\s\S]*?-->', 'g');

r.jsがこれらすべてを最適化して元のテキストに戻す場合は、次のことを試してください。

var commentPrefix = '<!';
var htmlCommentRegex = new Regexp(commentPrefix+'--[\s\S]*?-->', 'g');

うまくいけば、この難読化を元に戻すのに十分なコード分析が行われないでしょう。

于 2013-02-07T01:39:07.867 に答える