js怎樣實現消息通知功能 Web消息通知的5種實現方式

消息通知功能在前端JS中主要通過5種方式實現。1. 使用瀏覽器原生notification api,需請求用戶權限并處理授權狀態,適合簡單通知場景;2. websockets建立持久連接,實現客戶端與服務器的雙向通信,適合實時性要求高的場景,如聊天應用;3. server-sent events (sse),服務器單向推送數據,實現較簡單但僅支持單向通信;4. 第三方服務如firebase cloud messaging (fcm),功能強大但需配置和學習成本,適合復雜推送需求;5. 輪詢方式實現最簡單但效率低、實時性差,適用于輕量級場景。每種方式各有優劣,應根據具體需求選擇合適方案,并注意處理權限、樣式一致性及多瀏覽器兼容性問題。

js怎樣實現消息通知功能 Web消息通知的5種實現方式

消息通知功能的實現,在前端JS中,主要依賴于瀏覽器提供的Web API,以及一些第三方庫或服務。目標是讓用戶在不離開當前頁面的情況下,及時收到重要信息,比如新郵件、好友請求等等。

js怎樣實現消息通知功能 Web消息通知的5種實現方式

Web消息通知的5種實現方式

js怎樣實現消息通知功能 Web消息通知的5種實現方式

利用瀏覽器原生Notification API實現消息通知

這是最基礎也最直接的方式。瀏覽器原生提供了Notification API,允許網頁在用戶允許的情況下,顯示系統級別的通知。

js怎樣實現消息通知功能 Web消息通知的5種實現方式

// 請求權限 Notification.requestPermission().then(permission => {   if (permission === 'granted') {     // 創建通知     const notification = new Notification("您有新的消息!", {       body: "這是一條測試消息。",       icon: 'path/to/icon.png' // 可選,通知圖標     });      // 點擊事件處理     notification.onclick = function(event) {       event.preventDefault(); // 防止瀏覽器默認行為,例如某些瀏覽器會跳轉到頁面       window.focus(); // 激活窗口       this.close(); // 關閉通知     }      // 關閉事件處理     notification.onclose = function() {       console.log('通知已關閉');     };   } else {     console.log("用戶拒絕了通知權限。");   } });

注意,這個API的使用需要用戶授權,而且不同瀏覽器對通知的顯示方式和權限管理可能略有差異。權限被拒絕是常有的事,所以要做好相應的處理。

使用WebSockets實現實時消息推送

