Tôi đang thử nghiệm các phản hồi khác nhau từ một máy chủ HTTP NodeJS đơn giản. Hiệu ứng tôi đang cố gắng đạt được là hiển thị trực quan nhanh hơn của trang web. Vì phản hồi được truyền tới trình duyệt với transfer-encoding: chunked
(phải không?) Tôi đã nghĩ tôi có thể hiển thị bố cục trang đầu tiên và phần còn lại của dữ liệu sau khi trì hoãn.Phản hồi luồng trực tuyến với NodeJS
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');
Cái này là nó có vẻ như thể phản ứng không được gửi đến res.end('world')
trừ khi dữ liệu đã được viết là đủ dài, do đó ví dụ res.write(new Array(2000).join('1'))
thay vì res.write('hello')
đó, sẽ làm các trick.
Node có lưu vào bộ đệm của tôi cho đến khi dữ liệu đủ lớn để gửi không? Nếu đúng như vậy, kích thước đoạn có thể cấu hình được không?
Đầu ra của .write() là 'true' cả hai lần. Đó là câu hỏi liên quan bạn liên kết cho thấy rằng đây là nền tảng cụ thể, bất kỳ ý tưởng về những gì mà có nghĩa là gì? Trình kiểm tra chrome chỉ xuất ra thời gian phản hồi đã hoàn thành, tương tự cho cả hai trường hợp. Dữ liệu cũng được hiển thị trước khi các thẻ đóng đã được đọc, đó là hành vi tương tự khi chỉ sử dụng văn bản thuần túy. – Daniel
Đó là trình duyệt cụ thể. Hãy dùng thử trong các trình duyệt khác nhau. Ngoài ra, trong tab mạng của thanh tra chrome, bạn sẽ có thể thấy dữ liệu xuất hiện trực tiếp nếu bạn tải lại trang và nhấp vào mục đầu tiên trong tab mạng. Hãy chắc chắn rằng bạn chọn tab xem trước trên bảng bên phải - đây là những gì tôi đang nói về: http://imgur.com/8CJD1 – Straseus
Có, nó chắc chắn có vẻ như nó là trình duyệt mà bộ đệm phản ứng. Tôi đã thử chạy các yêu cầu với curl và sản xuất các hành vi mong đợi, (mặc dù curl dường như đệm nếu đáp ứng thiếu kết thúc dòng '\ n') – Daniel