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。