编程 ShareDB:构建实时应用从未如此简单

2024-11-18 08:39:58 +0800 CST views 1128

ShareDB:构建实时应用从未如此简单

项目介绍

images

ShareDB 是一个支持多用户实时协作的全栈库,适用于构建需要同步数据更新的各种在线应用,如在线文档编辑器、实时仪表板、多玩家游戏等。它具备多种强大的功能:

  • 异步最终一致性
  • 实时查询订阅
  • 数据库集成
  • 水平扩展
  • 字段投影
  • 中间件支持
  • 跨平台使用
  • 离线更改同步
  • 内存数据库测试
  • 历史版本访问
  • 实时用户状态同步

ShareDB 由一个 Node.js 服务器协调多个客户端的编辑,客户端可以运行在 Node.js 或浏览器中。它通过操作转换(OT)来管理冲突,操作转换由 ShareDB 的类型插件实现。

项目安装

npm install --save sharedb

ShareDB 需要同时在服务器和客户端安装。可以根据需要安装其他 OT 类型,详细信息请查看 类型文档

基本使用

Node.js 服务端

以下示例展示了使用 Express 和 ws 作为 WebSocket 服务器,并通过 @teamwork/websocket-json-stream 将 WebSocket 转换为 Stream。

var express = require('express');
var WebSocket = require('ws');
var http = require('http');
var ShareDB = require('sharedb');
var WebSocketJSONStream = require('@teamwork/websocket-json-stream');

var app = express();
var server = http.createServer(app);
var webSocketServer = new WebSocket.Server({ server: server });

var backend = new ShareDB();
webSocketServer.on('connection', (webSocket) => {
  var stream = new WebSocketJSONStream(webSocket);
  backend.listen(stream);
});

server.listen(8080);

客户端

客户端示例展示了如何使用 ShareDB 的 Connection 获取文档、订阅文档变化,并在浏览器中增加计数器的值。

var ReconnectingWebSocket = require('reconnecting-websocket');
var Connection = require('sharedb/lib/client').Connection;

var socket = new ReconnectingWebSocket('ws://localhost:8080', [], {
  // ShareDB 处理丢失的消息,关闭时缓冲消息行为未定义
  maxEnqueuedMessages: 0,
});

var connection = new Connection(socket);
var doc = connection.get('doc-collection', 'doc-id');

doc.subscribe((error) => {
  if (error) return console.error(error);

  // 如果文档尚未创建,创建一个新文档
  if (!doc.type) {
    doc.create({ counter: 0 }, (error) => {
      if (error) console.error(error);
    });
  }
});

doc.on('op', (op) => {
  console.log('count', doc.data.counter);
});

window.increment = () => {
  // 计数器加 1
  doc.submitOp([{ p: ['counter'], na: 1 }]);
};

适配器

数据库适配器

ShareDB 支持多种数据库适配器,包括 MemoryDB、ShareDBMongo、ShareDBMingoMemory 和 ShareDBPostgres。

const backend = new Backend({
  db: new MemoryDB(),
});

发布/订阅适配器

ShareDB 支持多种发布/订阅(pub/sub)适配器,如内存型(MemoryPubSub)、Redis(ShareDBRedisPubSub)和 WebSocket 总线(ShareDBWSBusPubSub)。

const backend = new Backend({
  pubsub: new MemoryPubSub(),
});

里程碑适配器

ShareDB 的里程碑适配器目前只支持 ShareDBMilestoneMongo,用于存储文档的定期快照以加速文档历史记录的访问。

官方示例

排行榜

images

更多官方示例请参考:ShareDB 官方 GitHub 示例

总结

ShareDB 是一个非常强大的工具,适用于构建各种实时应用。本文展示了如何使用 ShareDB 设置服务端和客户端,通过 WebSocket 实现实时文档操作,并订阅文档更新。

GitHub 地址:https://github.com/share/sharedb

复制全文 生成海报 实时协作 开发工具 Web开发

推荐文章

一键压缩图片代码
2024-11-19 00:41:25 +0800 CST
go命令行
2024-11-18 18:17:47 +0800 CST
2025年,小程序开发到底多少钱?
2025-01-20 10:59:05 +0800 CST
ElasticSearch简介与安装指南
2024-11-19 02:17:38 +0800 CST
如何在 Vue 3 中使用 TypeScript?
2024-11-18 22:30:18 +0800 CST
Vue3中的v-model指令有什么变化?
2024-11-18 20:00:17 +0800 CST
避免 Go 语言中的接口污染
2024-11-19 05:20:53 +0800 CST
在Rust项目中使用SQLite数据库
2024-11-19 08:48:00 +0800 CST
2025,重新认识 HTML!
2025-02-07 14:40:00 +0800 CST
api远程把word文件转换为pdf
2024-11-19 03:48:33 +0800 CST
开发外贸客户的推荐网站
2024-11-17 04:44:05 +0800 CST
H5端向App端通信(Uniapp 必会)
2025-02-20 10:32:26 +0800 CST
MySQL 1364 错误解决办法
2024-11-19 05:07:59 +0800 CST
PHP 微信红包算法
2024-11-17 22:45:34 +0800 CST
Claude:审美炸裂的网页生成工具
2024-11-19 09:38:41 +0800 CST
Rust开发笔记 | Rust的交互式Shell
2024-11-18 19:55:44 +0800 CST
JavaScript设计模式:桥接模式
2024-11-18 19:03:40 +0800 CST
JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
乐观锁和悲观锁,如何区分?
2024-11-19 09:36:53 +0800 CST
程序员茄子在线接单