Skip to content

协作编辑

TinyEditor 支持多人实时协作编辑功能,基于 Yjs 实现,支持 WebSocket 和 WebRTC 等连接方式。

前端依赖安装

基础协作编辑(必需):

bash
npm i quill-cursors y-protocols y-quill yjs y-indexeddb

连接支持:选择一种即可(要与对应后端协议匹配)

bash
npm i y-websocket
bash
npm i y-webrtc

在线协同演示

下面是一个完整的协同编辑演示:

基本用法

通过配置 collaborative-editing 模块可以开启协作编辑功能:

模块注册:

javascript
import FluentEditor from '@opentiny/fluent-editor'
FluentEditor.register('modules/collaborative-editing', CollaborationModule, true)

编辑器配置:

javascript
const editor = new FluentEditor('#editor', {
  theme: 'snow',
  modules: {
    'collaborative-editing': {
      provider: {
        type: 'websocket',
        options: {
          serverUrl: 'ws://localhost:1234',
          roomName: 'my-document',
        },
      },
      awareness: {
        state: {
          name: `user${Math.random().toString(36).substring(2, 15)}`,
          color: 'red',
        },
      },
      onConnect: () => {
        console.log('connected')
      },
      onDisconnect: () => {
        console.log('disconnected')
      },
      onSyncChange: (isSynced) => {
        console.log('synced', isSynced)
      },
    },
  },
})

后端集成

选择其中一种作为后端服务支持

WebSocket 服务器

可以使用 y-websocket-server 快速搭建 WebSocket 服务器。

shell
git clone https://github.com/yjs/y-websocket-server.git
cd y-websocket-server
pnpm i
HOST=localhost PORT=1234 YPERSISTENCE=./dbDir npx y-websocket

HOST指定可访问地址,PORT指定暴露端口,YPERSISTENCE指定持久化目录。

WebRTC 服务器

可以使用 y-webrtc-server 快速搭建 WebRTC 服务器。

shell
git clone https://github.com/yjs/y-webrtc.git
cd y-webrtc
pnpm i
HOST=localhost PORT=4444 npx y-webrtc

自定义持久化

如果你有需要自定义持久化(存储到第三方数据库服务器),可以参考 y-websocket-custom-persistence, 对 y-websocket-server 进行修改

shell
git clone https://github.com/Yinlin124/y-websocket-custom-persistence.git
cd y-websocket-custom-persistence
pnpm i
cp .env.example .env
pnpm start

配置说明

配置参数表格

参数类型必填说明
providerWebRTCProviderConfig | WebsocketProviderConfig | CustomProviderConfig连接提供者配置
awarenessAwarenessOptions用户感知配置
cursorsboolean | object光标显示配置
ydocY.Doc自定义 Yjs 文档实例
onConnect() => void连接成功回调
onDisconnect() => void连接断开回调
onError(error: Error) => void错误处理回调
onSyncChange(isSynced: boolean) => void同步状态变化回调

provider(连接提供者)

WebSocket 提供者配置:

javascript
provider: {
  type: 'websocket',
  options: {
    serverUrl: 'ws://localhost:1234',  // WebSocket 服务器地址
    roomName: 'my-document',          // 房间名称
    connect: true,                    // 是否自动连接,默认 true
    params: {},                       // 连接参数
    protocols: [],                    // WebSocket 协议
    resyncInterval: -1,               // 重新同步间隔(毫秒)
    maxBackoffTime: 2500,             // 最大退避时间
    disableBc: false                  // 是否禁用广播通道
  }
}

WebRTC 提供者配置:

javascript
provider: {
  type: 'webrtc',
  options: {
    signaling: ['wss://signaling-server.com','wss://localhost:4444'], // 信令服务器列表
    roomName: 'my-document',          // 房间名称
    password: null,                   // 房间密码
    awareness: true,                  // 是否启用感知
    maxConns: 20,                     // 最大连接数
    filterBcConns: true,              // 是否过滤广播连接
    peerOpts: {}                      // WebRTC 对等连接选项
  }
}

自定义提供者配置:(待写)

awareness(用户感知)

用于配置用户状态信息,让其他用户能够看到当前用户的信息:

javascript
awareness: {
  state: {
    name: 'John Doe',                 // 用户名称,显示在光标旁
    color: '#ff6b6b'                  // 用户颜色,用于光标和选区
  },
  timeout: 30000,                     // 用户状态超时时间(毫秒)
}

事件回调

回调函数参数说明
onConnect成功连接到协作服务器时触发
onDisconnect与协作服务器连接断开时触发
onErrorerror: Error发生错误时触发,包含错误信息
onSyncChangeisSynced: boolean文档同步状态变化时触发,true 表示已同步

光标配置

具体含义可参照 quill-cursors

javascript
cursors: {
  template: '<div class="custom-cursor">...</div>',
  hideDelayMs: 5000,
  hideSpeedMs: 0,
  selectionChangeSource: null,
  transformOnTextChange: true,
},

Made with ❤ by