0

我有一个 Backbone 应用程序,使用 Require.js 组织成模块。其中一个模块包含一个 Handlebars 帮助器,它有一个方法可以从我们所有的 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 注释但忽略 HTML 注释正则表达式文字,解决问题吗?如果是这样,那个正则表达式会是什么样子?

4

1 回答 1

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');

希望它没有做足够的代码分析来消除这种混淆。

于 2013-02-07T01:39:07.867 回答