最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3使用SSE實(shí)現(xiàn)前端全局事件通訊方式

 更新時(shí)間:2025年10月15日 08:38:42   作者:你的眼睛會(huì)笑  
文章介紹了使用Vue3和VueUse實(shí)現(xiàn)基于SSE(Server-Sent Events)的全局事件通訊系統(tǒng),SSE具有單向通信、基于HTTP、自動(dòng)重連和輕量級(jí)等特點(diǎn),適合實(shí)時(shí)性要求高的應(yīng)用,實(shí)現(xiàn)方案包括訂閱消息、取消訂閱和關(guān)閉連接等功能

vue3 SSE實(shí)現(xiàn)前端全局事件通訊

什么是SSE (useEventSource)

SSE(Server-Sent Events)是一種基于HTTP的服務(wù)器推送技術(shù),允許服務(wù)器單向向客戶端發(fā)送事件。相比WebSocket,SSE具有以下特點(diǎn):

  • 單向通信(服務(wù)器→客戶端)
  • 基于HTTP協(xié)議,無(wú)需額外協(xié)議
  • 自動(dòng)重連機(jī)制
  • 輕量級(jí),實(shí)現(xiàn)簡(jiǎn)單

為什么選擇SSE作為全局通訊方案

  • 實(shí)時(shí)性 :服務(wù)器可以即時(shí)推送數(shù)據(jù)到所有客戶端
  • 低開(kāi)銷 :相比輪詢,減少了不必要的請(qǐng)求
  • 自動(dòng)重連 :內(nèi)置連接恢復(fù)機(jī)制
  • 兼容性 :現(xiàn)代瀏覽器普遍支持

實(shí)現(xiàn)方案

以下是基于Vue 3和VueUse的SSE全局通訊實(shí)現(xiàn):

import { getToken } from "@/store/modules/auth/helper";
import { useEventSource } from '@vueuse/core'
import { watch } from "vue";

const baseURL = 'https://xxxxxxxxxxxx.com/api'
let eventSource: ReturnType<typeof useEventSource> | null = null;
const callbacks = new Set<(data: any) => void>();

// 初始化SSE連接
export const initSSE = () => {
    if (eventSource) return;

    const token = getToken();
    const url = `${baseURL}/sse?Authorization=${token}`;

    eventSource = useEventSource(url, [], {
        autoReconnect: {
            retries: 5,
            delay: 5000,
            onFailed() {
                console.error('SSE連接失敗');
            }
        }
    });

    // 錯(cuò)誤處理
    watch(eventSource.error, (err) => {
        if (err) console.error('SSE連接錯(cuò)誤:', err);
    });

    // 消息處理
    watch(eventSource.data, (msg) => {
        if (msg && msg !== 'heartbeat') {
            try {
                const data = JSON.parse(msg);
                callbacks.forEach(cb => cb(data)); // 通知所有訂閱者
            } catch (e) {
                console.error('SSE數(shù)據(jù)解析錯(cuò)誤:', e);
            }
        }
    });
};

核心功能實(shí)現(xiàn)

  1. 訂閱消息
// 添加消息監(jiān)聽(tīng)
export function addListener(callback: (data: any) => void) {
    callbacks.add(callback);
    return () => removeListener(callback); // 返回取消訂閱函數(shù)
}
  1. 取消訂閱
// 移除消息監(jiān)聽(tīng)
function removeListener(callback: (data: any) => void) {
    callbacks.delete(callback);
}
  1. 關(guān)閉連接
// 關(guān)閉SSE連接
export function closeSse() {
    eventSource?.close();
    eventSource = null;
    callbacks.clear();
}

在Vue組件中使用

  1. 初始化連接
// 在應(yīng)用初始化時(shí)調(diào)用
import { initSSE } from '@/utils/sse';

// 啟動(dòng)SSE連接
initSSE();
  1. 訂閱消息
import { addListener,closeSse } from '@/utils/sse';

