在 JavaScript 應用中實現即時協作


即時協作已成為現代 Web 應用中必不可少的功能。它允許多個使用者同時協同工作,從而更輕鬆地即時協作和溝通。JavaScript 作為 Web 開發的主導語言,提供了各種工具和框架來無縫地實現即時協作。在本文中,我們將探討在 JavaScript 應用中實現即時協作的不同技術和方法。

WebSockets

WebSockets 為客戶端和伺服器之間提供了一個雙向通訊通道,支援即時資料傳輸。它允許伺服器立即將更新推送到連線的客戶端,從而無需持續輪詢。

示例

讓我們看看如何使用 WebSockets 實現即時協作的示例。

客戶端程式碼

// Client-side code
const socket = new WebSocket('ws://:8080');

// Event listener for WebSocket connection
socket.addEventListener('open', () => {
   console.log('Connected to server');
});

// Event listener for incoming messages
socket.addEventListener('message', (event) => {
   const message = event.data;
   console.log('Received message:', message);
});

// Send a message to the server
socket.send('Hello, server!');

伺服器端程式碼

// Server-side code (Node.js example using ws library)
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

// Event listener for new WebSocket connections
wss.on('connection', (ws) => {
   console.log('New client connected');

   // Event listener for incoming messages from clients
   ws.on('message', (message) => {
      console.log('Received message:', message);

      // Broadcast the message to all connected clients
      wss.clients.forEach((client) => {
         if (client.readyState === WebSocket.OPEN) {
            client.send(message);
         }
      });
   });
});

解釋

在此示例中,客戶端與伺服器建立 WebSocket 連線並偵聽傳入的訊息。伺服器在收到訊息後,將其廣播到所有連線的客戶端。這使得即時協作成為可能,因為一個客戶端所做的任何更改都可以立即反映在其他連線客戶端的螢幕上。

輸出

  • 當客戶端程式碼與伺服器建立 WebSocket 連線時,控制檯將輸出“已連線到伺服器”。

  • 當伺服器端程式碼從客戶端收到 WebSocket 連線時,它將在控制檯中輸出“新客戶端連線”。

  • 當使用 socket.send('Hello, server!') 從客戶端向伺服器傳送訊息時,伺服器將在控制檯中輸出“已收到訊息:Hello, server!”。

  • 如果有多個客戶端連線,伺服器將把收到的訊息廣播到所有連線的客戶端,導致客戶端控制檯中出現多個“已收到訊息:”輸出。

使用操作轉換進行協作編輯

操作轉換 (OT) 是一種用於即時應用中協作編輯的技術。它允許多個使用者同時編輯同一文件,解決衝突並在所有客戶端之間保持一致性。

示例

讓我們看看如何使用 ShareDB 庫實現 OT。

客戶端程式碼

// Client-side code
const socket = new WebSocket('ws://:8080');
const connection = new sharedb.Connection(socket);

const doc = connection.get('documents', 'documentId');

// Event listener for document changes
doc.on('op', (ops, source) => {
   console.log('Received operations:', ops);
  
   // Apply the operations to the local document
   // ...
});

// Retrieve the initial document state
doc.subscribe((err) => {
   if (err) throw err;
  
   console.log('Initial document state:', doc.data);
});

// Make changes to the document
doc.submitOp([{ p: ['content'], t: 'text', i: 'Hello, world!' }]);

伺服器端程式碼

// Server-side code (Node.js example using ShareDB)
const WebSocket = require('ws');
const ShareDB = require('sharedb');
const WebSocketJSONStream = require('websocket-json-stream');

const backend = new ShareDB();
const connection = backend.connect();

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
   console.log('New client connected');
  
   const stream = new WebSocketJSONStream(ws);
   connection.createFetchQuery('documents', {}, null, (err, results) => {
      if (err) throw err;
    
      const doc = results[0];
      stream.pipe(doc.createStream()).pipe(stream);
   });
});

解釋

在此示例中,客戶端透過 WebSockets 連線到伺服器,並使用 ShareDB 同步文件狀態。伺服器建立 ShareDB 連線,從資料庫中獲取文件,並在客戶端和伺服器之間建立雙向資料流。每當客戶端對文件進行更改時,伺服器都會使用 ShareDB 的操作轉換功能將這些更改傳播到其他連線的客戶端。

輸出

  • 當客戶端程式碼與伺服器建立 WebSocket 連線並檢索初始文件狀態時,輸出將取決於現有的文件狀態。它將在控制檯中顯示“初始文件狀態:”,後跟文件的資料。

  • 當使用 doc.submitOp([{ p: ['content'], t: 'text', i: 'Hello, world!' }]) 對文件進行更改時,伺服器將在控制檯中輸出“已接收操作:”,後跟應用的操作。

  • 如果有多個客戶端連線,伺服器將把一個客戶端所做的更改傳播到所有其他連線的客戶端,從而導致所有客戶端的文件即時更新。

結論

即時協作是許多現代 Web 應用中必不可少的功能。JavaScript 提供了多種工具和框架來無縫地實現即時協作。在本文中,我們探討了兩種流行的技術:使用 WebSockets 進行即時通訊以及使用操作轉換實現協作編輯。透過利用這些技術,開發人員可以在其 JavaScript 應用中建立強大的即時協作功能。無論是協作文件編輯器、即時聊天應用還是協作繪圖工具,可能性都是無限的。透過提供的程式碼示例和解釋,您現在擁有了開始在您的 JavaScript 應用中實現即時協作的堅實基礎。

更新於: 2023年7月25日

509 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告