ShareDB:构建实时应用从未如此简单
项目介绍
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
,用于存储文档的定期快照以加速文档历史记录的访问。
官方示例
排行榜
更多官方示例请参考:ShareDB 官方 GitHub 示例
总结
ShareDB 是一个非常强大的工具,适用于构建各种实时应用。本文展示了如何使用 ShareDB 设置服务端和客户端,通过 WebSocket 实现实时文档操作,并订阅文档更新。
GitHub 地址:https://github.com/share/sharedb