De acordo com a documentação do Handlebars , o templateSpec
gerado por Handlebars.precompile()
deve ser diretamente consumível por Handlebars.template()
, no entanto, fica claro na pilha de erros que o primeiro gera uma string e o último espera um objeto.
Aqui está um exemplo artificial que recria o problema.
var Handlebars = require('handlebars');
console.log(Handlebars.VERSION);
var pre = Handlebars.precompile('{{foo}}');
var template = Handlebars.template(pre);
E a saída associada
$ 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
A pré-compilação retorna uma string com a origem JavaScript. Não se destina a ser executado no mesmo ambiente que você usaria apenas o método de compilação. Se você precisar fazer isso por algum motivo, você deve avaliar essa picada antes de passar para o modelo.
Era disso que eu tinha medo. Em vez de usar eval, optei por usar um construtor de função que invoquei imediatamente para me fornecer o objeto real. Aqui está o que parece, se alguém achar útil.
var preStr = Handlebars.precompile('{{foo}}');
var pre = (new Function('return ' + preStr)());
var template = Handlebars.template(pre);
Parece algo que pode ser facilmente integrado ao Handlebars.
Você está efetivamente implementando Handlebars.compile sem o preguiçoso
compilação. Por que você está usando a pré-compilação de modelos que planeja usar em
a mesma instância?
No domingo, 31 de maio de 2015 às 16h42 Nathan Witt [email protected]
escrevi:
Era disso que eu tinha medo. Em vez de usar eval, embora optei por usar um
construtor de função que eu imediatamente invoquei para me dar o real
objeto. Aqui está o que parece, se alguém achar útil.var preStr = Handlebars.precompile('{{foo}}');
var pre = (new Function('return ' + preStr)());
var template = Handlebars.template(pre);Parece algo que pode ser facilmente integrado ao Handlebars.
—
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/wycats/handlebars.js/issues/1033#issuecomment -107249447
.
O script é uma ferramenta de desenvolvimento para modelos de email. A fonte pré-compilada é carregada para uso na produção, mas também gero uma visualização local completa. Optei por não usar compilar porque desta forma posso obter ambos de uma fonte comum.
Comentários muito úteis
Era disso que eu tinha medo. Em vez de usar eval, optei por usar um construtor de função que invoquei imediatamente para me fornecer o objeto real. Aqui está o que parece, se alguém achar útil.
Parece algo que pode ser facilmente integrado ao Handlebars.