适用于Chrome内容安全策略的Javascript模板引擎

时间:2012-07-15 04:46:18

标签: javascript backbone.js google-chrome-extension content-security-policy jaml

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

似乎并非所有Javascript Templating Engines都这样做。我正在使用Jaml,但我尝试了其他几个像backbone.js(它真正使用了underscore.js的模板引擎)而没有运气。

This comment on the Chromium project似乎表明有很多图书馆受此影响。

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

2 个答案:

答案 0 :(得分:7)

此问题的最佳解决方案是在部署扩展程序之前预先编译模板。 handlebarsjseco都提供预编译作为功能。我实际上写了一篇更深入的blog post

答案 1 :(得分: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,但需要使用下划线。

相关问题