关于javascript:Node.js生成html

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不在浏览器中运行,因此您将没有可用的document对象。实际上,您甚至根本没有DOM树。如果您在这一点上有点困惑,我鼓励您在继续之前阅读更多关于它的内容。

你可以选择几种方法来做你想做的事情。

方法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);
});

注:buildHtml函数与方法1中的函数完全相同。

方法3:将文件直接转储到stdout中。

这是最基本的node.js实现,需要调用应用程序来处理输出本身。要在节点中输出某些内容(即到stdout),最好的方法是使用console.log(message),其中message是任何字符串或对象等。

1
2
3
var html = buildHtml();

console.log(html);

注:buildHtml函数与方法1(同样)完全相同。

如果您的脚本在基于Linux/Unix的系统中被称为html-generator.js,那么只需

1
$ node html-generator.js > path/to/file

结论

因为node是一个模块化的系统,所以您甚至可以将buildHtml函数放在它自己的模块中,并简单地编写适配器来处理您喜欢的HTML。类似的东西

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);

这样当你浏览http://localhost:1337时,你会得到你的HTML页面。


如果要创建静态文件,可以使用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.