Javascript 如何在Nodejs服务器上呈现带有把手的静态HTML文件?

Javascript 如何在Nodejs服务器上呈现带有把手的静态HTML文件?,javascript,node.js,handlebars.js,Javascript,Node.js,Handlebars.js,我在网上找到了很多关于这方面的资源,但还没有找到一个能让我理解的足够直接的资源 目前,我在一个包含Handlebar内容的HTML文档中有多个大量标记。服务器将此HTML文档发送到客户端,客户端随后使用AJAX调用中的数据呈现页面。我希望将整个进程移动到服务器端,这样服务器所要做的就是发送一个静态文件,并在数据更新时重新呈现页面。数据每天更改几次-这就是为什么它不是硬编码的,我想在数据更新时在HTML文档上运行Handlebar编译器 是否可以通过一个函数简单地将带有把手模板的HTML文档放入标

我在网上找到了很多关于这方面的资源,但还没有找到一个能让我理解的足够直接的资源

目前,我在一个包含Handlebar内容的HTML文档中有多个大量标记。服务器将此HTML文档发送到客户端,客户端随后使用AJAX调用中的数据呈现页面。我希望将整个进程移动到服务器端,这样服务器所要做的就是发送一个静态文件,并在数据更新时重新呈现页面。数据每天更改几次-这就是为什么它不是硬编码的,我想在数据更新时在HTML文档上运行Handlebar编译器

是否可以通过一个函数简单地将带有把手模板的HTML文档放入标记中,以生成一个新的HTML文件并填充数据

下面是我的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);

以下内容可以将把手呈现为静态html。运行node example.js。您可能需要先运行npm安装-保存车把

如果您的把手模板很简单,只需替换字符串,则可以使用underline.js完成此操作。假设此示例名为“generate.js”

var fs = require('fs');
var _ = require('underscore');
_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

function render(filename, data)
{
  var source   = fs.readFileSync(filename,'utf8').toString();
  var compiled = _.template(source);
  return compiled(data);
}

var data = JSON.parse(fs.readFileSync("./data/strings.json", 'utf8'));

var result = render('./templates/somefile.html', data);

console.log(result);

然后运行node generate.js将呈现的模板输出到控制台。您可能需要先执行npm安装-保存下划线。

以下内容可以将把手呈现为静态html。运行node example.js。您可能需要先运行npm安装-保存车把

如果您的把手模板很简单,只需替换字符串,则可以使用underline.js完成此操作。假设此示例名为“generate.js”

var fs = require('fs');
var _ = require('underscore');
_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

function render(filename, data)
{
  var source   = fs.readFileSync(filename,'utf8').toString();
  var compiled = _.template(source);
  return compiled(data);
}

var data = JSON.parse(fs.readFileSync("./data/strings.json", 'utf8'));

var result = render('./templates/somefile.html', data);

console.log(result);

然后运行node generate.js将呈现的模板输出到控制台。您可能需要先执行npm安装-保存下划线。

如果我按照正确的方法操作,您所描述的是在服务器上呈现初始页面并将HTML发送到客户端,然后在更新数据时在客户端重新呈现整个页面。这似乎过于复杂,因为您必须支持两个完整的渲染路径和代码片段。我建议您先在服务器端渲染,然后在客户端通过外科手术插入更新/修改,而不是重新渲染整个页面,或者始终在客户端渲染,您可以通过将数据作为标签中的Javascript数据放入初始页面来保存初始ajax调用,并且您的初始呈现可以使用其中的数据。然后,只有一种类型的渲染。当页面第一次呈现时,它是根据页面附带的Javascript数据呈现的。当稍后重新呈现页面时,会使用相同的呈现机制,但它可能会从另一个源Ajax调用或webSocket消息获取数据。此外,为什么服务器会将test.html写入文件系统?对于处理多个用户的服务器,不能将硬代码文件名作为请求处理程序的一部分来呈现。来自多个用户的多个请求将践踏彼此的数据。通常,您会将其呈现为一个Javascript字符串,然后将该字符串作为http响应发送。无需将数据放入文件系统。@jfriend00我想我可能只是把这个问题写得很糟糕。我想从我的把手模板生成一个静态HTML文件。然后服务器将提供静态HTML文件,而无需任何Handlebar模板。它将生成这个HTML文件一次,然后提供这个HTML文件,直到它创建一个新的。希望这更有意义?如果我正确地遵循,您描述的是在服务器上呈现初始页面,并将HTML发送到客户端,然后在更新数据时在客户端重新呈现整个页面。这似乎过于复杂,因为您必须支持两个完整的渲染路径和代码片段。我建议您先在服务器端渲染,然后在客户端通过外科手术插入更新/修改,而不是重新渲染整个页面,或者始终在客户端渲染,您可以通过将数据作为标签中的Javascript数据放入初始页面来保存初始ajax调用,并且您的初始呈现可以使用其中的数据。然后,只有一种类型的渲染。当页面第一次呈现时,它是根据页面附带的Javascript数据呈现的。当稍后重新呈现页面时,会使用相同的呈现机制,但它可能会从另一个源Ajax调用或webSocket消息获取数据。此外,为什么服务器会将test.html写入文件系统?对于处理多个用户的服务器,不能将硬代码文件名作为请求处理程序的一部分来呈现。来自多个用户的多个请求将践踏彼此的数据。通常,您将渲染成一个Javascript字符串,然后发送该字符串
ng作为http响应。无需将数据放入文件系统。@jfriend00我想我可能只是把这个问题写得很糟糕。我想从我的把手模板生成一个静态HTML文件。然后服务器将提供静态HTML文件,而无需任何Handlebar模板。它将生成这个HTML文件一次,然后提供这个HTML文件,直到它创建一个新的。希望这更有意义?很好。谢谢分享,非常好。谢谢分享