Handlebars.js: NPM Handlebars no puede leer sus propios datos precompilados

Creado en 30 may. 2015  ·  4Comentarios  ·  Fuente: handlebars-lang/handlebars.js

Según la documentación de Handlebars , el templateSpec generado por Handlebars.precompile() debería ser consumible directamente por Handlebars.template() , sin embargo, está claro en la pila de errores que obtengo que el primero genera una cadena y el último espera un objeto.

Aquí hay un ejemplo artificial que recrea el problema.

var Handlebars = require('handlebars');

console.log(Handlebars.VERSION);

var pre = Handlebars.precompile('{{foo}}');
var template = Handlebars.template(pre);

Y la salida asociada

$ 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

Comentario más útil

Eso es lo que me temía. Sin embargo, en lugar de usar eval, opté por usar un constructor de funciones que luego invoqué de inmediato para obtener el objeto real. Así es como se ve si alguien más lo encuentra útil.

var preStr = Handlebars.precompile('{{foo}}');
var pre = (new Function('return ' + preStr)());
var template = Handlebars.template(pre);

Parece algo que podría integrarse fácilmente en los manillares.

Todos 4 comentarios

Precompile devuelve una cadena con la fuente de JavaScript. No está diseñado para ejecutarse en el mismo entorno en el que solo usaría el método de compilación. Si necesita hacer esto por algún motivo, debe evaluar esta picadura antes de pasar a la plantilla.

Eso es lo que me temía. Sin embargo, en lugar de usar eval, opté por usar un constructor de funciones que luego invoqué de inmediato para obtener el objeto real. Así es como se ve si alguien más lo encuentra útil.

var preStr = Handlebars.precompile('{{foo}}');
var pre = (new Function('return ' + preStr)());
var template = Handlebars.template(pre);

Parece algo que podría integrarse fácilmente en los manillares.

Está implementando efectivamente Handlebars.compile sin la pereza
Compilacion. ¿Por qué usa precompilación para las plantillas que planea usar en
la misma instancia?
El domingo 31 de mayo de 2015 a las 4:42 p. m. Nathan Witt [email protected]
escribió:

Eso es lo que me temía. En lugar de usar eval, opté por usar un
constructor de funciones que invoqué inmediatamente para darme la
objeto. Así es como se ve si alguien más lo encuentra útil.

var preStr = Manillar.precompile('{{foo}}');
var pre = (nueva Función('return ' + preStr)());
plantilla var = Manillar.template(pre);

Parece algo que podría integrarse fácilmente en los manillares.


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/wycats/handlebars.js/issues/1033#issuecomment-107249447
.

El script es una herramienta de desarrollo para plantillas de correo electrónico. La fuente precompilada se carga para su uso en producción, pero también genero una vista previa local completa. Elegí no usar compilar porque de esta manera puedo obtener ambos de una fuente común.

¿Fue útil esta página
0 / 5 - 0 calificaciones