Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否在节点脚本中加载预编译的把手模板?_Javascript_Node.js_Handlebars.js - Fatal编程技术网

Javascript 是否在节点脚本中加载预编译的把手模板?

Javascript 是否在节点脚本中加载预编译的把手模板?,javascript,node.js,handlebars.js,Javascript,Node.js,Handlebars.js,我在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

我在
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);
var handlebars = require('handlebars');
var template = require('email-template');
// app.js
var requireHbs = require('./requireHbs');
var template = requireHbs('email-template');
我宁愿吃这样的东西:

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');
// app.js
var requireHbs = require('./requireHbs');
var template = requireHbs('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);
});
然后像这样使用它:

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');
// app.js
var requireHbs = require('./requireHbs');
var template = requireHbs('email-template');

我是新来的节点和把手,并有相同的问题

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

如果您已经遵循了(
npm install handlebar-g
)的说明,那么对于从
/email template.hbs
生成
email template.js
的示例,请尝试在命令行上运行以下命令:

handlebars ./email-template.hbs -f ./email-template.js -c handlebars/runtime 
…这将生成一个
电子邮件模板.js

在顶端。然后您可以在
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

我们的目标是避免完全从文件系统读取模板。为此,在-c选项之后,我错过了Handlebar/runtime,我没有发现这是必需的。@Jason这似乎不再有效了。我收到一个错误,说明
无法读取未定义的属性“email template”
。更多关于@Jason的信息,我的错误。我正在导入
handlebar
,而不是
handlebar/runtime
。但是这次它没有给我一个错误,但是
模板
未定义的
。所以我浏览了js文件,对上面的代码做了一些小的修改。我用
var template=handlebar.templates['email-template.hbs']替换了您的代码片段