![](/img/trans.png)
[英]How to generate HTML with javascript on the server side (Node.js)?
[英]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 树。 如果您在这一点上有点困惑,我鼓励您在继续之前阅读更多相关信息。
您可以选择几种方法来执行您想要的操作。
因为你写了在浏览器中打开文件,为什么不使用一个框架,将文件直接作为 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。
如果您要做的只是生成一些 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 中的完全相同。
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
。
npm install jsdom
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.