在Node脚本中加载预编译的Handlebars模板?

dst*_*ley 5 javascript node.js handlebars.js

我有一个简单的Handlebars模板email-template.hbs,我想在app.js不读取文件系统的情况下预编译并加载到我的文件中,并在每次app.js运行时编译它.

现在,我有一些看起来像这样的东西:

var handlebars = require('handlebars');
var fs = require('fs');

var source = fs.readFileSync('./email-template.hbs', 'utf-8');
var template = handlebars.compile(source);
Run Code Online (Sandbox Code Playgroud)

我宁愿有这样的事情:

var handlebars = require('handlebars');
var template = require('email-template');
Run Code Online (Sandbox Code Playgroud)

email-template.js预编译email-template.hbs模板在哪里.

小智 18

我是Node和Handlebars的新手,也有同样的问题.

诀窍是使用-c标志预编译模板(预编译为Node的CommonJS模块格式,并为其提供所需的车把运行时模块的路径).

鉴于你已经遵循的方向设置预编译(npm install handlebars -g),然后为您生成的例子email-template.js./email-template.hbs,尝试在命令行中运行以下命令:

handlebars ./email-template.hbs -f ./email-template.js -c handlebars/runtime 
Run Code Online (Sandbox Code Playgroud)

......这应该产生一个email-template.js

var Handlebars = require("handlebars/runtime");  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
Run Code Online (Sandbox Code Playgroud)

在顶部.然后你可以在你的app.js喜欢中使用它:

var Handlebars = require('handlebars/runtime');
var hbtemplate = require('./email-template.js');

// You don't even seem to need the "var hbtemplate =" above, 
// as precompiling puts your template into the Handlebars object.
var template = Handlebars.templates['email-template'];
// ...then you can use template(data) to generate the HTML string
Run Code Online (Sandbox Code Playgroud)

  • 多亏了这个,我在-c选项之后错过了把手/运行时,我没有发现这是必需的. (3认同)
  • @Jason 这似乎不再起作用了。我收到一条错误消息“无法读取未定义的属性‘电子邮件模板’”。有关此内容的更多信息,请访问 https://github.com/wycats/handlebars.js/issues/955 (2认同)
  • @杰森我的错。我正在导入`handlebars`而不是`handlebars / runtime`。但这一次并没有给我一个错误,但是`template`是`undefined`。所以我浏览了js文件,并对上面的代码做了些微更改。我用var template = Handlebars.templates ['email-template.hbs'];替换了您的代码段。 (2认同)