Node.js生成html

我创建了一个生成数据列表的JavaScript程序。 下面的示例输出:

output one 
output two 
output three 
...

我希望能够生成一个可以保存到磁盘并用浏览器打开的HTML文件。 以下是我想要生成的HTML样本。

<html>
    <head>
    </head>
    <body>
        <table id="history_table">
            <tr>
                <td>header 1</td>
                <td>header 2</td>
                <td>header 3</td>
            </tr>
            <tr>
               <td>output one</td>
            </tr>
            ...
        </table>
    </body>
</html>

我试过这样做:

var htmlDoc = document.createElement("HMTL");
htmlDoc.innerhtml('<head></head><body>...</body>');

但是这显然是错误的,因为文档对象不存在。


Node.js不在浏览器中运行,因此您不会有可用的document对象。 实际上,你甚至不会有DOM树。 如果您在这一点上有点困惑,我鼓励您在继续阅读之前阅读更多内容。

有几种方法可以选择做你想做的事。


方法1:通过HTTP直接提供文件

因为你写过关于在浏览器中打开文件的原因,为什么不使用一个将直接作为HTTP服务来提供文件的框架,而不是采用两步处理? 这样,你的代码将变得更加动态且易于维护(不要提到你的HTML始终是最新的)。

那里有很多框架:

  • Http(节点本机API)
  • 兴亚
  • Express(使用连接)
  • 帆(建立在Express上)
  • Geddy
  • CompoundJS
  • 等等
  • 你能做到的最基本的方法就是:

    var http = require('http');
    
    http.createServer(function (req, res) {
      var html = buildHtml(req);
    
      res.writeHead(200, {
        'Content-Type': 'text/html',
        'Content-Length': html.length,
        'Expires': new Date().toUTCString()
      });
      res.end(html);
    }).listen(8080);
    
    function buildHtml(req) {
      var header = '';
      var body = '';
    
      // concatenate header string
      // concatenate body string
    
      return '<!DOCTYPE html>'
           + '<html><header>' + header + '</header><body>' + body + '</body></html>';
    };
    

    并通过浏览器访问http://localhost:8080

    编辑 :你也可以用一个小的HTTP服务器来提供它们。)


    方法2:仅生成文件

    如果你想要做的只是生成一些HTML文件,那么简单一点。 为了在文件系统上执行IO访问,Node为此提供了一个API,在此处进行了说明。

    var fs = require('fs');
    
    var fileName = 'path/to/file';
    var stream = fs.createWriteStream(fileName);
    
    stream.once('open', function(fd) {
      var html = buildHtml();
    
      stream.end(html);
    });
    

    注意: buildHtml函数与方法1中的完全相同。


    方法3:将文件直接转储到stdout

    这是最基本的Node.js实现,需要调用的应用程序来处理输出本身。 要在Node中输出一些东西(比如stdout),最好的方法是使用console.log(message) ,其中message是任何字符串或对象等。

    var html = buildHtml();
    
    console.log(html);
    

    注意: buildHtml函数与方法1 (再次)完全相同

    如果您的脚本被称为html-generator.js (例如),在基于Linux / Unix的系统中,只需执行

    $ node html-generator.js > path/to/file
    

    结论

    由于Node是一个模块化系统,您甚至可以将buildHtml函数放入自己的模块中,只需编写适配器即可处理HTML。 就像是

    var htmlBuilder = require('path/to/html-builder-module');
    
    var html = htmlBuilder(options);
    ...
    

    在为Node.js编写JavaScript时,您必须考虑“服务器端”而不是“客户端”; 您不在浏览器中和/或仅限于V8引擎以外的沙盒。

    额外阅读,了解npm。 希望这可以帮助。


    虽然@ yanick-rochon的回答是正确的,但实现你的目标(如果是服务一个动态生成的html)最简单的方法是:

    var http = require('http');
    http.createServer(function (req, res) {
      res.write('<html><head></head><body>');
      res.write('<p>Write your HTML content here</p>');
      res.end('</body></html>');
    }).listen(1337);
    

    这样,当你浏览http://localhost:1337你会得到你的html页面。


    如果你想创建静态文件,你可以使用Node.js文件系统库来做到这一点。 但是,如果您正在寻找一种方法来创建动态文件作为数据库或类似查询的结果,那么您将需要像SWIG这样的模板引擎。 除了这些选项外,您还可以像通常那样创建HTML文件,并通过Node.js提供它们。 为此,您可以使用Node.js文件系统从HTML文件中读取数据并将其写入响应中。 一个简单的例子是:

    var http = require('http');
    var fs   = require('fs');
    
    http.createServer(function (req, res) {
      fs.readFile(req.params.filepath, function (err, content) {
        if(!err) {
          res.end(content);
        } else {
          res.end('404');
        }
      }
    }).listen(3000);
    

    但我建议你看看像Express这样的框架来获得更有用的解决方案。

    链接地址: http://www.djcxy.com/p/52673.html

    上一篇: Node.js Generate html

    下一篇: Node.js Event loop