// 組件內(nèi)訂閱
const unsubscribe = addListener((data) => {
    console.log('收到消息:', data);
    // 處理業(yè)務(wù)邏輯...
});

// 組件銷毀時(shí)取消訂閱
onUnmounted(() => {
    closeSse();
});

實(shí)際應(yīng)用場(chǎng)景

  1. 實(shí)時(shí)通知系統(tǒng) :新消息提醒、系統(tǒng)公告等
  2. 數(shù)據(jù)監(jiān)控 :實(shí)時(shí)展示服務(wù)器狀態(tài)、監(jiān)控?cái)?shù)據(jù)
  3. 協(xié)同編輯 :多人協(xié)作時(shí)的內(nèi)容同步
  4. 任務(wù)進(jìn)度更新 :長(zhǎng)時(shí)間任務(wù)的進(jìn)度通知

性能優(yōu)化建議

  1. 心跳機(jī)制 :服務(wù)器定期發(fā)送心跳包保持連接
  2. 消息壓縮 :對(duì)大消息進(jìn)行壓縮處理
  3. 批量發(fā)送 :合并多個(gè)小消息為一次發(fā)送
  4. 連接共享 :多個(gè)組件復(fù)用同一個(gè)連接

完整代碼

// sse.ts
import { getToken } from "@/store/modules/auth/helper";
import { useEventSource } from '@vueuse/core'
import { watch } from "vue";
const baseURL =  'http://xxxxxxxxxx'
let eventSource:any = null;
const callbacks: Set<(data: any) => void> = new Set();
export const initSSE = () => {
    if (eventSource) return;

    const token = getToken();
    const url = `${baseURL}/sse?Authorization=${token}`;

     eventSource = useEventSource(url, [], {
        autoReconnect: {
            retries: 5,
            delay: 5000,
            onFailed() {
                console.log('Failed to connect after 5 retries');
            }
        }
    });

    const { data, error } = eventSource;
    watch(error, (err) => {
        if (err) {
            console.error('SSE連接錯(cuò)誤:', err);
            error.value = null;
        }
    });

    watch(data, (msg) => {
        if (msg) {
            console.log('SSE接收到消息:', msg);
                try {
                    const parsedData = JSON.parse(msg);
                    callbacks.forEach(cb => cb(parsedData));
                } catch (e) {
                    console.error('SSE數(shù)據(jù)解析錯(cuò)誤:', e);
                }
            data.value = null;
        }
    });



};

export function addListener(callback: (data: any) => void) {
    callbacks.add(callback);
    return () => removeListener(callback);
}

function removeListener(callback: (data: any) => void) {
    callbacks.delete(callback);
}

export function closeSse() {
    // eventSource?.close();
    eventSource = null;
    callbacks.clear();
}

總結(jié)

SSE提供了一種簡(jiǎn)單高效的服務(wù)器推送方案,非常適合構(gòu)建實(shí)時(shí)性要求較高的應(yīng)用。通過(guò)全局管理SSE連接,可以實(shí)現(xiàn)跨組件的實(shí)時(shí)通訊,減少重復(fù)連接,提高應(yīng)用性能。

