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

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

image.png

项目介绍

image.png

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

它提供了一套全面的实时同步和多用户协作解决方案,具备异步最终一致性、实时查询订阅、数据库集成、水平扩展、字段投影、中间件支持、跨平台使用、离线更改同步、内存数据库测试、历史版本访问和实时用户状态同步等特性。

ShareDB 包括一个 Node.js 服务器,用于协调和提交来自多个客户端的编辑,以及一个可在 Node.js 或浏览器中运行的 JavaScript 客户端,用于操作文档。核心通过操作转换(OT)来处理底层的冲突管理,其实现由 ShareDB 的类型插件负责。

项目安装


npm install --save sharedb

如果服务器和客户端有不同的依赖,ShareDB 应该被添加到两个包中。

也可以安装其他的OT类型。具体类型查看地址:share.github.io/sharedb/typ…

基本使用

Node服务端

服务端示例使用 Expressws 作为 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 = WebSocket.Server({server: server})
var backend = new ShareDB()
webSocketServer.on('connection', (webSocket) => {
  var stream = new WebSocketJSONStream(webSocket)
  backend.listen(stream)
})
server.listen(8080)

客户端

客户端示例使用 ShareDBConnection 来获取文档,订阅文档变化,并在浏览器中增加计数器的值。


var ReconnectingWebSocket = require('reconnecting-websocket')
var Connection = require('sharedb/lib/client').Connection
var socket = new ReconnectingWebSocket('ws://localhost:8080', [], {
  // ShareDB handles dropped messages, and buffering them while the socket
  // is closed has undefined behavior
  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 is undefined, the document has not been created, so let's create it
  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 = () => {
  // Increment the counter by 1
  doc.submitOp([{p: ['counter'], na: 1}])
}

适配器

数据库适配器

ShareDB 支持多种数据库,包括MemoryDBShareDBMongoShareDBMingoMemoryShareDBPostgres

使用方式:


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

发布/订阅适配器

发布/订阅(pub/sub)适配器,包括内存型(MemoryPubSub)Redis(ShareDBRedisPubSub)WebSocket总线(ShareDBWSBusPubSub)适配器

使用方式:


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

里程碑适配器

ShareDB 的里程碑适配器目前只支持 ShareDBMilestoneMongo,它用于存储文档的定期快照以加速文档历史记录的访问,并通过中间件自定义快照行为。

官方示例

计数器

排行榜

更多官方示例可以下方地址中查阅:

github.com/share/share…

总结

github地址:github.com/share/share…

我们在服务端代码中演示了如何设置 Express 应用、WebSocket 服务器和流式转换。

在客户端代码演示了创建 WebSocket,连接到 ShareDB 服务器,获取文档,订阅文档操作,以及如何提交操作来更新文档。

介绍了 ShareDB 适配器的支持情况和基本使用。

希望通过对ShareDB的简单介绍,能对你了解和使用它有一定的帮助。



相关文章
|
前端开发 JavaScript Java
Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户
Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户
Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户
|
Web App开发 编解码 安全
【WebRTC 入门教程】全面解析WebRTC:从底层原理到Qt和FFmpeg的集成应用
【WebRTC 入门教程】全面解析WebRTC:从底层原理到Qt和FFmpeg的集成应用
5405 2
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
2928 3
|
Java Android开发 p3c
Alibaba Java Coding Guidelines安装使用教程
Alibaba Java Coding Guidelines安装使用教程
8406 0
Alibaba Java Coding Guidelines安装使用教程
|
9月前
|
人工智能 IDE 程序员
GitHub Copilot 免费了!程序员们的福音来了!
《GitHub Copilot 免费了!程序员们的福音来了!》 近日,GitHub 宣布其 AI 编程助手 GitHub Copilot 现在可以免费使用。曾经每月需支付 10 美元订阅费的 Copilot,现在向所有人开放免费版本,这对个人开发者、初学者和小型团队来说是个大好消息。免费版支持 GPT 和 Claude 模型,并提供每月 2000 次代码补全和 50 条聊天消息等核心功能。用户只需注册或登录 GitHub 账户,在 VS Code 中安装扩展并激活免费版即可使用。此外,Visual Studio Code 也完全免费,进一步降低了开发门槛。 除了
10698 7
GitHub Copilot 免费了!程序员们的福音来了!
|
10月前
|
应用服务中间件 网络安全 nginx
轻松上手Nginx Proxy Manager:安装、配置与实战
Nginx Proxy Manager (NPM) 是一款基于 Nginx 的反向代理管理工具,提供直观的 Web 界面,方便用户配置和管理反向代理、SSL 证书等。本文档介绍了 NPM 的安装步骤,包括 Docker 和 Docker Compose 的安装、Docker Compose 文件的创建与配置、启动服务、访问 Web 管理界面、基本使用方法以及如何申请和配置 SSL 证书,帮助用户快速上手 NPM。
6004 1
|
11月前
|
人工智能 JavaScript 数据可视化
Cursor、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比
本文深入解析了 Cursor AI、v0 和 Bolt.new 三大 AI 编程工具的特点与应用场景。Cursor 适合日常编码与团队协作,v0 专注于 UI 原型设计,Bolt.new 擅长全栈原型开发。各工具在功能上互为补充,开发者可根据需求灵活选择,以提升工作效率。
4780 1
|
10月前
|
弹性计算 搜索推荐 安全
如何编写有效的Prompt模板:提升大模型性能的关键
在大模型应用中,编写有效的Prompt至关重要。本文介绍了如何编写高质量的Prompt模板,包括明确任务定义、选择高质量示例、优化任务指示和调整示例顺序。详细探讨了百炼平台提供的三种主要Prompt模板(ICIO、CRISPE、RASCEF)及静态和动态样例库的创建与应用,帮助提升模型性能。
709 0
|
安全 Linux 网络安全
登录神器:Hydra 保姆级教程
登录神器:Hydra 保姆级教程
|
存储 JSON JavaScript
使用JavaScript实现实时在线协作编辑器:从设计到实现
使用JavaScript实现实时在线协作编辑器:从设计到实现