Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Handlebars , templateSpec
, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Handlebars.precompile()
, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ 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. ΠΠ½ Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π² ΡΠΎΠΉ ΠΆΠ΅ ΡΡΠ΅Π΄Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠ΅Π½ΠΈΡΡ ΡΡΠΎΡ ΡΠΊΡΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ ΡΠ°Π±Π»ΠΎΠ½Ρ.
ΠΠΎΡ ΡΠ΅Π³ΠΎ Ρ Π±ΠΎΡΠ»ΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ eval Ρ ΡΠ΅ΡΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΡΠ·Π²Π°Π», ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ.
var preStr = Handlebars.precompile('{{foo}}');
var pre = (new Function('return ' + preStr)());
var template = Handlebars.template(pre);
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π² Handlebars.
ΠΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΠ΅ Handlebars.compile Π±Π΅Π· Π»Π΅Π½ΠΈΠ²ΡΡ
ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ. ΠΠΎΡΠ΅ΠΌΡ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²
ΡΠΎΡ ΡΠ°ΠΌΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ?
ΠΡ, 31 ΠΌΠ°Ρ 2015 Π³., 16:42 ΠΠ°ΡΠ°Π½ ΠΠΈΡΡ, [email protected]
Π½Π°ΠΏΠΈΡΠ°Π»:
ΠΠΎΡ ΡΠ΅Π³ΠΎ Ρ Π±ΠΎΡΠ»ΡΡ. ΠΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ eval Ρ ΡΠ΅ΡΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ Π·Π°ΡΠ΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΡΠ·Π²Π°Π», ΡΡΠΎΠ±Ρ Π΄Π°ΡΡ ΠΌΠ½Π΅ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ
ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ.var preStr = Handlebars.precompile('{{foo}}');
var pre = (Π½ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ('return' + preStr)());
ΡΠ°Π±Π»ΠΎΠ½ var = Handlebars.template(pre);ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π² Handlebars.
β
ΠΡΠ²Π΅ΡΡΡΠ΅ Π½Π° ΡΡΠΎ ΠΏΠΈΡΡΠΌΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π΅Π³ΠΎ Π½Π° GitHub
https://github.com/wycats/handlebars.js/issues/1033#issuecomment-107249447
.
Π‘ΠΊΡΠΈΠΏΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΡ. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅, Π½ΠΎ Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ ΠΏΠΎΠ»Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΌΠΎΡΡ. Π― ΡΠ΅ΡΠΈΠ» Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Ρ ΠΌΠΎΠ³Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±Π° ΠΈΠ· ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠΎΡ ΡΠ΅Π³ΠΎ Ρ Π±ΠΎΡΠ»ΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ eval Ρ ΡΠ΅ΡΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΡΠ·Π²Π°Π», ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ.
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π² Handlebars.