作者:小彭努力中
日期:2025-06-24
技术栈:Vue3 + TypeScript + Node.js + SSE
关键词:实时推送、SSE、Vue3、前端优化、消息通知系统
在前端开发中,实时通讯的需求越来越广泛,无论是即时消息系统、任务进度追踪还是金融数据大屏,实时性都极其关键。
除了 WebSocket,SSE(Server-Sent Events) 是一种更轻量、原生、易于部署的实时通信方案。本篇文章将带你系统学习 SSE 的原理,并通过一个完整的 Vue3 + Node 后端实践案例,实现一个“实时任务进度推送系统”。
SSE(Server-Sent Events) 是一种浏览器原生支持的客户端-服务器单向通信机制。
特点概览:
✅ 基于 HTTP 协议(text/event-stream
)
✅ 服务器主动推送消息
✅ 客户端自动重连
✅ 支持事件 ID 断点续传
❌ 单向通信(只支持服务端 → 客户端)
❌ 不支持二进制数据(仅文本)
实时数据流(股票、监控)
实时进度通知(任务队列)
后台消息推送(公告提醒)
data: 这是第一条消息
id: 1
event: message
data: 第二条消息
id: 2
<两个换行表示消息结束>
断开连接后,浏览器会自动携带 Last-Event-ID
请求重新连接:
Last-Event-ID: 2
服务器可从该 ID 开始恢复推送。
sse-demo/
├── backend/ # Node服务端
├── frontend/ # Vue3前端
// backend/index.js
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());
app.get('/sse', (req, res) => {
res.set({
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
Connection: 'keep-alive'
});
let progress = 0;
const interval = setInterval(() => {
progress += 10;
res.write(`data: ${JSON.stringify({ progress })}\n\n`);
if (progress >= 100) {
clearInterval(interval);
res.end();
}
}, 1000);
req.on('close', () => {
clearInterval(interval);
console.log('客户端断开连接');
});
});
app.listen(3001, () => {
console.log('SSE服务启动:http://localhost:3001/sse');
});
npm init vue@latest sse-demo
cd sse-demo
npm install
useSSE.ts
封装// src/hooks/useSSE.ts
import { ref, onUnmounted } from 'vue';
export function useSSE(url: string) {
const progress = ref(0);
const source = new EventSource(url);
source.onmessage = (event) => {
const data = JSON.parse(event.data);
progress.value = data.progress;
};
source.onerror = (err) => {
console.error('SSE连接错误', err);
source.close();
};
onUnmounted(() => {
source.close();
});
return { progress };
}
实时任务进度
当前进度:{{ progress }}%
项目 | SSE | WebSocket |
---|---|---|
通信方向 | 单向 | 双向 |
协议 | HTTP/1.1 | 自定义(需 WS 握手) |
适配场景 | 简单实时推送 | 聊天、游戏 |
断点续传 | ✅ 支持 | ❌ 需自实现 |
兼容性 | ❌ IE 不支持 | ✅ 支持广泛 |
✅ 如果你的需求只是“服务器 → 客户端”的实时数据更新,SSE 更轻量、部署更简单。
✅ 跨域请求时,服务端需配置 Access-Control-Allow-Origin
✅ 前端不能用 fetch
替代,需要用 new EventSource()
✅ 若部署到 nginx 记得关闭缓存,启用 X-Accel-Buffering: no
❌ 不适合发送图片、视频等二进制内容
❌ IE/部分低版本浏览器不支持(可使用 polyfill)
本文从原理讲起,结合 Vue3 实现了一个完整的任务进度实时推送系统,帮助你在实际项目中快速落地 SSE。
如果你喜欢这篇文章,欢迎 点赞、⭐收藏、评论!
我会继续更新更多关于前端工程化、Vue3、Three.js、OpenLayers、WebSocket 的实战教程,敬请关注!