Node.js Generate html
我创建了一个javascript程序,它生成一个数据列表。示例输出如下:
1 2 3 4 | output one output two output three ... |
我希望能够生成一个HTML文件,该文件可以保存到磁盘并用浏览器打开。下面是我想要生成的HTML示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <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> |
我试过这样做:
1 2 | var htmlDoc = document.createElement("HMTL"); htmlDoc.innerhtml('<head></head><body>...</body>'); |
但这显然是错误的,因为文档对象不存在。
我认为这个问题是有意义的,特别是从它收到的最多票数来看。它能重新打开吗?
node.js不在浏览器中运行,因此您将没有可用的
你可以选择几种方法来做你想做的事情。
方法1:通过HTTP直接服务文件因为您在浏览器中编写了有关打开文件的内容,为什么不使用一个直接作为HTTP服务提供文件服务的框架,而不使用两步流程?这样,您的代码将更具动态性,更易于维护(不必说您的HTML总是最新的)。
有很多框架可以做到这一点:
- HTTP(节点本机API)
- 连接
- 膝关节炎
- 快速(使用Connect)
- 帆(建在快车上)
- 盖迪
- 复合JS
- 等。
最基本的方法是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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>'; }; |
从浏览器访问这个HTML。
(编辑:您也可以将它们与一个小型HTTP服务器一起提供。)
方法2:仅生成文件如果您要做的只是生成一些HTML文件,那么就简单点。为了在文件系统上执行IO访问,node有一个API,在这里记录。
1 2 3 4 5 6 7 8 9 10 | 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); }); |
注:
这是最基本的node.js实现,需要调用应用程序来处理输出本身。要在节点中输出某些内容(即到stdout),最好的方法是使用
1 2 3 | var html = buildHtml(); console.log(html); |
注:
如果您的脚本在基于Linux/Unix的系统中被称为
1 | $ node html-generator.js > path/to/file |
结论
因为node是一个模块化的系统,所以您甚至可以将
1 2 3 4 | var htmlBuilder = require('path/to/html-builder-module'); var html = htmlBuilder(options); ... |
在为node.js编写javascript时,您必须考虑"服务器端"而不是"客户端";您不在浏览器中和/或仅限于一个沙盒,而不是V8引擎。
额外阅读,了解NPM。希望这有帮助。
虽然@yanick rochon answer是正确的,但实现目标的最简单方法(如果是为动态生成的HTML提供服务)是:
1 2 3 4 5 6 7 8 | 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); |
这样当你浏览
如果要创建静态文件,可以使用node.js文件系统库来创建静态文件。但是,如果您正在寻找一种方法,通过数据库或类似的查询创建动态文件,那么您将需要一个像swig这样的模板引擎。除了这些选项之外,您还可以像通常那样创建HTML文件,并在node.js上为它们提供服务。为此,您可以使用node.js文件系统从HTML文件中读取数据并将其写入响应。一个简单的例子是:
1 2 3 4 5 6 7 8 9 10 11 12 | 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,以获得更有用的解决方案。
您可以使用Jade+Express:
1 | app.get('/', function (req, res) { res.render('index', { title : 'Home' } ) }); |
above you see 'index' and an object {title : 'Home'}, 'index' is your
html and the object is your data that will be rendered in your html.