13

Chrome API 的 Manifest 版本 2 删除了执行 unsafe-eval 的功能。这意味着使用 eval 函数或通常从文本动态创建函数。

似乎大多数(如果不是全部)Javascript 模板引擎都这样做。我正在使用 Jaml,但我尝试了其他几个,如主干.js(它真的使用 underscore.js 的模板引擎),但没有运气。

对 Chromium 项目的评论似乎表明,有很多库受此影响。

我认为 Angular.js 有一个 CSP 安全模式,但是 Angular.js 对于我们需要的来说实在是太大了。我们只需要一个相当基本的模板引擎,不需要模型或控制器等。有谁知道那里有任何与 CSP 兼容的模板引擎吗?

4

2 回答 2

8

此问题的最佳解决方案是在部署扩展之前预编译模板。handlebarsjseco都提供预编译功能。我实际上写了一篇更深入的博客文章。

于 2012-07-18T23:20:10.660 回答
4

对于中型和大型模板,您绝对应该使用 Mathew 推荐的预编译。对于极小的模板,我们使用这个:

var template = function(message, data) {
  if (typeof data === 'undefined') {
    return _.partial(template, message);
  } else {
    return message.replace(/\{\{([^}]+)}}/g, function(s, match) {
      var result = data;
      _.each(match.trim().split('.'), function(propertyName) {
        result = result[propertyName]
      });
      return _.escape(result);
    });
  }
};

var data = {
  foo: 'Hello',
  bar: { baz: 'world!' }
};

// print on-the-fly
template('{{foo}}, {{bar.baz}}' args); // -> 'Hello, world!'

// prepare template to invoke later
var pt = template('{{foo}}, {{bar.baz}}');
pt(args); // -> 'Hello, world!'

此实现不使用 eval,但需要下划线。

于 2013-12-12T13:15:38.393 回答