不使用eval / new函数的JavaScript模板库

时间:2012-05-24 20:24:44

标签: javascript templates google-chrome-extension eval

使用manifest_version: 2限制使用evalnew Function的Google Chrome扩展程序。我检查的所有JavaScript模板库(mustachejs,underscorejs,jQuery模板,hoganjs等)都使用new Function。有没有相当成熟和支持不使用它们?

Info about the security restrictions

10 个答案:

答案 0 :(得分:5)

事实证明,mustachejs最近添加了new Function并且使用tag 0.4.2没有它。它与Mustache.to_html而不是Mustache.render略有不同,可能会有一些性能降低。

opened an issue可能会在将来的版本中删除new Function

答案 1 :(得分:3)

Pure似乎不使用evalnew Function

答案 2 :(得分:3)

这里的答案已经过时,所以我发布了更新。

自9月以来,Google改变了他们的政策,并在清单2扩展中允许unsafe-eval。请参阅this threadthis page

如果为您的扩展启用了eval(),则可以使用new Function()unsafe-eval等库。

答案 3 :(得分:2)

Closure Templates是一个不使用eval的模板库。模板会提前编译为JavaScript,因此应用程序中包含的内容是一个简单的.js文件,不应该遇到CSP问题。

答案 4 :(得分:2)

Distal模板不使用eval。

答案 5 :(得分:2)

这实际上取决于“模板库”的含义。如果你只是想要字符串插值,那么就不需要evalnew Function,当你开始需要嵌入式循环结构时,事情变得更加复杂。

几个月前,我写了一篇String.prototype.tmpl.js script,我曾在这里和那里使用了几次,我不介意覆盖String.prototype。作为静态函数,您可以使用:

<子> tmpl.js:
function tmpl(tmpl, o) {
    return tmpl.replace(/<%=(?:"([^"]*)"|(.*?))%>/g, function (item, qparam, param) {
        return o[qparam] || o[param];
    });
}
示例模板:
<div id="bar"></div>
<script type="text/x-tmpl" id="foo">
    <h1><%=title%></h1>
    <p><%=body%></p>
</script>
<script>
    (function () {
        var foo,
            bar;
        foo = document.getElementById('foo');
        bar = document.getElementById('bar');
        bar.innerHTML = tmpl(foo.innerHTML, {
            title: 'foo bar baz',
            body: 'lorem ipsum dolor sit amet'
        });
    }());
</script>

基本tmpl脚本当然可以被修改以利用文档片段来实际构建DOM元素,但是我不确定它是否算作“模板库”。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

也许你可以写一个函数eval1:

function eval1(blah) {
    var s = document.createElement("script");
    s.src = blah;
    document.head.appendChild(s);
    document.head.removeChild(s);
}

并在您想要的库中进行查找/替换,但这是作弊,对吗?

答案 8 :(得分:0)

我最近遇到了同样的问题。更新清单版本后,我的扩展程序停止工作我尝试过Mustache但它无法呈现数组的索引和对象属性的名称。因此,我必须创建自己的简单但有效的模板库Ashe,它不含evalnew Function。希望它会帮助别人。

答案 9 :(得分:0)

https://developer.chrome.com/extensions/sandboxingEval

不确定何时添加,但您现在可以在Chrome中使用Firefox样式的沙盒。我正在移植我的Firefox扩展程序,所以我需要这个(因为我没有evalInSandbox:P)