我在网上找到了很多相关资料,但没有一个能够让我轻松理解的。
目前,我在一个HTML文档中有多个大型<script>
标签,其中包含handlebars内容。服务器将此HTML文档发送到客户端,客户端使用来自AJAX调用的数据呈现页面。我希望将整个过程移到服务器端,这样服务器只需要发送静态文件,并在数据更新时重新呈现页面。由于数据每天更改几次,因此它不是硬编码的,我希望在数据更新时运行handlebars编译器对HTML文档进行编译。
是否可以通过函数将具有handlebars模板的HTML文档放入<script>
标签中,以生成填充有数据的新HTML文件?
以下是我在Node服务器上运行的app.js
文件中的代码,它并未实现我想要的功能:
function registerHelpers(callback){
Handlebars.registerHelper('equal', function(lvalue, rvalue, options) {
if (arguments.length < 3)
throw new Error("Handlebars Helper equal needs 2 parameters");
if( lvalue!=rvalue ) {
return options.inverse(this);
} else {
return options.fn(this);
}
});
Handlebars.registerHelper('trim', function(text) {
text = text.replace(/ /g, '');
return new Handlebars.SafeString(text);
});
callback();
}
function buildHomePage() {
var source = require(__dirname + '/public/home.handlebars');
var template = Handlebars.precompile(source);
var collection = db.get('datalist'); //Monk call to MongoDB
collection.find({}, function (err, docs){
var result = template(docs);
console.log(result)
var fs = require('fs');
fs.writeFile("test.html", result, function(err) {
if(err) {
console.log(err);
}
});
});
};
registerHelpers(buildHomePage);
<script>
标签中,以此来避免初始的ajax调用,然后你的初始渲染可以使用那里的数据。这样,只有一种类型的渲染。当页面首次渲染时,它是从随页面一起传递的Javascript数据进行渲染的。当稍后重新渲染页面时,仍然使用相同的渲染机制,但是从另一个来源获取数据(可能是Ajax调用或WebSocket消息)。 - jfriend00test.html
写入文件系统?对于处理多个用户的服务器,您不能这样做(将硬编码的文件名作为请求处理程序的一部分进行渲染)。来自多个用户的多个请求将互相干扰。通常,您会将其呈现为 Javascript 字符串(您已经这样做了),然后将该字符串作为 http 响应发送。无需将数据放入文件系统中。 - jfriend00