javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 前端流式接收数据

前端流式接收数据示例讲解

作者:Code_Geo

在现代的前端应用中,处理大量数据和实时数据流变得越来越普遍,下面这篇文章主要介绍了前端流式接收数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

前端流式接收数据(Streaming Data Reception)是现代 Web 应用中一个重要特性,尤其在处理实时通信、大文件传输、聊天、视频播放、实时日志监控等场景下。下面我们从概念到技术实现,再到应用示例,系统全面、细致地讲解前端如何流式接收数据。

一、什么是流式接收数据?

传统方式:前端发起请求,后端准备好完整数据后一次性返回。

流式方式:后端逐步返回数据片段(chunk),前端逐块接收和处理,实现边接收边处理

优点

二、前端接收数据的主流流式方式

我们重点介绍以下几种常见方式:

  1. Fetch + ReadableStream(原生流)
  2. EventSource(Server-Sent Events)
  3. WebSocket(双向通信)
  4. ReadableStream + TransformStream(高级控制)

三、Fetch + ReadableStream(推荐)

1. 使用场景

用于接收后端以流式返回的数据,例如:AI 输出、长日志、文件下载。

2. 示例代码

<button id="start">开始接收流数据</button>
<pre id="output"></pre>

<script>
document.getElementById("start").addEventListener("click", async () => {
  const output = document.getElementById("output");
  output.textContent = "";

  const response = await fetch("/stream-endpoint");

  const reader = response.body.getReader();
  const decoder = new TextDecoder("utf-8");

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    output.textContent += decoder.decode(value, { stream: true });
  }
});
</script>

3. 后端需支持 chunked 传输(如 Node.js、Flask、FastAPI)

四、EventSource(SSE:服务器推送)

1. 使用场景

适用于服务器主动推送数据,如股票价格、消息通知、日志流。

2. 示例代码

<pre id="log"></pre>
<script>
const log = document.getElementById("log");
const evtSource = new EventSource("/sse");

evtSource.onmessage = (event) => {
  log.textContent += `数据:${event.data}\n`;
};
</script>

3. 服务端要求

data: Hello
data: World

五、WebSocket(全双工通信)

1. 使用场景

适用于双向通信场景:聊天室、在线游戏、协同编辑等。

2. 示例代码

<input id="msg" placeholder="输入消息" />
<button onclick="sendMessage()">发送</button>
<pre id="chat"></pre>

<script>
const ws = new WebSocket("ws://localhost:8080");
const chat = document.getElementById("chat");

ws.onmessage = (event) => {
  chat.textContent += `服务器:${event.data}\n`;
};

function sendMessage() {
  const msg = document.getElementById("msg").value;
  ws.send(msg);
}
</script>

3. 服务端需实现 WebSocket 协议(如:ws模块、Socket.IO、FastAPI WebSocket)

六、ReadableStream + TransformStream(更高级的控制)

1. 使用场景

需要对流数据做实时处理、转换,例如分割段落、转义数据。

2. 示例代码

const response = await fetch('/stream');

const textDecoderStream = new TextDecoderStream();
const transformStream = new TransformStream({
  transform(chunk, controller) {
    const timestamped = `[${new Date().toISOString()}] ${chunk}`;
    controller.enqueue(timestamped);
  }
});

response.body
  .pipeThrough(textDecoderStream)
  .pipeThrough(transformStream)
  .pipeTo(new WritableStream({
    write(chunk) {
      document.body.innerText += chunk;
    }
  }));

七、如何选择合适的方式?

需求建议使用方式
单向、实时推送SSE(EventSource)
双向通信WebSocket
边接收边展示长文本/AI输出Fetch + ReadableStream
需要数据转化、过滤TransformStream

八、常见问题与调试技巧

1. 后端未设置Transfer-Encoding: chunked

确保响应头允许流式传输,否则浏览器会等全部内容加载完才显示。

2. 浏览器兼容性问题

3. 网络中断/重连机制

九、延伸:结合前端框架(Vue/React)

以 Vue 为例:

<template>
  <pre>{{ content }}</pre>
</template>

<script setup>
import { ref, onMounted } from 'vue'

const content = ref('')

onMounted(async () => {
  const response = await fetch('/stream');
  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    content.value += decoder.decode(value);
  }
});
</script>

十、总结

技术单向/双向控制能力浏览器支持用例
Fetch Stream单向新版浏览器AI回答、实时日志等
EventSource单向较好(除IE)消息推送、状态通知
WebSocket双向聊天、游戏、协同编辑
TransformStream单向很强较新浏览器分段解析、关键词处理等

到此这篇关于前端流式接收数据的文章就介绍到这了,更多相关前端流式接收数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文