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, но для этого потребуется подчеркнуть.