Node.js生成html
我创build了一个生成数据列表的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树。 如果您对此有点困惑,我鼓励您在继续阅读之前阅读更多内容 。
有几种方法可以select做你想做的事情。
方法1:通过HTTP直接提供文件
因为你写过关于在浏览器中打开文件的原因,为什么不使用一个将直接作为HTTP服务来提供文件的框架,而不是两个步骤? 这样,您的代码将更加dynamic和易于维护(不要提到您的HTML始终是最新的)。
这里有很多的框架:
- Http (节点本地API)
- 连
- 兴亚
- Express (使用连接)
- 帆 (build立在快车上)
- 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
是任何string或对象等。
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的答案是正确的,但实现你的目标(如果是服务一个dynamic生成的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页面。
如果你想创build静态文件,你可以使用Node.js文件系统库来做到这一点。 但是,如果您正在寻找一种方法来创builddynamic文件作为您的数据库或类似的查询的结果,那么你将需要像SWIG模板引擎。 除了这些选项,您还可以像通常那样创buildHTML文件,并通过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);
但是我build议你看看Express这样的框架来获得更有用的解决scheme。
你可以使用翡翠+快递:
app.get('/', function (req, res) { res.render('index', { title : 'Home' } ) });
上面你看到'索引'和一个对象{标题:'家'),'索引'是你的HTML和对象是你的数据,将被呈现在你的HTML。