Javascript Template Engines, которые работают с политикой безопасности содержимого Chrome
В браузере Chrome API версии 2 была удалена возможность выполнять небезопасные-eval. Это означает использование функции eval или вообще динамическое создание функции из текста.
Кажется, что большинство, если не все Javascript Templating Engines, делают это. Я использовал Jaml, но я попробовал несколько других, таких как backbone.js(который действительно использует движок шаблонов underscore.js) без везения.
Этот комментарий к проекту Chromium, похоже, указывает на то, что существует огромное количество библиотек, которые страдают от этого.
Я думаю, что Angular.js имеет CSP-безопасный режим, но Angular.js действительно слишком велик для того, что нам нужно. Нам просто нужен довольно простой механизм шаблонов и не нужны модели или контроллеры и т.д. Кто-нибудь знает о каких-либо механизмах моделирования CSP-совместимости?
Ответы
Ответ 1
Лучшим решением этой проблемы является предварительная компиляция ваших шаблонов перед развертыванием вашего расширения. Оба handlebarsjs и eco предлагают предварительную компиляцию как особенность. Я на самом деле написал сообщение в блоге, которое выходит на большую глубину.
Ответ 2
Вы должны абсолютно использовать предварительную компиляцию, как рекомендовано Мэтью для средних и больших шаблонов. Для чрезвычайно маленьких шаблонов мы используем это:
var template = function(message, data) {
if (typeof data === 'undefined') {
return _.partial(template, message);
} else {
return message.replace(/\{\{([^}]+)}}/g, function(s, match) {
var result = data;
_.each(match.trim().split('.'), function(propertyName) {
result = result[propertyName]
});
return _.escape(result);
});
}
};
var data = {
foo: 'Hello',
bar: { baz: 'world!' }
};
// print on-the-fly
template('{{foo}}, {{bar.baz}}' args); // -> 'Hello, world!'
// prepare template to invoke later
var pt = template('{{foo}}, {{bar.baz}}');
pt(args); // -> 'Hello, world!'
Эта реализация не использует eval, но для этого потребуется подчеркнуть.