如何使用 TinyEditor 快速部署一个协同编辑器
本文由曹里林同学原创。
简介
TinyEditor 是一个框架无关的富文本编辑器,既可以在原生 JavaScript 项目中使用,也可以在 Vue、React 等前端框架中使用。
本篇文章带来的是如何使用 TinyEditor 最新的协同编辑模块快速部署多人实时协作编辑。
前端集成
1、安装TinyEditor
首先需要安装 TinyEditor
pnpm i @opentiny/fluent-editor
编写 Html 引入 TinyEditor 和对应的样式
@import '@opentiny/fluent-editor/style.css';
<div id="editor">
<p>Hello TinyEditor!</p>
</div>
import FluentEditor from '@opentiny/fluent-editor'
const editor = new FluentEditor('#editor', {
theme: 'snow',
})
至此已经引入了 TinyEditor 编辑器,接下来安装协同编辑模块。
2、安装协同编辑模块
安装额外依赖
pnpm i quill-cursors y-protocols y-quill yjs y-indexeddb y-websocket
引入协同编辑模块
import FluentEditor, { CollaborationModule } from '@opentiny/fluent-editor'
FluentEditor.register('modules/collaborative-editing', CollaborationModule, true)
编辑器基础配置:通过配置 serverUrl 和 roomName, 双方进行协同编辑通信
const editor = new FluentEditor('#editor', {
theme: 'snow',
modules: {
'collaborative-editing': {
provider: {
type: 'websocket',
options: {
serverUrl: 'wss://demos.yjs.dev/ws', // 正式环境更换成正式服务地址
roomName: 'Tiny-Editor-Demo-juejin', // 双方通信的房间名
},
},
},
},
})
现在协同编辑已经可用。
3、Provider配置
Provider 是协同编辑的核心,它负责管理客户端和服务器之间的数据同步。TinyEditor 支持多种 Provider 类型,最常见的是 WebSocket Provider 和 WebRTC Provider。
WebSocket Provider
这是最常用的连接方式,通过标准的 WebSocket 协议与后端服务器进行通信。
示例配置:
const editor = new FluentEditor('#editor', {
modules: {
'collaborative-editing': {
provider: {
type: 'websocket',
options: {
serverUrl: 'wss://demos.yjs.dev/ws',
roomName: 'my-unique-document-id',
},
},
},
},
});
WebRTC Provider
注意: 需要额外安装 WebRTC 依赖 pnpm i y-webrtc。使用这种方式采用点对点连接,不需要中心化的 WebSocket 服务器,更适合低延迟和对网络拓扑有特殊要求的场景。
示例配置:
const editor = new FluentEditor('#editor', {
modules: {
'collaborative-editing': {
provider: {
type: 'webrtc',
options: {
roomName: 'tiny-editor-webrtc-demo',
signaling: ['wss://signaling.yjs.dev'],
},
},
},
},
});
4、Awareness 配置
Awareness 模块负责同步用户的在线状态、光标位置和选区。通过配置,你可以自定义用户的显示信息。
Awareness 实现用户在线状态、光标位置等信息的实时同步。每个用户的在线状态、名称、颜色、光标位置等会自动广播给其他协作者,实现多人编辑时的身份和操作可视化。
Awareness 结构
示例配置:
awareness: {
state: {
name: `user${Math.random().toString(36).substring(2, 8)}`,
color: `#${Math.floor(Math.random() * 16777215).toString(16)}`
},
timeout: 30000,
}
5、Cursor 配置
cursors 默认开启,并且支持以下配置(详细配置可见 quill-cursors):
注意光标模板内的类名不可变
示例配置:
const CURSOR_CLASSES = {
SELECTION_CLASS: 'ql-cursor-selections',
CARET_CONTAINER_CLASS: 'ql-cursor-caret-container',
CARET_CLASS: 'ql-cursor-caret',
FLAG_CLASS: 'ql-cursor-flag',
NAME_CLASS: 'ql-cursor-name',
}
cursors: {
template: `
<span class="${CURSOR_CLASSES.SELECTION_CLASS}"></span>
<span class="${CURSOR_CLASSES.CARET_CONTAINER_CLASS}">
<span class="${CURSOR_CLASSES.CARET_CLASS}"></span>
</span>
<div class="${CURSOR_CLASSES.FLAG_CLASS}">
<small class="${CURSOR_CLASSES.NAME_CLASS}"></small>
</div>
`,
hideDelayMs: 300,
hideSpeedMs: 300,
transformOnTextChange: true,
}
6、事件回调
后端部署
TinyEditor 的协同编辑后端服务已为你准备好 Docker 镜像,只需简单几步即可快速部署,无需复杂的本地环境配置。
1、准备 Docker 环境
确保你的机器上已安装 Docker 和 Docker Compose。
2、拉取镜像并配置
在您的项目根目录下创建 docker-compose.yml 文件。
docker-compose.yml 此文件定义了两个服务:mongodb(用于数据持久化)和 websocket-server(协同编辑后端服务)。
-
如果您没有可用的 MongoDB 服务:
- 请使用完整的 docker-compose.yml 文件,它会自动启动一个名为 mongodb 的服务。
-
如果您已经有可用的 MongoDB 服务:
-
您不需要启动 mongodb 服务(可以将其从 docker-compose.yml 文件中删除或注释掉)。
-
您只需修改 websocket-server 服务中的 MONGODB_URL 环境变量,将其指向您现有的 MongoDB 实例地址。
services: mongodb: image: mongo:latest container_name: yjs-mongodb restart: always ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: admin # 设置 MongoDB 初始用户名 MONGO_INITDB_ROOT_PASSWORD: admin!123 # 设置 MongoDB 初始密码 volumes: - mongodb_data:/data/db
websocket-server: image: yinlin124/collaborative-editor-backend:latest container_name: yjs-websocket-server restart: always ports: - "${PORT:-1234}:${PORT:-1234}" environment: HOST: ${HOST:-0.0.0.0} # 设置后端监听的网络接口 PORT: ${PORT:-1234} # 默认 1234 端口,可以使用环境变量修改 MONGODB_URL: ${MONGODB_URL:-mongodb://admin:admin!123@mongodb:27017/?authSource=admin} # 如果你使用自己的 mongodb 服务需要修改此项 MONGODB_DB: ${MONGODB_DB:-tinyeditor} # 数据库名称 MONGODB_COLLECTION: ${MONGODB_COLLECTION:-documents} # 集合名称
depends_on: - mongodbvolumes: mongodb_data:
-
如果你需要更换映射端口等,可创建 .env 文件按照下面的参数值更改环境变量:
3、一键启动服务
在项目根目录下运行 docker-compose 命令,Docker 会自动下载镜像、创建容器并启动服务。
docker compose up -d
后端启动后将前端编辑器配置中的 serverUrl 改成对应的服务器 IP:port。
更多需求
如果你有自定义持久化或者自定义 provider 等需求可查看文档:https://opentiny.github.io/tiny-editor/docs/demo/collaborative-editing,有任何问题也可到仓库提 issue。
关于OpenTiny
欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
📦 GitHub:https://github.com/opentiny (欢迎star)
OpenTiny NEXT 正式发布,官网、文档、示例、Demo 一站配齐。未来已来,欢迎上车!
同时欢迎大家进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~ 如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
金辑奖双奖加冕 东软引领汽车供应链价值跃迁
10月30日,在由盖世汽车主办的2025第七届“金辑奖”颁奖盛典上,东软集团凭借在智能汽车互联领域持续的产品创新与卓越的全球化实践,斩获“中国汽车新供应链百强”和“最佳出海实践奖”两项殊荣。双奖加冕,既是对东软技术实力与行业地位的权威认证,更是东软作为产业共创者,引领中国汽车新供应链从“配套支持”向“生态赋能”跃迁的价值彰显。 硬核突破引领智能驾舱加速进化 当前,中国汽车产业正站在技术突破与格局重塑的双重拐点。供应链的战略地位被提升至前所未有的高度,其价值核心正从“单项技术创新”向着“构建产业生态、赋能整车进阶”加速演进。东软以前瞻布局和平台化能力,顺应整车电子电气架构演进趋势,形成了完善的智能驾舱系列产品矩阵。覆盖车载信息娱乐系统、旗舰式智能座舱域控、融合AI的智能跨域控制器,以及高集成、高性能舱行泊一体解决方案——东软A³舱行泊产品平台。东软不断推进汽车从“单域智能”到“跨域融合”的飞跃,满足全球车企不同车型产品对算力与功能的需要。 面对全球市场的不确定性与产业对供应链安全的迫切需求,东软智能驾舱系列产品既能基于国际主流芯片提供顶级的性能体验,也实现了基于国产芯片方案的量产落地,展...
-
下一篇
真实案例解析缓存大热key的致命陷阱
引言 在现代软件架构中,缓存是提高系统性能和响应速度的重要手段。然而,如果不正确地使用缓存,可能会导致严重的线上事故,尤其是缓存的大热key问题更是老生常谈。本文将探讨一个常见但容易被忽视的问题:缓存大热key和缓存击穿问题。我们将从一个真实案例入手,分析其原因,并提供解决方案和预防措施。 案例描述 某系统在双十一大促期间,遇到了一个严重的线上事故。业务人员在创建一个大型活动,该大型活动由于活动条件和活动奖励比较多,导致生成的缓存内容非常大。活动上线后,系统就开始出现各种异常告警,核心UMP监控可用率由100%持续下降到20%,系统访问Redis的调用次数和查询性能也断崖式下降,后续更是产生连锁反应影响了其他多个核心接口的可用率,导致整个系统服务不可用。 原因分析 在这个系统中,为了提高查询活动的性能,我们开发团队决定使用Redis作为缓存系统。将每个活动信息作为一个key-value存储在Redis中。由于业务需要,有时候业务运营人员也会创建一个非常庞大的活动,来支撑双十一期间的各种玩法。针对这种庞大的活动,我们开发团队也提前预料到了可能会出现的大key和热key问题,所以在查询活动...
相关文章
文章评论
共有0条评论来说两句吧...










微信收款码
支付宝收款码