基于YJS和Excalidraw的本地部署的思路

大家好呀,今天简单聊聊如何通过Yjs私有化部署一个支持协同和存储Excalidraw白板的思路 公司的需求,其实业务上还是蛮需要一个私有化的白板系统,miro买不起,drawio被嫌弃太丑,倒是excalidraw入了法眼,但是又不肯出什么钱,就给了两天时间研究一下 本身看到了大佬的文章 链接 再考虑是否可以跟着部署三个服务 但是试用了下来因为本身需要基于一个魔改版的excalidraw,本身和现在官方版本已经隔了很久了,样式上肯定是不符合需求 本身都已经开始考虑放弃这块方案,看看官方的discuss里通过clone一份修改对应环境变量了来通过elcalidraw-room来进行协同了,后端方案豆打算临时不管了 但是在浏览官方api文档的时候,倒是发现可以手动设置协同状态以及手动设置screen上的显示数据 那么如果我用官方的版本,配合上动态修改数据,也可以进行协同啊 本身项目组里的几个项目都是通过yjs进行协同的,那么就动手去github上搜了一下 好巧不巧的是,正好有人开源了 y-excalidraw 这个项目 简单起了一个demo之后,发现确实意外的好用,协同能力也有,唯一的缺憾就是,因为 y-excalidraw 是将资源也写进了yjs内,那么谁也不想如果有人传了点图之后,yjs的数据大小直接爆炸吧 然后考虑到协同目前还是采用websocket比较方便,如果要处理后续的 拓展/重连等场景的话 socketio 又是最好的 底层改为next.js手动添加文件上传下载和协同的api 协同改为本地用yjs-indexeddb做离线编辑,y-socketio做协同处理 将存储画板数据全权代理给了,y-socketio服务器,让这边进行持久化 这样做好处不少 可以使用最新的官方excalidraw,保证不会脱节 通过yjs实现的crdt协同,能够有效的实现离线编辑,多人协作 通过socketio实现的websocket服务,能够自动处理重连等场景,未来也方便通过redis等方案去对协同进行扩容 通过nextjs进行整合,一个服务能解决80%的问题(redis/mongo/minio-server之类的没办法) graph TD subgraph NextApp["Next.js 应用"] Server["自定义服务器"] API["Next.js API路由"] Excalidraw["Excalidraw组件"] MinioClient["MinIO客户端"] YExcalidraw["y-excalidraw"] end subgraph Cloud["云服务"] SocketIO["Socket.IO服务器"] YSocketIO["y-socketio提供者"] Auth["认证层"] end subgraph MongoDB YMongoDB["y-mongodb"] end subgraph MinIO["MinIO存储"] Resources["资源文件"] end Server -->|托管| SocketIO SocketIO -->|实现| YSocketIO YSocketIO -->|提供| Auth YSocketIO -->|通过持久化数据| YMongoDB YMongoDB -->|存储在| MongoDB Excalidraw -->|使用| YExcalidraw YExcalidraw -->|连接到| SocketIO API -->|包含| MinioClient MinioClient -->|存储资源在| MinIO Resources -->|存储在| MinIO 本身我也封装了一个仓库欢迎试用 excalidraw-yjs-starter ...

May 25, 2025 · 4 min · 784 words · yiwei.wu