Javascript Underline.js_389;.模板导致来自Chrome扩展的错误

Javascript Underline.js_389;.模板导致来自Chrome扩展的错误,javascript,google-chrome-extension,underscore.js,Javascript,Google Chrome Extension,Underscore.js,如果我在Google Chrome扩展中使用's,控制台中会出现以下错误: 未捕获错误:此上下文不允许从字符串生成代码 有没有办法克服这个错误?非常感谢Chromium列表贡献者指出,要以下划线的方式创建函数对象,需要内容安全策略的选项包含“不安全评估” 例如,您的manifest.json可以是 { “清单版本”:2, ... “内容安全策略”:“脚本src'self”“不安全评估”, ... } 然后下划线行为会起作用,因为这个策略允许它。有关该格式的更多信息,请参阅有关该选项的Chrom

如果我在Google Chrome扩展中使用's,控制台中会出现以下错误:

未捕获错误:此上下文不允许从字符串生成代码


有没有办法克服这个错误?

非常感谢Chromium列表贡献者指出,要以下划线的方式创建
函数
对象,需要
内容安全策略
选项包含“不安全评估”

例如,您的
manifest.json
可以是

{
“清单版本”:2,
...
“内容安全策略”:“脚本src'self”“不安全评估”,
...
}

然后下划线行为会起作用,因为这个策略允许它。有关该格式的更多信息,请参阅有关该选项的Chrome文档。

不幸的是,我认为您不能在Chrome扩展中使用下划线.js的uu.template(),至少在新的manifest.json版本2中是如此。同样的道理也适用于尝试使用

从Google Chrome扩展的页面:

没有任何机制可以放松对执行内联JavaScript的限制。特别是,设置包含不安全内联的脚本策略不会产生任何效果。这是故意的


我将研究其他模板引擎,希望它们不会使用新函数对象。

清单v2限制,如上所述,禁止使用Eval、新函数和内联脚本-即使在玩内容安全策略时:在v2扩展中

大多数模板库在某种程度上使用evals。 一种解决方案是重写扩展,使所有逻辑都驻留在javascript中,而不驻留在模板中;在这种情况下,这样的解决方案应该是可用的

但是,在清单中有执行Eval和new函数的选项,例如,清单中有以下行:

"sandbox": {
    "pages": [
      "page1.html",
      "directory/page2.html"
    ]
},
沙盒页面将无法访问扩展或应用程序API,也无法直接访问非沙盒页面(它可能通过postMessage()与其通信)。您可以使用特定CSP进一步限制沙箱权限

现在,Google Chrome团队提供了一个完整的示例,说明如何通过与沙盒iframe以及

希望有一些库会使用这种机制来提供与标准模板用法的完全兼容性,尽管出于性能原因,我建议从模板中删除尽可能多的逻辑


多亏了谷歌,我们的产品阵容中出现了大量的扩展重写:(

谷歌刚刚发布了一份新的文档,讨论这个问题的解决方案


您可以使用jQuery的
$(“”)
构造编写自己的模板迷你引擎

清洁方式:

function myElement(text) {
  var d = $('<div class="abc"/>');
  d.text(text);
  return d;
}

myElement('my text').appendTo(domParent);
函数myElement(文本){
变量d=$('');
d、 文本(文本);
返回d;
}
myElement(“我的文本”).appendTo(domParent);
肮脏的方式:

var yourTemplate = '<div>${somevar}</div>';

function instTemplate(tmpl, text) {
  return $(tmpl.replace(/\$\{somevar\}/g, text));
}

instTemplate(yourTemplate, 'your text').appendTo(domParent);
var-yourTemplate='${somevar}';
函数模板(tmpl,文本){
返回$(tmpl.replace(/\$\{somevar\}/g,text));
}
instTemplate(你的模板,'你的文本').appendTo(domParent);

例如,使用脏方法重写简单的jquery.tmpl模板非常快,如果你知道替换的数据是无害的,等等。

我使用
下划线.js
因为我想要
主干.js
作为我的Chrome扩展,我只是将模板引擎更改为
mustach
~如果你有同样的原因,你可以也可以使用下划线.js作为主干,但不要使用
\uuu.template()
函数。

链接失效,我不知道如何添加“不安全评估”,chrome一直拒绝我尝试的一切。你能给你的答案添加一个例子吗?谢谢。下面是一个将不安全评估添加到清单的例子。json:谢谢!我还发现chrome extensions v2不安全评估目前不起作用。正在进行讨论关于在此处接受不安全评估或将其禁用(问题的当前状态为wontfix):无法从“/home/Envs/todolist”加载扩展。“内容安全策略”的值无效。我收到了上述错误。我创建了一个超级基本的示例来说明如何执行此操作:您可能还会看到
由于内容安全策略而拒绝执行内联脚本。X-WebKit-CSP:script src'safe eval';使用
Mustache
而不是下划线的
模板对我来说是最简单的解决方案。是的,
Mustache
可以+1内联脚本限制只适用于出现在HTML页面内的JS(即“内联”JS)。您可以通过将以前内联的JS放入自己的.JS文件中,并通过脚本标记或其他机制加载它来绕过上面引用的特定内容。换句话说,您引用的内容似乎不适用于不安全的评估问题。具体而言,链接现在已失效