Библиотека шаблонов JavaScript, которая не использует eval/new Function

Расширения Google Chrome с помощью manifest_version: 2 ограничены использованием eval или new Function. Все библиотеки шаблонов JavaScript, которые я проверил (mustachejs, underscorejs, jQuery template, hoganjs и т.д.), Используют 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. В качестве статической функции вы можете использовать:

<Суб > 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 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)