13

Chrome APIのマニフェストバージョン2では、安全でない評価を行う機能が削除されました。これは、eval関数を使用すること、または一般にテキストから関数を動的に作成することを意味します。

すべてではないにしてもほとんどのJavascriptテンプレートエンジンがこれを行うようです。私はJamlを使用していましたが、backbone.js(実際にはunderscore.jsのテンプレートエンジンを使用しています)のような他のいくつかを試しましたが、運がありませんでした。

Chromiumプロジェクトに関するこのコメントは、これに苦しんでいるライブラリが非常に多いことを示しているようです。

Angular.jsにはCSPセーフモードがあると思いますが、Angular.jsは本当に必要なものには大きすぎます。かなり基本的なテンプレートエンジンが必要であり、モデルやコントローラーなどは必要ありません。CSP互換のテンプレートエンジンについて知っている人はいますか?

4

2 に答える 2

8

この問題の最善の解決策は、拡張機能をデプロイする前にテンプレートをプリコンパイルすることです。handlebarsjsecoの両方が機能としてプリコンパイルを提供します。私は実際に、より詳細なブログ投稿を書きました。

于 2012-07-18T23:20:10.660 に答える
4

中規模および大規模のテンプレートには、Mathew が推奨するプリコンパイルを絶対に使用する必要があります。非常に小さなテンプレートの場合、これを使用しています:

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 を使用しませんが、アンダースコアが必要です。

于 2013-12-12T13:15:38.393 に答える