前端 SSE 實戰應用:用最簡單的方式實現實時推送

前端 SSE 實戰應用:用最簡單的方式實現實時推送

📌 點贊收藏關注不迷路!
在前端項目中,我們常聽到“實時通信”這個需求 —— 聊天、進度、狀態變化、系統消息。

但提到實時,大家首先想到的是 WebSocket,對吧?

其實還有一種更輕量、簡單、優雅的實時推送方案,那就是:

? SSE(Server-Sent Events)

本文將帶你深入理解并實戰實現一個前端 SSE 應用,包括:

  • 什么是 SSE,它與 WebSocket、輪詢的區別
  • 如何在 Vue / 原生項目中接入 SSE
  • 封裝一個穩定的 useSSE Hook
  • 前后端完整交互示例:推送進度條、系統消息
  • 使用中斷、自動重連、心跳優化技巧

🌟 一、什么是 SSE?和 WebSocket 有什么區別?

SSE(Server-Sent Events) 是 HTML5 標準中的一種服務端推送技術,通過 EventSource 對象與服務端建立單向持久連接,服務器可以持續向客戶端推送事件數據。

特性SSEWebSocket輪詢
連接方向單向(服務端 → 客戶端)雙向(全雙工)客戶端輪詢請求服務端
實現復雜度? 很簡單較復雜(需協議握手)簡單但浪費資源
兼容性Chrome / Firefox / Safari全面全面
重連機制? 內置自動重連? 需手動實現無連接
使用場景狀態推送、日志、監控通知聊天、游戲、協同編輯等簡單數據刷新

🚀 二、前端如何使用 SSE?基礎示例

SSE 的核心是 EventSource 對象:

const source = new EventSource('/sse')source.onmessage = (event) => {console.log('收到消息:', event.data)
}source.onerror = (err) => {console.error('連接異常:', err)
}

📌 onmessage 是默認事件監聽,也可以監聽自定義事件:

source.addEventListener('progress', (e) => {console.log('任務進度:', e.data)
})

?? 三、SSE 服務端返回格式

服務端 SSE 響應格式必須是 text/event-stream,并遵循以下格式:

event: progress
data: 任務已完成 40%
\n

關鍵點:

  • 必須設置響應頭:Content-Type: text/event-stream
  • 每條消息以 \n\n 結束
  • 支持 id: xxxretry: 5000 設置消息 ID 和重連時間

🔧 四、Vue 中封裝 useSSE Hook(支持斷開/重連)

