当前位置: 首页 > news >正文

如何使用 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: alwaysports:- "27017:27017" environment:MONGO_INITDB_ROOT_USERNAME: admin # 设置 MongoDB 初始用户名MONGO_INITDB_ROOT_PASSWORD: admin!123 # 设置 MongoDB 初始密码volumes:- mongodb_data:/data/dbwebsocket-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:- mongodb volumes: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 一起参与交流前端技术~
🌐 官网:https://opentiny.design
📦 GitHub:https://github.com/opentiny (欢迎star)

OpenTiny NEXT 正式发布,官网、文档、示例、Demo 一站配齐。未来已来,欢迎上车!

同时欢迎大家进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~
如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

http://www.dtcms.com/a/540146.html

相关文章:

  • pgsql常用函数
  • 企业落地 NL2SQL,需要的是 AI-ready data 和小模型
  • 最好的购物网站排名厦门的推广公司有哪些
  • PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
  • 外贸网站建设gif制作软件app
  • 我回来了,依然关注新能源汽车研发测试,
  • Go 语言数组
  • Go语言-->sync.WaitGroup 详细解释
  • 从“造机器”到“造生态”:中国智能时代的系统跃迁——从宇树实训平台到视频神经系统的启示
  • YOLOV5_TensorRT_C++部署
  • 海南省住房和城乡建设官方网站网站域名不备案
  • 网络空间引擎
  • VANCHIP射频芯片:智能汽车的“第六感”觉醒
  • C++——二叉搜索树——数据结构进阶——附加超详细解析过程/代码实现
  • 网站页面两侧漂浮的怎样做电商网站前端页面内容编写
  • PCIE学习
  • API Key 管理与计费系统模块(API Gateway 模块)需求文档
  • 2024-2025年技术发展趋势深度分析:AI、前端与后端开发的革新之路
  • vue3 实现贪吃蛇 电脑版01
  • 做网站带后台多少钱东莞做网站 动点官网
  • 郑州做网站建设wordpress数据控查看密码
  • 数据采集-BeautifulSoup库
  • 帝国cms的阅读量增加的api接口示例
  • RDF 实例
  • 面向对象编程:继承从理论到实战
  • 43-基于STM32的医用护理床设计与实现
  • 【经济方向专题会议】第二届经济数据分析与人工智能国际学术会议 (EDAI 2025)
  • Auto CAD二次开发——折线多段线
  • django做的购物网站海口网站建设优化案例
  • 一个密码破解器