我有一个Backbone应用程序,使用Require.js组织成模块。其中一个模块包含一个Handlebars帮助器,它有一个方法,用于从每个View的所有HTML模板中提取合法标头。标题包含在HTML注释中,因此我使用以下正则表达式将其删除:
/<!--[\s\S]*?-->/g
现在,当我使用r.js优化(连接/编译/缩小)应用程序时,我正在使用r.js的onBuildWrite()
方法执行相同的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配置中启用uglification时,这似乎不起作用; 正则表达式STILL似乎在整个构建的脚本上运行,包括帮助程序,导致构建爆炸。
如果在r.js配置中禁用了uglify,一切正常。
任何人都有任何想法为什么uglify会打破这个?将切换到不同的正则表达式,这将捕获HTML注释,但IGNORE HTML注释正则表达式文字,解决问题?如果是这样,那正则表达式是什么样的?
答案 0 :(得分:1)
将正则表达式更改为:
var htmlCommentRegex = /[<]!--[\s\S]*?-->/g;
就RE处理器而言,单字符[<]
类相当于<
,但现在RE不再匹配自身。
另一种方法是转义RE中的一个文字字符:
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');
希望它没有做足够的代码分析来撤消这种混淆。