// useSSE.ts
import { ref, onUnmounted } from 'vue'export function useSSE(url: string) {const data = ref<string | null>(null)const connected = ref(false)let source: EventSource | null = nullconst connect = () => {if (source) source.close()source = new EventSource(url)connected.value = truesource.onmessage = (event) => {data.value = event.data}source.onerror = () => {connected.value = falsesource?.close()// 自動嘗試重連由 EventSource 自帶實現}}const close = () => {source?.close()connected.value = false}onUnmounted(() => {close()})return {data,connected,connect,close,}
}

🧪 五、前后端實戰:實時推送任務進度條

? 后端示例(Node.js + Express)

// server.js
import express from 'express'
const app = express()app.get('/sse', (req, res) => {res.setHeader('Content-Type', 'text/event-stream')res.setHeader('Cache-Control', 'no-cache')res.setHeader('Connection', 'keep-alive')let progress = 0const timer = setInterval(() => {progress += 10res.write(`event: progress\ndata: ${progress}\n\n`)if (progress >= 100) clearInterval(timer)}, 1000)req.on('close', () => {console.log('客戶端斷開連接')clearInterval(timer)})
})app.listen(3000, () => {console.log('SSE 服務器已啟動: http://localhost:3000/sse')
})

? 前端頁面

<template><div><p>當前進度:{{ data }}</p><button @click="connect">開始監聽</button><button @click="close">斷開連接</button></div>
</template><script setup lang="ts">
import { useSSE } from './composables/useSSE'const { data, connect, close } = useSSE('http://localhost:3000/sse')
</script>

🛡 六、SSE 最佳實踐建議

? 建議:

  • 為每條消息設置 event:,區分不同事件類型
  • 每條消息設置 id:,支持客戶端斷線重連后定位
  • 長連接可設置 retry:,客戶端自動重連間隔
  • 可加入心跳機制(如每 30 秒發一次 ping)

🔄 七、如果你想手動重連

雖然瀏覽器自帶 SSE 自動重連機制,但你也可以自己控制:

source.onerror = () => {console.log('斷線,5秒后重連')setTimeout(connect, 5000)
}

🧠 八、適合用 SSE 的場景有哪些?

場景推薦使用
后臺任務進度?
系統消息通知?
數據監控/實時日志?
聊天/游戲等雙向通信?(建議 WebSocket)

? 最后說一句

SSE 是一種 簡單但不簡單的技術,適合用在輕量推送、狀態更新、進度條展示等場景。

不需要額外庫,不需要雙向握手,一行代碼就能接收服務端實時推送!

如果你覺得這篇文章有幫助,別忘了點個 收藏 + 點贊 + 關注

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91690.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第16章 基于AB實驗的增長實踐——驗證想法:AB實驗實踐

?一、AB實驗全流程框架?實驗分為5個核心環節&#xff1a;實驗假設? → 實驗設計? →實驗運行? → 實驗分析? → 實驗決策??二、各環節核心要點詳解??1. 實驗假設??原則?&#xff1a;目標性、可歸因、可復用&#xff08;前兩者必選&#xff09;?&#xff08;1&…

解決【軟件安裝路徑】失敗的方法

出現問題上圖所示問題為&#xff1a;你的臨時目錄路徑中包含 Unicode 字符&#xff0c;這可能會導致安裝損壞。請參閱故障排除指南以獲取解決方法。出現問題的原因&#xff1a;添加路徑下存在中文&#xff0c;導致系統文件無法識別。解決方法步驟一&#xff1a;創建Temp(臨時文…

FreeRTOS學習筆記——總覽

考慮到RTOS能夠提升單片機開發能力&#xff0c;也是開發復雜任務的必經之路&#xff0c;還是有必要學習的。 FreeRTOS教程多&#xff0c;免費開源&#xff0c;是個不錯的選擇。后續可以考慮繼續學習RT-Thread等。 參考1&#xff1a;FreeRTOS(教程非常詳細&#xff09;——作者&…

Clip微調系列:《coOp: learning to prompt for vision-language models》

論文鏈接&#xff1a;arxiv.org/pdf/2109.01134v1 推薦視頻(clip_coop的代碼邏輯講解&#xff0c;代碼簡單&#xff0c;有助于理解)&#xff1a;CLIP和CoOp工作的簡單Pytorch復現和理解_嗶哩嗶哩_bilibili 其他參考鏈接&#xff1a;CoOp - CLIP 自適應Prompt工程 【一】_coop…

[論文閱讀] 人工智能 + 軟件工程 | 開源軟件中的GenAI自白:開發者如何用、項目如何管、代碼質量受何影響?

開源軟件中的GenAI自白&#xff1a;開發者如何用、項目如何管、代碼質量受何影響&#xff1f; 論文&#xff1a;Self-Admitted GenAI Usage in Open-Source SoftwarearXiv:2507.10422 Self-Admitted GenAI Usage in Open-Source Software Tao Xiao, Youmei Fan, Fabio Calefato…

AI繪畫版權問題全解析:你的作品真的屬于你嗎?

AI繪畫版權問題全解析:你的作品真的屬于你嗎? 關鍵詞:AI繪畫、版權歸屬、生成式AI、訓練數據、獨創性、法律合規、知識產權 摘要:當你用MidJourney生成一張“賽博朋克風格的熊貓”,或用Stable Diffusion畫出“梵高筆觸的星空咖啡館”時,你是否想過:這張圖的版權屬于你、…

深入理解Linux文件I/O:系統調用與標志位應用

目錄 一、引入 二、標志位 1、什么是標志位&#xff1f; 2、標志位傳遞示例 輸出結果分析 關鍵點解釋 三、文件描述符(File Descriptor)&#xff08;先大概了解&#xff09; 四、接口介紹&#xff1a;open()函數 1、命令查看 2、頭文件 3、函數原型 4、參數說明 …

海康線掃相機通過采集卡的取圖設置

目錄 1、掃描高度小于65000行 1.1 軟觸發 1、采集卡設置項 2、相機設置項 1.2 硬觸發 1、采集卡設置項 2、相機設置項 2、掃描高度大于65000行 1.1 軟觸發 1、采集卡設置項 2、相機設置 1.2 硬觸發 1、采集卡設置項 2、相機設置 2.1 幀掃描 2.2 行掃描 3、注意…

InfluxDB 3與Apache Parquet:打造高性能時序數據存儲與分析解決方案

在當今數據驅動的時代&#xff0c;各行業產生的數據量呈爆炸式增長&#xff0c;如何高效存儲和管理海量數據成為企業和開發者面臨的重大挑戰。對于時序數據而言&#xff0c;其具有數據量大、寫入頻繁、查詢模式多樣等特點&#xff0c;對存儲系統的性能和效率提出了更高的要求。…

20250718-4-Kubernetes 應用程序生命周期管理-Pod對象:實現機制_筆記

一、Pod對象&#xfeff;&#xfeff;1. 資源共享實現機制1&#xff09;共享網絡&#xfeff;基本概念實現方式&#xff1a;通過將業務容器網絡加入到負責網絡的容器&#xff08;infra container&#xff09;實現網絡共享核心特點&#xff1a;共享網絡協議棧&#xff08;包括TC…

防爆手機是什么?能用普通手機改裝嗎?

在石油開采平臺的井架之上&#xff0c;在化工車間的反應釜旁&#xff0c;在煤礦深達千米的巷道中&#xff0c;一群特殊的工作人員正使用著看似普通的通訊設備。這些設備外殼上醒目的Ex防爆認證標志&#xff0c;揭示著其與眾不同的身份——防爆手機。這類專為易燃易爆環境設計的…

gem install報錯解析

報錯內容 [rootlocalhost ~]# gem install bundler Fetching: bundler-2.6.9.gem (100%) ERROR: Error installing bundler:bundler requires Ruby version > 3.1.0. The current ruby version is 2.5.0.解決方案&#xff08;任選其一&#xff09; 這個錯誤表明你當前的 Ru…

css 如何實現大屏4個占位 中屏2個 小屏幕1個

1、 使用grid.container {display: grid;grid-template-columns: repeat(4, 1fr);gap: 20px;border: 1px solid red;width: 400px;height: 400px;}media (max-width: 768px) {.container {grid-template-columns: 1fr;}}media (min-width: 768px) and (max-width: 992px) {.con…

Redis學習系列之—— JDHotKey 熱點緩存探測系統

一、為什么需要熱點緩存探測 在回答這個問題前&#xff0c;我們先考慮一下&#xff1a;為什么光用 Redis 還不夠&#xff0c;還需要使用本地緩存&#xff1f; 一般來說&#xff0c;Redis 集群的性能能抗住幾十萬并發&#xff0c;能夠應付大部分情況。但對于一些頭部 APP&#x…

Linux 安全加固

Linux 安全加固需要從??用戶權限、系統服務、網絡防護、日志審計、文件系統、訪問控制??等多個維度入手&#xff0c;目標是減少攻擊面、限制未授權訪問、提升系統健壯性。以下是??詳細步驟實操示例??&#xff0c;覆蓋主流 Linux 發行版&#xff08;如 CentOS/Ubuntu&am…

【Docker#2】容器歷史發展 | 虛擬化實現方式

一、前言 – 容器技術發展史 容器技術是現今計算技術的重要組成部分&#xff0c;其發展歷程可以追溯到很早的計算機系統提供的進程隔離工具。以下是容器技術的發展歷程&#xff0c;其中涵蓋了從早期的進程隔離技術到現代云計算和云原生的演變&#xff1a; ① Jail 時代 1979 年…

React + Mermaid 圖表渲染消失問題剖析及 4 種代碼級修復方案

Mermaid 是一個流行的庫&#xff0c;它可以將文本圖表&#xff08;例如 graph LR; A-->B;&#xff09;轉換為 SVG 圖表。在靜態 HTML 頁面中&#xff0c;Mermaid 會查找 <pre class"mermaid"> 代碼塊&#xff0c;并在頁面加載時將它們替換為渲染后的圖表。它…

[Element]修改el-pagination背景色

[Element]修改el-pagination背景色 代碼 <el-pagination:current-page.sync"queryParams.current":page-size.sync"queryParams.size":page-sizes"[10, 20, 50, 100]"layout"prev, pager, next, jumper, sizes":total"queryP…

Docker 可用鏡像列表

Docker 鏡像源列表&#xff08;7月15日更新-長期&免費&#xff09;_dockerhub國內鏡像源列表-CSDN博客

低代碼可視化工作流的系統設計與實現路徑研究

一、背景分析在數字化轉型不斷深化的背景下&#xff0c;企業業務流程呈現出高度定制化與動態調整的趨勢&#xff0c;傳統信息系統在開發周期、實施成本與擴展能力上的局限性日益凸顯&#xff0c;已難以支撐快速響應和敏捷迭代的實際需求。面向這一現實挑戰&#xff0c;基于 BPM…