谷歌浏览器扩展使用manifest_version: 2
被限制使用eval
或new Function
。我检查的所有 JavaScript 模板库(mustachejs、underscorejs、jQuery 模板、hoganjs 等)都使用new Function
. 有没有相当成熟和支持但不使用的?
10 回答
Pure似乎没有使用eval
或new Function
。
Closure Templates是一个模板库,它不使用eval
. 模板会提前编译为 JavaScript,因此您的应用程序中包含的内容是一个纯 .js 文件,不应遇到 CSP 问题。
这真的取决于你所说的“模板库”是什么意思。如果您只想要字符串插值,则不需要eval
or new Function
,当您开始需要嵌入式循环结构时,事情会变得更加复杂。
几个月前,我编写了一个String.prototype.tmpl.js
脚本,在我不介意覆盖String.prototype
. 作为静态函数,您可以使用:
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 元素,但我不确定它是否算作“模板库”。
远端模板不使用 eval。
此问题的最佳解决方案是在部署扩展之前预编译模板。handlebarsjs和eco都提供预编译功能。我实际上写了一篇更深入的博客文章。
https://developer.chrome.com/extensions/sandboxingEval
不确定何时添加,但您现在可以在 Chrome 中进行 Firefox 风格的沙盒。我正在移植我的 Firefox 扩展,所以我需要这个(因为我没有 evalInSandbox :P)
也许你可以写一个函数 eval1:
function eval1(blah) {
var s = document.createElement("script");
s.src = blah;
document.head.appendChild(s);
document.head.removeChild(s);
}
并在您想要的库中查找/替换,但那是作弊,对吧?
我最近遇到了同样的问题。更新清单版本后,我的扩展程序停止工作。我尝试了 Mustache,但它无法呈现数组的索引和对象属性的名称。所以我必须创建自己的简单但有效的模板库Ashe,它没有eval
和new Function
. 希望它会帮助某人。