从Node.js到React/Vue3:流式输出实用的技术的全栈实现指南

news/2025/10/8 15:08:37/文章来源:https://www.cnblogs.com/ljbguanli/p/19129670

从Node.js到React/Vue3:流式输出实用的技术的全栈实现指南

本文将从底层原理到工程实践,完整解析如何使用Node.js后端结合React和Vue3前端实现流式输出功能,涵盖协议选择、性能优化、错误处理等关键细节,并通过真实场景案例演示完整开发流程。


一、流式输出的核心原理与协议选择

1.1 流式传输的底层机制

流式输出的本质是分块传输编码(Chunked Transfer Encoding),其核心特征:

1.2 协议对比与选型建议

技术方案适用场景优点缺点
HTTP流简单文本流(如日志)原生支持,兼容性好无法双向通信
Server-Sent Events (SSE)实时通知(股票行情)简单易用,自动重连仅支持单向通信
WebSocket实时双向通信(聊天室)低延迟,双向通信需要额外协议支持

本文聚焦HTTP流和SSE协议实现,分别对应React的fetch和Vue3的EventSource方案。


二、Node.js后端:流式输出的工程实现

2.1 核心流类型深度解析

const http = require('http'
)
;
const {
Transform
} = require('stream'
)
;
// 自定义转换流(Transform Stream)
class DataTransformer
extends Transform {
constructor(
) {
super(
)
;
}
_transform(chunk, encoding, callback
) {
// 数据处理逻辑(如JSON序列化)
this.push(JSON.stringify(chunk)
)
;
callback(
)
;
}
}

2.2 高性能流式接口实现

const server = http.createServer((req, res
) =>
{
if (req.url === '/api/stream'
) {
res.writeHead(200
, {
'Content-Type': 'application/json'
,
'Cache-Control': 'no-cache'
,
'Transfer-Encoding': 'chunked'
}
)
;
const timer = setInterval((
) =>
{
const data = {
timestamp: Date.now(
)
, value: Math.random(
)
}
;
res.write(`${JSON.stringify(data)
}\n`
)
;
// 每次写入独立JSON对象
}
, 1000
)
;
req.on('close'
, (
) =>
{
clearInterval(timer)
;
res.end(
)
;
}
)
;
}
}
)
;

2.3 关键优化策略


三、React前端:流式数据处理实践

3.1 使用fetch API的完整实现

import React, {
useState, useEffect
}
from 'react'
;
const StreamComponent = (
) =>
{
const [data, setData] = useState([]
)
;
useEffect((
) =>
{
const processStream =
async (
) =>
{
const response =
await fetch('/api/stream'
, {
method: 'GET'
,
headers: {
'Accept': 'application/json'
,
'X-Requested-With': 'XMLHttpRequest' // 标识为AJAX请求
}
,
cache: 'no-cache'
}
)
;
const reader = response.body.getReader(
)
;
const decoder =
new TextDecoder('utf-8'
)
;
while (true
) {
const {
done, value
} =
await reader.read(
)
;
if (done)
break
;
const chunk = decoder.decode(value, {
stream: true
}
)
;
const lines = chunk.split('\n'
).filter(line => line.trim(
)
)
;
lines.forEach(line =>
{
try {
const parsed = JSON.parse(line)
;
setData(prev =>
[...prev, parsed]
)
;
}
catch (e) {
console.error('Invalid JSON:'
, line)
;
}
}
)
;
}
}
;
processStream(
)
;
}
, []
)
;
return (
<div><h2>实时数据流</h2><ul>{data.map((item, index) =>(<li key={index}>{new Date(item.timestamp).toLocaleTimeString()} - {item.value.toFixed(4)}</li>))}</ul></div>);};

3.2 性能优化技巧


四、Vue3前端:EventSource的深度实践

4.1 响应式流式组件实现

