を使用するGoogle Chrome 拡張機能は、またはの使用manifest_version: 2
が制限されています。私がチェックしたすべての JavaScript テンプレート ライブラリ (mustachejs、underscorejs、jQuery テンプレート、hoganjs など) は. どちらも使用しない、かなり成熟してサポートされているものはありますか?eval
new Function
new Function
10 に答える
Pureeval
がまたはを使用しているようには見えませんnew Function
。
遠位テンプレートはevalを使用しません。
Closure Templatesは、 を使用しないテンプレート ライブラリですeval
。テンプレートは事前に JavaScript にコンパイルされるため、アプリに含まれるものはプレーンな .js ファイルであり、CSP の問題が発生することはありません。
「テンプレート ライブラリ」の意味によって異なります。文字列の補間だけが必要な場合は、eval
orは必要ありませんnew Function
。埋め込まれたループ構造が必要になると、事態はさらに複雑になります。
数か月前に、オーバーライドしても構わない場所であちこちで数回使用したString.prototype.tmpl.js
スクリプトを書きましたString.prototype
。静的関数として、次を使用できます。
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
スクリプトを変更して、ドキュメント フラグメントを利用して実際に DOM 要素を構築することもできますが、現状では、それが「テンプレート ライブラリ」としてカウントされるかどうかはわかりません。
この問題の最善の解決策は、拡張機能をデプロイする前にテンプレートをプリコンパイルすることです。handlebarsjsとecoはどちらも、機能として事前コンパイルを提供します。私は実際にもっと深く掘り下げたブログ投稿を書きました。
たぶん、関数 eval1 を書くことができます:
function eval1(blah) {
var s = document.createElement("script");
s.src = blah;
document.head.appendChild(s);
document.head.removeChild(s);
}
必要なライブラリで検索/置換を行いますが、それは不正行為ですよね?
最近、同じ問題に遭遇しました。マニフェスト バージョンを更新した後、拡張機能が機能しなくなりました。Mustache を試しましたが、配列のインデックスとオブジェクト プロパティの名前をレンダリングできませんでした。そのため、 と のない独自のシンプルだが効果的なテンプレート ライブラリAsheを作成する必要がeval
ありnew Function
ました。それが誰かを助けることを願っています。