我正在试验来自简单NodeJS HTTP服务器的各种响应。 我试图实现的效果是更快的网页视觉渲染。由于响应是通过transfer-encoding: chunked
(右?)流式传输到浏览器的,我想我可以首先渲染页面布局,并在延迟后渲染其余数据。使用NodeJS流式传输Http响应
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/html'
, 'Transfer-Encoding': 'chunked'
});
res.write('<html>\n');
res.write('<body>\n');
res.write('hello ');
res.write('</body>\n');
res.write('</html>\n');
setTimeout(function() {
res.end('world');
},1500);
}).listen(3000, '127.0.0.1');
的事情是,它看起来好像响应发送出去,直到res.end('world')
除非已写入的数据是足够长的时间,所以例如res.write(new Array(2000).join('1'))
的而不是res.write('hello')
,会做的伎俩。
节点是否正在缓存我的写入,直到数据足够大才能发送?如果是这种情况,块大小是否可配置?
.write()的输出两次都是“真”。您链接的相关问题表明,这是平台特定的,关于这将意味着什么? 铬检查器只输出完成的响应时间,两种情况都一样。 数据也在结束标记读取之前呈现,这与使用纯文本时的行为相同。 – Daniel 2012-03-17 19:29:33
它是浏览器特定的。在不同的浏览器中试用它。此外,在Chrome检查器的网络选项卡中,如果重新加载页面并单击网络选项卡下的第一项,则应该可以看到数据实时显示。请确保您选择了右侧面板上的预览选项卡 - 以下是我正在讨论的内容:http://imgur.com/8CJD1 – Straseus 2012-03-18 05:26:37
是的,它确定似乎是缓冲响应的浏览器。我试着用curl来运行请求,并且产生了预期的行为,(尽管如果响应缺少行结束符,curl似乎会缓冲)\ n \ n – Daniel 2012-03-18 09:43:50