Streams API 實戰:瀏覽器端串流大檔案處理架構

技术架构(更新於 2026年5月31日)

為什麼需要串流處理?

傳統方式讀取大檔案:

// ❌ 200MB 檔案 → 200MB ArrayBuffer → 可能 OOM
const buffer = await file.arrayBuffer();
processEntireBuffer(buffer);

串流處理:

// ✅ 每次只處理 64KB chunk
const stream = file.stream();
for await (const chunk of stream) {
  processChunk(chunk); // 64KB
}
對比 全量載入 串流處理
記憶體佔用 檔案大小 ~64KB(chunk 大小)
開始處理 全部讀完 第一個 chunk 到達
200MB 檔案 200MB 記憶體 ~64KB 記憶體
1GB 檔案 可能 OOM 正常運行

三種核心 Stream

ReadableStream  →  資料來源(檔案、網路回應)
TransformStream →  中間處理(壓縮、加密、格式轉換)
WritableStream  →  資料目的地(檔案下載、網路上傳)

ReadableStream

const response = await fetch('/large-file.pdf');
const reader = response.body!.getReader();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  console.log(`Received ${value.byteLength} bytes`);
}

TransformStream

const compressor = new TransformStream({
  transform(chunk, controller) {
    const compressed = gzipSync(chunk);
    controller.enqueue(compressed);
  }
});

// 管道連接
fileStream.pipeThrough(compressor).pipeTo(downloadStream);

背壓 (Backpressure)

當生產者速度 > 消費者速度時,Stream 自動暫停生產者:

FileReader(快)→ [緩衝區滿] → 暫停讀取
                      ↓
              TransformStream(慢)→ 消費 chunk → 緩衝區有空間 → 恢復讀取

這是 Stream 相較手動 chunk 迴圈的核心優勢——自動流量控制,無需手動管理緩衝區大小。


工具庫中的串流應用

Gzip 壓縮/解壓

壓縮解壓工具 使用 CompressionStream API:

const compressed = file.stream().pipeThrough(new CompressionStream('gzip'));
// 串流壓縮,無需全量載入

大 PDF 分塊讀取

async function* readPdfChunks(file: File, chunkSize = 4 * 1024 * 1024) {
  let offset = 0;
  while (offset < file.size) {
    const chunk = file.slice(offset, offset + chunkSize);
    yield await chunk.arrayBuffer();
    offset += chunkSize;
  }
}

for await (const chunk of readPdfChunks(largePdf)) {
  await processPdfChunk(chunk);
}

串流下載

const stream = new ReadableStream({
  async start(controller) {
    for await (const chunk of generateChunks()) {
      controller.enqueue(chunk);
    }
    controller.close();
  }
});

const response = new Response(stream, {
  headers: { 'Content-Disposition': 'attachment; filename="output.zip"' }
});

Stream API 相容性

API Chrome Firefox Safari Edge
ReadableStream 52+ 65+ 10.1+ 79+
TransformStream 80+ 102+ 14.1+ 80+
CompressionStream 80+ 113+ 16.4+ 80+
File.stream() 76+ 69+ 14.1+ 79+

CompressionStream 較新,不支援的瀏覽器回退至 pako/fflate 函式庫的全量處理。


總結

Streams API 是處理大檔案的現代標準。ReadableStream 分塊讀取、TransformStream 中間處理、背壓自動流控——這套機制讓瀏覽器端處理 GB 級檔案成為可能,是工具庫大檔案工具(PDF、影片、壓縮)的底層基礎設施。

本站提供瀏覽器本地工具,免註冊即可試用 →

#Streams API#ReadableStream#TransformStream#大文件#流式处理