实时数据流
{{ formatTime(item.timestamp) }} - {{ item.value.toFixed(4) }}
import { ref, onMounted, onUnmounted } from 'vue';
const streamData = ref([]);
const eventSource = ref(null);
const connectStream = () => {eventSource.value = new EventSource('/api/stream');eventSource.value.addEventListener('message', (event) => {try {const data = JSON.parse(event.data);streamData.value = [...streamData.value, data];} catch (e) {console.error('Invalid JSON:', event.data);}});eventSource.value.onerror = (err) => {console.error('Stream error:', err);eventSource.value.close();// 自动重连setTimeout(connectStream, 5000);};
};
onMounted(connectStream);
onUnmounted(() => {if (eventSource.value) {eventSource.value.close();}
});
const formatTime = (timestamp) => {return new Date(timestamp).toLocaleTimeString();
};

4.2 高级特性实现


五、完整应用案例:实时股票行情系统

5.1 系统架构设计

[Client] --HTTP流--> [Node.js] --WebSocket--> [Stock API]

5.2 数据聚合服务

const WebSocket = require('ws'
)
;
const client =
new WebSocket('wss://stock-api.example.com'
)
;
client.on('message'
, (message
) =>
{
const stockData = JSON.parse(message)
;
// 转发给所有HTTP流客户端
clients.forEach((res
) =>
{
res.write(`data: ${JSON.stringify(stockData)
}\n\n`
)
;
}
)
;
}
)
;

5.3 前端实时图表渲染

import {
createChart
}
from 'lightweight-charts'
;
const chart = createChart(document.getElementById('chart'
)
, {
width: 800
,
height: 400
}
)
;
const lineSeries = chart.addLineSeries(
)
;
let dataPoints = []
;
eventSource.addEventListener('message'
, (event
) =>
{
const data = JSON.parse(event.data)
;
dataPoints.push({
time: data.timestamp,
value: data.price
}
)
;
if (dataPoints.length >
60
) dataPoints.shift(
)
;
lineSeries.setData(dataPoints)
;
}
)
;

六、调试与性能优化

6.1 常见问题排查

6.2 关键性能指标

指标优化建议
首字节时间(TTFB)使用缓存、减少处理逻辑
数据延迟优化网络传输、压缩数据体积
内存占用使用流式处理、及时关闭闲置连接

七、总结与最佳实践

7.1 技术选型建议

7.2 开发规范

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用低成本FPGA实现FSMC接口的多串口(UART)控制器

详细介绍了在低成本FPGA/CPLD上实现了基于FSMC接口(GD32上称为EXMC接口)的多串口控制器的方法。尽管目前工业以太网已经相当普及,但在工控领域仍然存在大量使用UART通过RS485和RS422组网的设备和控制器,导致含有多…

2025 火烧板源头厂家最新推荐榜单:自有矿山保障品质,高硬度耐磨产品全覆盖,五莲花 / 芝麻白 / 防滑芝麻黑采购优选指南

随着建筑装饰与市政工程对火烧板需求激增,行业乱象愈发凸显,给采购方带来多重困扰。部分厂家缺乏稳定原材料渠道,导致产品硬度不足、耐磨性差,难以承受户外长期使用;传统加工工艺落后,规格偏差、表面处理粗糙等问…

实用指南:Python数据可视化科技图表绘制系列教程(一)

实用指南:Python数据可视化科技图表绘制系列教程(一)2025-10-08 14:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

给特宝网站商家网址怎样做网站企业建设

beginWork 1 &#xff09;概述 在 renderRoot 之后&#xff0c;要对我们的 Fiber 树每一个节点进行对应的更新更新节点的一个入口方法&#xff0c;就是 beginWork这个入口方法会有帮助我们去优化整棵树的更新过程 react 它的节点其实是非常多的&#xff0c;如果每一次子节点的…

网站推广的方式和方法常见的微网站平台有哪些方面

文章目录 linux软件安装linux系统部署liunx升级linux常见故障及排查思路概要 1. Linux软件安装 软件包管理:Linux系统通常使用包管理工具(如APT、YUM、DNF等)来简化软件安装和管理。用户可以通过命令行快速安装、卸载和更新软件包。源配置:确保软件源(repository)正确配…

2025 年太阳能路灯厂商最新推荐榜:聚焦优质企业,从技术实力到合作案例全方位解析太阳能道路灯/景观灯/警示灯/庭院灯/草坪灯/杀虫灯厂家推荐

随着新能源政策大力推进与绿色基建需求持续攀升,太阳能路灯行业迎来发展机遇,但市场问题也随之凸显。部分产品存在太阳能板转换效率低、电池续航不足等缺陷,阴雨天气易出现照明中断;不少厂商缺乏核心技术,仅靠组装…

Luogu P11660 我终将成为你的倒影 题解 [ 紫 ] [ 分块 ] [ 分类讨论 }

我终将成为你的倒影:考察分块基本功的一道题。 注意到本题强制在线,且这种信息用线段树不是很好维护,所以可以很自然地想到分块。 又注意到 \(b \le 500\),所以考虑暴力枚举 \(b\)。发现当 \(b\) 固定的时候,\(a\…

免费的企业网站cms百度指数明星人气榜

1、SpringCloud是什么&#xff1f; 1、 Spring Cloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用SpringBoot的…

网站目的及功能定位深圳网站优化哪家好

目录 101.RocketMQ的事务消息是如何实现的 102.为什么RocketMQ不使⽤Zookeeper作为注册中⼼呢&#xff1f; 103.RocketMQ的实现原理 104.RocketMQ为什么速度快 105.消息队列如何保证消息可靠传输 106.消息队列有哪些作⽤ 107.死信队列是什么&#xff1f;延时队列是什么&a…

2025 年最新推荐!小程序开发机构排行榜:覆盖定制开发 / 电商 / 预订 / 配送多场景优质服务商成都小程序开发/小程序定制开发/电商小程序开发/预订服务小程序开发公司推荐

在数字化转型浪潮下,小程序已成为政企打通线上服务、提升运营效率的关键工具,但其开发市场却乱象丛生。不少厂商以模板套用冒充定制开发,导致交付后功能与需求脱节、二次开发受阻;部分服务商技术迭代缓慢,开发的小…

CF280D k-Maximum Subsequence Sum 题解(线段树+反悔贪心维护k段最大子段和)

线段树维护区间最大子段和是好做的:每个节点维护当前最大子段和、从左端点开始的最大子段和、从右端点开始的最大子段和、当前节点的和。 这个题允许我们选择最多 \(k\) 段,于是我们可以考虑一个类似于反悔贪心的做法…

深圳网站优化公司哪家好wap建站程序合集

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

做网站要分几部分完成广东网站建设方便

一、项目介绍 在游乐场、商场、景区等人流量较大的地方&#xff0c;往往存在用户需要临时存放物品的情况&#xff0c;例如行李箱、外套、购物袋等。为了满足用户的储物需求&#xff0c;并提供更加便捷的服务体验&#xff0c;当前设计了一款物联网智能储物柜。 该智能储物柜通…

2025年微信小程序开发:趋势、最佳实践与AI整合 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站点击率怎么建西安做公司网站

STM32G4系列单片机&#xff0c;为32位的微控制器&#xff0c;理论上其内部寄存器地址最多支持4GB的命名及查找&#xff08;2的32次方&#xff0c;地址命名为0x00000000至0xFFFFFFFF&#xff09;。STM32官方对4GB的地址存储进行编号时&#xff0c;又分割成了8个block区域&#x…

网站有哪几种类型做网站 华普花园

会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科&#xff0c;本专业培养具备财务、管理、经济、法律等方面的知识和能力&#xff0c;具有分析和解决财务、金融问题的基本能力&#xff0c;能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…

实验课1

实验1源代码1 #include<stdio.h> 2 int main() 3 { 4 printf(" o\n"); 5 printf("<H>\n"); 6 printf("I I\n"); 7 8 return 0; 9 } View Code运行…

做自我介绍的网站的图片素材怎么用动图做网站背景

Description Input 第一行为两个整数n, m。第二行有n个整数&#xff0c;为a1&#xff0c;a2, …, an。 Output 包含n行&#xff0c;每行m个1~nm的正整数&#xff0c;各不相同&#xff0c;以空格分开。如果有多解&#xff0c;输出任意一组解&#xff1b;如果无解&#xff0c;输出…

深入解析:【LeetCode 热题100】回溯:括号生成 组合总和(力扣22 / 39 )(Go语言版)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:基于 COM 的 XML 解析技术(MSXML) 的总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …