Handlebars.js: O NPM Handlebars não pode ler seus próprios dados pré-compilados

Criado em 30 mai. 2015  ·  4Comentários  ·  Fonte: handlebars-lang/handlebars.js

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

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.

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.

Todos 4 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

morgondag picture morgondag  ·  5Comentários

LengYXin picture LengYXin  ·  3Comentários

rizen picture rizen  ·  6Comentários

janus-reith picture janus-reith  ·  3Comentários

rhariraman picture rhariraman  ·  5Comentários