ハンドルバーのドキュメントによると、$#$ 1 Handlebars.precompile()
#$によって生成されたtemplateSpec
は、 Handlebars.template()
によって直接消費されるはずですが、エラースタックから、前者は文字列を出力し、後者は文字列を出力することがわかります。オブジェクトを期待します。
これは、問題を再現するための考案された例です。
var Handlebars = require('handlebars');
console.log(Handlebars.VERSION);
var pre = Handlebars.precompile('{{foo}}');
var template = Handlebars.template(pre);
そして関連する出力
$ node contrived.js
3.0.1
/private/tmp/hbs-bug/node_modules/handlebars/dist/cjs/handlebars/runtime.js:48
throw new _Exception2['default']('Unknown template object: ' + typeof temp
^
Error: Unknown template object: string
at Object.template (/private/tmp/hbs-bug/node_modules/handlebars/dist/cjs/handlebars/runtime.js:48:11)
at HandlebarsEnvironment.hb.template (/private/tmp/hbs-bug/node_modules/handlebars/dist/cjs/handlebars.runtime.js:46:20)
at Object.<anonymous> (/private/tmp/hbs-bug/contrived.js:7:27)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3
プリコンパイルは、JavaScriptソースを含む文字列を返します。 compileメソッドを使用するのと同じ環境で実行することを意図したものではありません。 何らかの理由でこれを行う必要がある場合は、テンプレートに渡す前にこのスティングを評価する必要があります。
それが私が恐れていたものです。 evalを使用する代わりに、関数コンストラクターを使用することを選択しましたが、すぐに呼び出して実際のオブジェクトを取得しました。 他の誰かがそれが役に立つと思うなら、それはどのように見えるかです。
var preStr = Handlebars.precompile('{{foo}}');
var pre = (new Function('return ' + preStr)());
var template = Handlebars.template(pre);
ハンドルバーに簡単に統合できるもののようです。
怠惰なことなくHandlebars.compileを効果的に実装しています
コンパイル。 使用する予定のテンプレートにプリコンパイルを使用しているのはなぜですか
同じインスタンス?
2015年5月31日午後4時42分ネイサンウィット[email protected]
書きました:
それが私が恐れていたものです。 私はevalを使用する代わりに、
すぐに呼び出して実際の関数コンストラクターを取得する関数コンストラクター
物体。 他の誰かがそれが役に立つと思うなら、それはどのように見えるかです。var preStr = Handlebars.precompile( '{{foo}}');
var pre =(new Function( 'return' + preStr)());
var template = Handlebars.template(pre);ハンドルバーに簡単に統合できるもののようです。
—
このメールに直接返信するか、GitHubで表示してください
https://github.com/wycats/handlebars.js/issues/1033#issuecomment -107249447
。
スクリプトは、電子メールテンプレートの開発ツールです。 プリコンパイルされたソースは本番環境で使用するためにアップロードされますが、完全なローカルプレビューも生成します。 コンパイルを使用しないことを選択したのは、この方法で両方を共通のソースから取得できるためです。
最も参考になるコメント
それが私が恐れていたものです。 evalを使用する代わりに、関数コンストラクターを使用することを選択しましたが、すぐに呼び出して実際のオブジェクトを取得しました。 他の誰かがそれが役に立つと思うなら、それはどのように見えるかです。
ハンドルバーに簡単に統合できるもののようです。