如果需要實時性很高的消息通知,比如聊天應用,WebSockets是更好的選擇。WebSockets建立的是客戶端和服務器之間的持久連接,服務器可以主動向客戶端推送消息。

  1. 服務器端(Node.js示例)
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 });  wss.on('connection', ws => {   console.log('Client connected');    // 模擬服務器推送消息   setInterval(() => {     ws.send(JSON.stringify({ message: '服務器推送的消息:' + new Date() }));   }, 5000);    ws.on('close', () => {     console.log('Client disconnected');   }); });
  1. 客戶端(JS)
const ws = new WebSocket('ws://localhost:8080');  ws.onopen = () => {   console.log('Connected to WebSocket server'); };  ws.onmessage = event => {   const data = JSON.parse(event.data);   console.log('Received:', data.message);   // 顯示通知,可以使用Notification API   new Notification('新消息', { body: data.message }); };  ws.onclose = () => {   console.log('Disconnected from WebSocket server'); };  ws.onerror = error => {   console.error('WebSocket error:', error); };

這種方式的優點是實時性高,缺點是需要維護一個WebSocket服務器。

利用Server-Sent Events (SSE) 實現消息通知

SSE 是一種服務器單向推送數據的技術,客戶端通過 http 連接到服務器,服務器可以隨時向客戶端推送數據。相比 WebSockets,SSE 更簡單,不需要處理復雜的協議,但只能單向通信。

  1. 服務器端 (Node.js 示例)
const http = require('http');  http.createServer((req, res) => {   res.writeHead(200, {     'Content-Type': 'text/event-stream',     'Cache-Control': 'no-cache',     'Connection': 'keep-alive'   });    // 模擬服務器推送消息   setInterval(() => {     const data = `data: ${JSON.stringify({ message: '服務器推送的消息:' + new Date() })}nn`;     res.write(data);   }, 5000); }).listen(8080);
  1. 客戶端 (JS)
const eventSource = new EventSource('http://localhost:8080');  eventSource.onmessage = event => {   const data = JSON.parse(event.data);   console.log('Received:', data.message);   // 顯示通知   new Notification('新消息', { body: data.message }); };  eventSource.onerror = error => {   console.error('SSE error:', error);   eventSource.close(); };

SSE 的優點是實現簡單,缺點是只能服務器向客戶端推送數據,客戶端不能主動向服務器發送消息。

使用第三方消息推送服務 (如 Firebase Cloud Messaging)

如果不想自己搭建服務器,或者需要更強大的消息推送功能,可以使用第三方消息推送服務,比如 Firebase Cloud Messaging (FCM)。

  1. 注冊并配置 Firebase 項目:在 Firebase 控制臺創建一個項目,并配置 Web 應用。
  2. 添加 Firebase SDK 到你的 Web 應用
<script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-messaging.js"></script>
  1. 初始化 Firebase
const firebaseConfig = {   apiKey: "YOUR_API_KEY",   authDomain: "YOUR_AUTH_DOMAIN",   projectId: "YOUR_PROJECT_ID",   storageBucket: "YOUR_STORAGE_BUCKET",   messagingSenderId: "YOUR_MESSAGING_SENDER_ID",   appId: "YOUR_APP_ID" };  // Initialize Firebase const app = firebase.initializeApp(firebaseConfig); const messaging = firebase.messaging();  messaging.requestPermission()   .then(() => {     console.log('Notification permission granted.');     // 獲取 token     return messaging.getToken();   })   .then((token) => {     console.log('Token:', token);     // 將 token 發送到服務器,服務器用 token 推送消息   })   .catch((err) => {     console.log('An error occurred while retrieving token. ', err);   });  messaging.onMessage((payload) => {   console.log('Message received. ', payload);   // 顯示通知   new Notification(payload.notification.title, { body: payload.notification.body }); });
  1. 服務器端使用 Firebase Admin SDK 推送消息
const admin = require('firebase-admin');  const serviceAccount = require("path/to/your/serviceAccountKey.json");  admin.initializeApp({   credential: admin.credential.cert(serviceAccount) });  const message = {   notification: {     title: '新消息',     body: '您有一條來自服務器的新消息'   },   token: 'YOUR_CLIENT_TOKEN' };  admin.messaging().send(message)   .then((response) => {     console.log('Successfully sent message:', response);   })   .catch((error) => {     console.log('Error sending message:', error);   });

FCM 的優點是功能強大,可靠性高,缺點是需要學習和配置 Firebase。

使用輪詢(Polling)實現簡單消息通知

雖然不推薦,但在某些簡單場景下,輪詢也是一種選擇。客戶端定時向服務器發送請求,檢查是否有新消息。

function checkNewMessages() {   fetch('/api/new-messages')     .then(response => response.json())     .then(data => {       if (data.hasNewMessage) {         // 顯示通知         new Notification('新消息', { body: data.message });       }     })     .catch(error => {       console.error('Error checking messages:', error);     }); }  // 每隔一段時間檢查一次 setInterval(checkNewMessages, 10000); // 每 10 秒檢查一次

輪詢的優點是實現簡單,缺點是實時性差,會浪費服務器資源。

如何優雅地處理瀏覽器通知權限問題

用戶拒絕授權通知是很常見的情況,需要優雅地處理。

  1. 檢測權限狀態:在嘗試發送通知之前,先檢查 Notification.permission 的值。
if (Notification.permission === 'granted') {   // 可以發送通知   new Notification('新消息', { body: '您有新的消息' }); } else if (Notification.permission === 'denied') {   // 用戶已拒絕授權   console.log('用戶已拒絕通知權限');   // 可以顯示一個友好的提示,引導用戶去設置中開啟通知權限 } else if (Notification.permission === 'default') {   // 尚未請求權限   Notification.requestPermission().then(permission => {     if (permission === 'granted') {       // 可以發送通知       new Notification('新消息', { body: '您有新的消息' });     }   }); }
  1. 提供友好的提示:如果用戶拒絕了通知權限,不要直接放棄,可以提供一個友好的提示,告訴用戶開啟通知權限的好處,并引導用戶去瀏覽器設置中開啟。

  2. 避免過度打擾:不要頻繁地請求通知權限,這會讓用戶感到厭煩。只有在用戶明確需要接收通知的情況下,才請求權限。

如何在不同瀏覽器中保持通知樣式一致

不同瀏覽器對通知的顯示方式略有差異,可以通過一些技巧來保持通知樣式的一致性。

  1. 使用統一的圖標:為通知設置一個統一的圖標,可以提高用戶對應用的識別度。

  2. 控制通知內容長度:不同瀏覽器對通知內容長度的限制可能不同,盡量控制通知內容長度,避免內容被截斷。

  3. 使用 css 樣式:雖然不能直接使用 CSS 樣式來控制通知的樣式,但可以通過一些間接的方式來實現。比如,可以自定義通知的 html 結構,然后使用 CSS 樣式來控制 HTML 元素的樣式。但這需要借助一些第三方庫或框架。

如何測試消息通知功能

測試消息通知功能需要注意以下幾點:

  1. 確保已獲得通知權限:在測試之前,確保瀏覽器已授權通知權限。

  2. 在不同瀏覽器中測試:不同瀏覽器對通知的實現可能略有差異,需要在不同瀏覽器中進行測試。

  3. 測試不同場景:測試在應用在前臺、后臺、關閉狀態下,是否都能收到通知。

  4. 測試通知的點擊事件:確保點擊通知后,能夠正確地跳轉到應用的相關頁面。

  5. 模擬網絡延遲:模擬網絡延遲,測試在網絡狀況不佳的情況下,通知是否能夠正常送達。

消息通知的實現方式有很多種,選擇哪種方式取決于具體的應用場景和需求。原生 Notification API 簡單易用,適合簡單的通知場景;WebSockets 和 SSE 適合實時性要求高的場景;第三方消息推送服務功能強大,適合復雜的應用場景;輪詢則是一種最后的選擇。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享