【发布时间】:2013-02-07 01:18:01
【问题描述】:
我有一个 Backbone 应用程序,它使用 Require.js 组织成模块。其中一个模块包含一个 Handlebars 帮助器,它有一个方法可以从我们所有的 HTML 模板中为每个视图提取一个合法的标题。标头包含在 HTML 注释中,因此我使用以下正则表达式将其剥离:
/<!--[\s\S]*?-->/g
现在,当我使用 r.js 优化(连接/编译/缩小)应用程序时,我正在使用 r.js 的 onBuildWrite() 方法执行相同的 HTML cmets 删除:
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 cmets 但忽略 HTML 注释正则表达式文字,解决问题吗?如果是这样,那个正则表达式会是什么样子?
【问题讨论】:
-
如何将 JS 注入 HTML?也许您的模式充当 HTML 注释...
-
注入我的 JS?抱歉,我没有关注。
-
我没有使用骨干网和其他东西,但你必须以某种方式将你的 javascript 加载到 html。
-
好吧,r.js 优化的最终结果是一个 JS 文件,而不是一个 HTML 文件,所以即使正则表达式文字充当 HTML 注释,我也不希望错误发生在帮助模块中正则表达式文字所在的确切位置。不过,我会再看一眼,记住这一点!
标签: javascript requirejs uglifyjs r.js