Вопрос по javascript – Библиотека шаблонов JavaScript, которая не использует функцию eval / new

11

Расширения Google Chrome с использованиемmanifest_version: 2 запрещено использоватьeval или жеnew Function, Все проверенные мной библиотеки шаблонов JavaScript (mustachejs, underscorejs, шаблон jQuery, hoganjs и т. Д.) Используютnew Function, Есть ли какие-нибудь достаточно зрелые и поддерживаемые, которые тоже не используют?

Информация об ограничениях безопасности.

Ваш Ответ

10   ответов
2

Дистальный шаблон не использует eval.

Спасибо за эту ссылку!
3

Похоже, чточистый использует либоeval или жеnew Function.

Спасибо за ссылку. Мне нравится внешний вид Pure, но подход сильно отличается от более распространенных библиотек шаблонов. Я проверю это, но на самом деле это не решение без переписывания. abraham
5

Оказывается, усы добавилnew Function недавно и используятег 0.4.2 его нет. Это API немного отличается сMustache.to_html вместоMustache.render и есть вероятность некоторого снижения производительности.

яоткрыл вопрос потенциально получитьnew Function удалено в будущем выпуске.

Решение этой проблемы заключается в использованииhandlebarsjs прекомпилировать ваши шаблоны усов. Смотрите мой ответ ниже.
1

Это действительно зависит от того, что вы подразумеваете под «библиотекой шаблонов». Если вам просто нужна интерполяция строк, нет необходимости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];
    });
}
An example template:
<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, но я не уверен, считается ли он «библиотекой шаблонов».

0

Может быть, вы можете написать функцию eval1:

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

и найти / заменить нужную вам библиотеку, но это будет обманом, верно?

0

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

Не уверен, когда он был добавлен, но теперь вы можете делать песочницу в стиле Firefox в Chrome. Я портирую свое расширение Firefox, поэтому мне это нужно (поскольку у меня нет evalInSandbox: P)

0

Я недавно столкнулся с той же проблемой. После обновления версии манифеста мое расширение перестало работать. Я попробовал Усы, но он не смог отрисовать индекс массива и имена свойств объекта. Поэтому мне пришлось создать собственную простую, но эффективную библиотеку шаблонов.Эш который свободен отeval а такжеnew Function, Надеюсь, это кому-нибудь поможет.

1

Лучшее решение этой проблемы - предварительно скомпилировать шаблоны перед развертыванием расширения. И то и другоеhandlebarsjs а такжеэко предлагаем предварительную компиляцию в качестве функции. Я на самом деле написалСообщение блога это углубляется.

3

Ответы здесь устарели, поэтому я выкладываю обновления.

С сентября Google изменил свою политику и разрешилunsafe-eval в манифесте 2 расширения. Увидетьэта тема а такжеэта страница.

Так что библиотеки используютeval(), new Function() и т. д. можно использовать, еслиunsafe-eval включен для ваших расширений.

Вопрос о расширениях.
Правильно. Иногда для приложений Chrome добавляется функция, добавляемая Google для расширений, и, увидев ваш ответ, я пошел проверить. Затем я добавил эту дополнительную информацию.
Примечание. Этот параметр запрещен для приложений Chrome (упакованных приложений), только для расширений.
2

Закрытие шаблонов библиотека шаблонов, которая не используетeval, Шаблоны скомпилированы в JavaScript заблаговременно, поэтому в ваше приложение включается простой файл .js, который не должен сталкиваться с проблемами CSP.

Похожие вопросы