Sto sperimentando varie risposte da un semplice server HTTP NodeJS. L'effetto che sto cercando di ottenere è il rendering visivo più veloce di una pagina web. Dal momento che la risposta viene trasmessa al browser con transfer-encoding: chunked
(giusto?) Stavo pensando che avrei potuto rendere il layout della pagina prima e il resto dei dati dopo un ritardo.Streaming di risposte Http con 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');
Il fatto è che sembra come se la risposta non viene inviata fino res.end('world')
meno che i dati già scritto è abbastanza lungo, quindi per esempio res.write(new Array(2000).join('1'))
al posto di quella res.write('hello')
, farebbe il trucco.
Il nodo esegue il buffering delle mie scritture finché i dati non sono abbastanza grandi per essere inviati? In questo caso, la dimensione del blocco è configurabile?
L'output di .write() è 'true' entrambe le volte. Quella domanda correlata che hai collegato suggerisce che questa è una piattaforma specifica, qualche idea su cosa significherebbe? L'ispettore di cromo emette solo il tempo di risposta completato, lo stesso per entrambi i casi. I dati vengono anche visualizzati prima della lettura dei tag di chiusura, è lo stesso comportamento quando si utilizza solo il testo normale. – Daniel
È specifico per il browser. Provalo in diversi browser. Inoltre, nella scheda di rete dell'ispettore Chrome, dovresti essere in grado di vedere i dati arrivare in diretta se ricarichi la pagina e fai clic sul primo elemento sotto la scheda di rete. Assicurati di selezionare la scheda di anteprima sul pannello di destra: ecco di cosa sto parlando: http://imgur.com/8CJD1 – Straseus
Sì, sembra proprio che sia il browser a tamponare la risposta. Ho provato a eseguire la richiesta con curl e questo ha prodotto il comportamento previsto, (sebbene il ricciolo sembrasse bufferizzare se la risposta mancava di terminazioni di riga '\ n') – Daniel