0

コンテンツを提供する前にファイルを動的に連結しようとしています。次の非常に単純化されたコードは、アプローチを示しています。

var http = require('http');
var fs = require('fs');

var start = '<!doctype html><html lang="en"><head><script>';
var funcsA = fs.readFileSync('functionsA.js', 'utf8');
var funcsB = fs.readFileSync('functionsB.js', 'utf8');
var funcsC = fs.readFileSync('functionsC.js', 'utf8');
var finish = '</script></head><body>some stuff here</body></html>';

var output = start + funcsA + funcsB + funcsC + finish;

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(output);
}).listen(9000);

実際には、どのように連結するかは、userAgent からの手がかりに依存する場合があります。マークアップとスクリプトを合わせると、数百キロバイトになる可能性があります。

createServer 内でファイル システム I/O が発生しないため、このアプローチが気に入っています。response.write(...);このアプローチは、アプローチを使用してデータをストリーミングするほど効率的/低オーバーヘッドではないことをどこかで読んだようですfs.createReadStream。これは、ノードが送信できるほど速くクライアントがデータを受信できない場合に何が起こるかに関係していたようです.(?)ファイルシステムオブジェクトからは読み取り可能なストリームを作成できますが、メモリからは作成できないようです. 上記のコードをストリーミング アプローチで実行することは可能ですか? ファイル I/O が最初に発生した場合、CreateServer 関数の外で?

または、一方で、私の懸念はそれほど重要ではありません。上記のアプローチは、おそらくストリーミング アプローチよりも効率が劣ることはありません。

ありがとう。

4

2 に答える 2

0

createServer コールバックの前 (内部ではなく) にストリームを定義すると、通常は機能しません。こちらを参照してください。

于 2013-09-11T23:20:10.640 に答える
0
res.write(start)

var A = fs.createReadStream()
var B = fs.createReadStream()
var C = fs.createReadStream()

A.pipe(res, {
  end: false
})

A.on('end', function () {
  B.pipe(res, {
    end: false
  })
})

B.on('end', function () {
  C.pipe(res, {
    end: false
  })
})

C.on('end', function () {
  res.write(finish)
  res.end()
})
于 2013-09-11T02:44:49.423 に答える