繁体   English   中英

Node.js 生成 html

[英]Node.js Generate html

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

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>');

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

我认为这个问题是有道理的,尤其是从它收到的赞成票数量来看。 可以重新开放吗?

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

您可以选择几种方法来执行您想要的操作。


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

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

有很多框架可以做到这一点:

你可以做你想做的最基本的方法是这样的:

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><head>' + header + '</head><body>' + body + '</body></html>';
};

并从浏览器使用http://localhost:8080访问此 HTML。

编辑:您也可以使用小型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函数方法一完全一样(再次)

如果您的脚本名为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以获得更有用的解决方案。

您可以使用翡翠+快递:

app.get('/', function (req, res) { res.render('index', { title : 'Home' } ) });

上面你会看到'index'和一个对象{title:'Home'},'index'是你的html,对象是你的数据,将在你的html中呈现。

你可以使用jsdom

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { document } = (new JSDOM(`...`)).window;

或者,看看cheerio ,它可能更适合您的情况。

使用jsdom

  1. npm install jsdom
  2. 代码
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM();

let heading = dom.window.document.createElement("h3");
let headingText = dom.window.document.createTextNode("Hello World");
heading.appendChild(headingText);
dom.window.document.body.appendChild(heading);

console.log(dom.window.document.body.innerHTML);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM