私は単純なNodeJS HTTPサーバーからさまざまな応答を試しています。 私が達成しようとしている効果は、Webページの視覚的レンダリングが高速です。応答は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.write('hello')
のインスタンスres.write(new Array(2000).join('1'))
のためので、既に書き込まれたデータが十分な長さでない限り、応答がres.end('world')
まで送信されないかのように思われることであるトリックを行うだろう。
データのサイズが十分に大きくなるまで、ノードは書き込みをバッファリングしていますか?その場合、チャンクサイズは設定可能ですか?
.write()の出力は両方とも 'true'です。あなたがリンクしている関連する質問は、これがプラットフォーム固有であることを示唆しています。それは何を意味するのでしょうか? クロムインスペクタは完了した応答時間のみを出力します。どちらの場合も同じです。 データも閉じタグが読み取られる前にレンダリングされます。プレーンテキストのみを使用する場合と同じ動作です。 – Daniel
ブラウザ固有です。さまざまなブラウザで試してみてください。また、クロムインスペクタの[ネットワーク]タブでは、ページをリロードして[ネットワーク]タブの最初の項目をクリックすると、データが実際に表示されるようになります。右パネルの[プレビュー]タブを選択していることを確認してください - ここで私が話していることは次のとおりです:http://imgur.com/8CJD1 – Straseus
はい、確かにそれは応答をバッファリングするブラウザのようです。私はcurlでリクエストを実行しようとしましたが、期待される動作が生成されました(レスポンスに行末\ nがないとカールしたように見えました) – Daniel