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

Load precompiled Handlebars template in Node script?

我在 email-template.hbs 有一个简单的 Handlebars 模板,我想预编译并加载到我的 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);

我宁愿有这样的东西:

var handlebars = require('handlebars');
var template = require('email-template');

其中 email-template.js 是预编译的 email-template.hbs 模板。

让自己成为一个辅助函数:

// requireHbs.js
var handlebars = require('handlebars');
var fs = require('fs');
var memoize = require('lodash.memoize');
module.exports = memoize(function requireHbs(templateName){
  var filename = './' + templateName + '.hbs';
  var source = fs.readFileSync(filename, 'utf-8');
  return handlebars.compile(source);
});

然后像这样使用它:

// app.js
var requireHbs = require('./requireHbs');
var template = requireHbs('email-template');

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

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

假设您已经按照 setting up precompilation (npm install handlebars -g) 的说明进行操作,那么对于从 ./email-template.hbs 生成 email-template.js 的示例,请尝试 运行 在命令行上:

handlebars ./email-template.hbs -f ./email-template.js -c handlebars/runtime 

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

var Handlebars = require("handlebars/runtime");  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};

在顶部。然后你可以像这样在你的 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