Расширения Google Chrome с помощью manifest_version: 2
ограничены использованием eval
или new Function
. Все библиотеки шаблонов JavaScript, которые я проверил (mustachejs, underscorejs, jQuery template, hoganjs и т.д.), Используют new Function
. Есть ли те, которые достаточно зрелы и поддерживаются, которые не используют?
Библиотека шаблонов JavaScript, которая не использует eval/new Function
Ответ 1
Оказывается, что усатые добавили new Function
в последнее время, и использование тега 0.4.2 не имеет его. Это API немного отличается от Mustache.to_html
вместо Mustache.render
и, вероятно, некоторое снижение производительности.
I открыла проблему, чтобы потенциально удалить new Function
в будущей версии.
Ответ 2
Похоже, что Pure использует либо eval
, либо new Function
.
Ответ 3
Closure Templates - это библиотека шаблонов, которая не использует eval
. Шаблоны скомпилированы на JavaScript раньше времени, так что то, что входит в ваше приложение, - это простой .js файл, который не должен запускаться в CSP-проблемы.
Ответ 4
Distal шаблон не использует eval.
Ответ 5
Ответы здесь устарели, поэтому я публикую обновление.
С сентября Google изменил свою политику и разрешил unsafe-eval
в манифесте 2 расширения. См. этот поток и эта страница.
Поэтому библиотеки, использующие eval()
, new Function()
и т.д., могут использоваться, если для ваших расширений включено unsafe-eval
.
Ответ 6
Лучшим решением этой проблемы является предварительная компиляция ваших шаблонов перед развертыванием вашего расширения. Оба handlebarsjs и eco предлагают предварительную компиляцию как особенность. Я на самом деле написал сообщение в блоге, которое углубляется.
Ответ 7
Это действительно зависит от того, что вы подразумеваете под "библиотекой шаблонов". Если вам просто нужна строка-интерполяция, нет необходимости в eval
или new Function
, когда вы начинаете нуждаться в встроенных структурах циклов, все усложняется.
Несколько месяцев назад я написал String.prototype.tmpl.js
script, который я использовал пару раз здесь и там в местах, где я не против переопределения 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
script может, конечно, быть изменена, чтобы использовать фрагменты документа для фактического создания элементов DOM, но как есть, я не уверен, считается ли это как "библиотека шаблонов".
Ответ 8
Возможно, вы можете написать функцию eval1:
function eval1(blah) {
var s = document.createElement("script");
s.src = blah;
document.head.appendChild(s);
document.head.removeChild(s);
}
и выполните поиск/замену в библиотеке, которую вы хотите, но это будет обман, правильно?
Ответ 9
Недавно я столкнулся с той же проблемой. После обновления версии манифеста мое расширение перестало работать. Я попробовал Mustache, но не смог отобразить индекс массива и имена свойств объекта. Поэтому мне пришлось создать свою собственную простую, но эффективную библиотеку шаблонов Ashe, которая свободна от eval
и new Function
. Надеюсь, это поможет кому-то.
Ответ 10
https://developer.chrome.com/extensions/sandboxingEval
Не уверен, когда он был добавлен, но теперь вы можете использовать песочницу в стиле Firefox в Chrome. Я переношу расширение Firefox, поэтому мне это нужно (поскольку у меня нет evalInSandbox: P)