Node.js生成html

luf*_*747 25 html javascript node.js

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

output one 
output two 
output three 
...
Run Code Online (Sandbox Code Playgroud)

我希望能够生成一个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>
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

var htmlDoc = document.createElement("HMTL");
htmlDoc.innerhtml('<head></head><body>...</body>');
Run Code Online (Sandbox Code Playgroud)

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

我认为这个问题特别有意义,因为它收到的票数很多.可以重新开放吗?

Yan*_*hon 60

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>';
};
Run Code Online (Sandbox Code Playgroud)

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);
});
Run Code Online (Sandbox Code Playgroud)

注意:buildHtml功能与方法1中的功能完全相同.


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

这是最基本的Node.js实现,需要调用应用程序来处理输出本身.要在节点(即到标准输出)输出的东西,最好的办法就是使用console.log(message)其中message的任何字符串或对象等

var html = buildHtml();

console.log(html);
Run Code Online (Sandbox Code Playgroud)

注意:buildHtml功能与方法1中的功能完全相同(再次)

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

$ node html-generator.js > path/to/file
Run Code Online (Sandbox Code Playgroud)

结论

因为Node是一个模块化系统,你甚至可以将buildHtml函数放在它自己的模块中,只需编写适配器来处理你想要的HTML.就像是

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

var html = htmlBuilder(options);
...
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Loupax我相信你误解了这个问题.它不是关于DOM操作,而是关于生成HTML.唯一提到的"文件"对象就是OP试图做的事情,这就是为什么我说"你不能这样做",而且我对此100%正确; 他把浏览器的JavaScript和Node.js应用程序中的JavaScript混淆了.我再说一遍,这与你是否可以进行DOM操作无关.现在,请重新阅读问题和我的答案,并停止争论. (5认同)
  • @Loupax,问题在这里,不是你可以或不可以,但如果有一个默认.服务器端JavaScript没有全局的`window`对象.它也没有文档.它*可以*有,但不需要任何.因此,除非您创建或添加其中任何一个的实现,否则它们将不存在.尽量不要将新手程序员与Node.js混淆.服务器端编程和客户端之间必须有区别; 两者都使用相同的语言和语法,但不共享相同的权限和容器. (3认同)
  • 我没有发现服务器上不存在 Document 对象的原因。让我们不要忘记客户端上的 `window.document` 是什么:一个 XML 文档实例,带有允许您进行 DOM 操作的方法。我们应该(并且可以)使用任何语言在服务器上进行 DOM 操作 (2认同)

gfp*_*eco 9

虽然@ 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);
Run Code Online (Sandbox Code Playgroud)

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

  • @OneHoopyFrood您缺少哪些必需的标题?内容长度?很难要求动态生成的内容。内容类型默认为text / html,编码默认为latin1,所以这一切都很好。这对快速而肮脏的脚本非常有效。 (3认同)

fan*_*ing 8

你可以使用jsdom

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { document } = (new JSDOM(`...`)).window;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

如果要创建静态文件,可以使用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);
Run Code Online (Sandbox Code Playgroud)

但我建议你研究一些框架,比如Express以获得更有用的解决方案。