本文介紹的實(shí)現(xiàn)方案具有以下優(yōu)點(diǎn):

  • 基于VueUse,代碼簡(jiǎn)潔
  • 支持自動(dòng)重連
  • 全局單例管理
  • 易于集成到現(xiàn)有項(xiàng)目
  • 對(duì)于需要雙向通信的場(chǎng)景,可以考慮結(jié)合WebSocket或保留傳統(tǒng)的HTTP輪詢作為補(bǔ)充。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue中添加手機(jī)驗(yàn)證碼組件功能操作方法

    Vue中添加手機(jī)驗(yàn)證碼組件功能操作方法

    組件是Vue.js最強(qiáng)大的功能之一。組件可以擴(kuò)展HTML元素,封裝可重用的代碼。這篇文章主要介紹了VUE 中添加手機(jī)驗(yàn)證碼組件,需要的朋友可以參考下
    2017-12-12
  • vue的Element組件上傳文件el-upload上傳成功后清空方式

    vue的Element組件上傳文件el-upload上傳成功后清空方式

    文章介紹了幾種清空文件上傳組件的方法,包括設(shè)置file-list為空數(shù)組和修改組件key,這些方法可以幫助在新增或修改時(shí)清空組件內(nèi)容,解決實(shí)際開(kāi)發(fā)中的問(wèn)題
    2026-02-02
  • Vue實(shí)現(xiàn)二維碼的展示及下載功能

    Vue實(shí)現(xiàn)二維碼的展示及下載功能

    這篇文章主要介紹了Vue實(shí)現(xiàn)二維碼的展示及下載功能,其中downloadQRCode()函數(shù)中的url為要下載的文件的路徑,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Vue實(shí)現(xiàn)手機(jī)掃描二維碼預(yù)覽頁(yè)面效果

    Vue實(shí)現(xiàn)手機(jī)掃描二維碼預(yù)覽頁(yè)面效果

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)手機(jī)掃描二維碼預(yù)覽頁(yè)面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Vue權(quán)限指令控制權(quán)限詳解

    Vue權(quán)限指令控制權(quán)限詳解

    因?yàn)轫?xiàng)目中需要根據(jù)后端返回的權(quán)限進(jìn)行功能的顯示隱藏,所以就加了個(gè)權(quán)限指令。不用寫if else進(jìn)行判斷,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • Vue2.x中利用@font-size引入字體圖標(biāo)報(bào)錯(cuò)的解決方法

    Vue2.x中利用@font-size引入字體圖標(biāo)報(bào)錯(cuò)的解決方法

    今天小編就為大家分享一篇Vue2.x中利用@font-size引入字體圖標(biāo)報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue3如何實(shí)現(xiàn)超絲滑打字機(jī)效果組件(可復(fù)用、高定制)

    Vue3如何實(shí)現(xiàn)超絲滑打字機(jī)效果組件(可復(fù)用、高定制)

    最近遇到一個(gè)需求就是使用Web網(wǎng)頁(yè)實(shí)現(xiàn)打字機(jī)特效,覺(jué)著還不錯(cuò),這篇文章主要介紹了Vue3如何實(shí)現(xiàn)超絲滑打字機(jī)效果組件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • 解讀計(jì)算屬性和watch監(jiān)聽(tīng)的區(qū)別及說(shuō)明

    解讀計(jì)算屬性和watch監(jiān)聽(tīng)的區(qū)別及說(shuō)明

    計(jì)算屬性是基于它們的依賴進(jìn)行緩存的,只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值,而watch則是一個(gè)更為通用的監(jiān)聽(tīng)器,它可以在數(shù)據(jù)變化時(shí)執(zhí)行異步操作或開(kāi)銷較大的操作
    2025-01-01
  • vue中解決跨域的常見(jiàn)方案分享(建議收藏)

    vue中解決跨域的常見(jiàn)方案分享(建議收藏)

    本文主要介紹了前后端分離項(xiàng)目中的跨域問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 對(duì)vux點(diǎn)擊事件的優(yōu)化詳解

    對(duì)vux點(diǎn)擊事件的優(yōu)化詳解

    今天小編就為大家分享一篇對(duì)vux點(diǎn)擊事件的優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論

佳木斯市| 黄山市| 西充县| 禄丰县| 忻州市| 永清县| 湖南省| 凤山县| 思茅市| 普安县| 万载县| 根河市| 西吉县| 固始县| 措美县| 鲁山县| 天长市| 峨眉山市| 方城县| 米易县| 城口县| 乐至县| 黄大仙区| 涟源市| 上思县| 威宁| 黄山市| 招远市| 宁都县| 陇西县| 洪雅县| 柘荣县| 青冈县| 策勒县| 河源市| 乡城县| 平顶山市| 桦川县| 女性| 陵水| 镇赉县|