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树.如果你在这一点上有点困惑,我建议你在进一步讨论之前先阅读更多相关内容.
您可以选择几种方法来完成您想要的操作.
因为您写过关于在浏览器中打开文件的文章,为什么不使用直接作为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 .
如果你要做的只是生成一些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中的功能完全相同.
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.希望这可以帮助.
虽然@ 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页面.
你可以使用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以获得更有用的解决方案。