我正在試驗來自簡單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