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コメント正規表現リテラルを無視する別の正規表現に切り替えると、問題は解決しますか?もしそうなら、その正規表現はどのように見えるでしょうか?