react + ts + event-source-polyfill 實現方案


使用event-source-polyfill 前提:

嚴格的來說,HTTP協議無法做到服務端主動推送消息,但是,有一種方法,是服務器向客戶端聲明,接下來要發送的是流信息(streaming)。也就是說,發送的不是一次性的數據包,而是一個數據流,會連續不斷的發送過來,這時,客戶端不會關閉鏈接,會一直等待服務器發過來的新的數據流,視頻播放就是這樣的例子,本質上,這種通信就是以流信息的方式,完成一次用時很長的下載。

SSE就是利用這種機制,使用流信息向瀏覽器推送信息,它基於HTTP協議,現除了IE,其他主流瀏覽器都有一定程度的支持。因為要兼容IE,所以我們使用到了polyfill。

SSE與WebSocket作用相似,都是建立瀏覽器與服務器之間的通信渠道,然后服務器向瀏覽器推送信息。

總體來說,websocket更強大和靈活,因為它是全雙工通道,可以雙向通信,SSE是單向通道,只能服務器向瀏覽器發送,因為流本質上就是下載,如果瀏覽器向服務器發送消息,就變成了另一次HTTP請求。

 

 

但是SSE也有自己的優點。

SSE使用HTTP協議,現有的服務器軟件都支持,WebSocket是一個獨立協議。

SSE屬於輕量級,使用簡單;websocket協議相對復雜。

SSE默認支持斷線重連,websocket需要自己實現。

SSE一般只用來傳送文本,二進制數據需要編碼后傳送,websocket默認支持傳送二進制數據。

SSE支持自定義發送的消息類型。

因此,兩者各有特點,適合不同的場合。我們項目的需求是要做一個實時的消息通知,所以采用了SSE的技術棧,SSE的客戶端API部署在EventSource對象上,但是由於EventSource不支持IE,也不支持在對象的header定義token, 所以采用了event-source-polyfill 。

首先,安裝polyfill

npm install event-source-polyfill

or 

brow install event-source-polyfill

因為event-source-polyfill沒有ts版本,所以要解決這個問題,需要建立src/types/index.d.ts文件

declare const event-source-polyfill: any;

declare module 'event-source-polyfill';

使用

important { EventSourcePolyfill } from 'event-source-polyfill';

 

useEffect(() => {

  const evtSource = new EventSourcePolyfill('/stream', {

    headers: {

      Authorization: 'token'

    }

  })

  evtSource.onmessage = function(event: any) {

    // to to something...

  }

}, []);

 

!!!!! 因為SSE傳送的流信息,所以在開發環境做反向代理時,一定要設置compress: false。否則監聽不到onmessage事件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM