用SyncKit打造类Google Docs实时协作编辑器:LocalWrite Demo源码拆解
用SyncKit打造类Google Docs实时协作编辑器LocalWrite Demo源码拆解【免费下载链接】synckitLocal-first collaboration SDK for React, Vue, and Svelte. Batteries-included: Rich text, undo/redo, cursors, and presence.项目地址: https://gitcode.com/gh_mirrors/syncki/synckitSyncKit 是一个面向 React、Vue、Svelte 的 Local-first 实时协作编辑器 SDK自带富文本、撤销重做、实时光标与在线状态Presence。它的官方 Demo——LocalWrite——就是一个类 Google Docs 的多人协作编辑器打开两个标签页输入文字会看到字符级实时同步、冲突自动合并、他人光标跟随等核心协作能力。本文带你逐层拆解 LocalWrite Demo 的源码帮你理解如何从零搭出自己的实时协作编辑器。LocalWrite Demo 是什么代码在哪里LocalWrite 是 SyncKit 的旗舰示例包名就叫synckit-localwrite见 demo/package.json它把 SDK 的全部能力装进了一个 Notion 风格的博客编辑器能力对应实现区块化文档编辑Slash 命令、拖拽排序demo/src/components/Editor.tsx字符级实时文本同步demo/src/hooks/useBlockText.ts实时光标 在线状态demo/src/components/Cursors.tsx房间路由与分享链接demo/src/lib/rooms.ts离线优先存储OPFS/IndexedDBdemo/src/lib/storage.ts整体思路一句话概括页面元数据用 LWW 文档同步正文文字用 Fugue CRDT 同步光标和在线状态走 Awareness 广播。三层各用对的工具正是类 Google Docs 体验的关键。初始化 SyncKit5 行代码接通协作能力入口在 demo/src/App.tsx它只负责一件事——调用initializeSyncKit()并注入 React Contextconst { synckit, storage } await initializeSyncKit(); // ... SyncKitProvider synckit{synckit} storageType{storage.type} AppContent / /SyncKitProvider真正的核心逻辑在 demo/src/lib/synckit.ts整个初始化只有 5 行const storageInfo await initializeStorage(); // 1. 本地存储 const synckit new SyncKit({ // 2. 创建实例 name: localwrite, storage: storageInfo.storage, serverUrl: wss://synckit-localwrite.fly.dev/ws, // 3. 可选接入服务端 }); await synckit.init(); // 4. 启动同步引擎三个要点值得学习storage本地存储是可信源设备数据先落盘再同步断网也能继续编辑serverUrl可选参数。不传就纯本地/跨标签页同步传了才接入 WebSocket 服务器做多设备协作Context 注入demo/src/contexts/SyncKitContext.tsx全应用共享同一个 SyncKit 实例任何组件用useSyncKit()取用避免重复初始化。房间路由URL 怎么映射成同步文档Google Docs 靠文档链接拉人协作LocalWrite 用 URL hash 实现同样的房间模型代码见 demo/src/lib/rooms.tswindow.location.hash /room/abc123; // 分享链接关键函数roomToDocumentId()把房间 ID 转成 SyncKit 的文档 IDexport function roomToDocumentId(roomId: string, isPrivate: boolean false): string { return isPrivate ? proom:${roomId} : room:${roomId}; }这样#/room/abc123和#/proom/abc123私有房间就自然映射到两份不同的同步文档。任何人打开同一个房间链接App.tsx会用这个 ID 执行synckit.document(...)doc.init()自动从服务器拉取最新内容——这就是一个链接拉进一个协作空间的全部秘密。数据模型为什么用每块一字段而不是数组这是 Demo 中最值得抄的架构决策见 demo/src/lib/blocks.ts。LocalWrite 没有把整篇文档存成一个大数组而是每个区块标题、段落、待办……作为文档的一个独立字段export interface PageDocument { id: string; title: string; blockOrder: string; // [block-1,block-2] 顺序表 [key: string]: unknown; // block:block-1: { id, type, content, ... } ← 每个区块一个字段 // block:block-2: { ... } }源码注释特意强调 do NOT use arrays!。原因是 SyncKit 文档字段走 Last-Write-Wins 合并两个人同时编辑不同区块互不干扰若整个页面是一个数组任何人的插入都会触发整体覆盖合并并发编辑极易丢内容。顺序表 独立字段是区块编辑器对抗写冲突的标准姿势。字符级实时同步Fugue CRDT 是怎么接入的页面元数据用 LWW 足够但正文文字需要两人同时打字谁都不丢这就要靠 CRDT。Demo 的封装在 demo/src/hooks/useBlockText.tsconst text synckit.text(${pageId}:text:${blockId}); // 每个区块一个 SyncText await text.init(); text.subscribe((newContent) setContent(newContent)); // 订阅远端变更编辑流程是useBlockText的updateContent()ContentEditable 输入产生新字符串computeTextDiff()对比新旧内容算出最少的插入/删除操作序列逐条text.insert(pos, str)/text.delete(pos, len)应用到 Fugue CRDT远端变更到达后CRDT 自动合并subscribe回调刷新 UI。其中两个工程细节很实用多操作时用beginBatch()/endBatch()批量提交避免跨标签页广播产生竞态操作前重新校验位置合法性应对并发编辑导致的偏移。区块渲染层 demo/src/components/CRDTBlockComponent.tsx 只是把这个 Hook 包进可编辑组件——内容不再由父组件传值而是 CRDT 自己说了算。实时光标与在线状态Awareness 广播看到别人的光标在动是类 Google Docs 体验的灵魂实现见 demo/src/components/Cursors.tsxconst awareness synckit.getAwareness(documentId); await awareness.init(); // 订阅他人状态用户信息、光标位置、是否正在打字光标、选区、正在输入…这类状态不参与数据合并只是临时广播所以 SyncKit 用独立的 Awareness 通道承载本地输入时更新自己的状态远端状态驱动[Cursors.tsx](https://link.gitcode.com/i/28d231b3f4c4c1296ab295ad84849e1c)渲染彩色光标与打字指示。注意它的注释强调该组件是READ-ONLY——只读订阅他人状态本地状态由 Editor 统一写入防止自己覆盖自己这是多人协作 UI 的经典防坑点。离线优先断网继续写恢复自动同步LocalWrite 默认完全离线可用。存储层在 demo/src/lib/storage.ts// 优先 OPFS写入快 3.75 倍、读取快 6 倍不支持时回退 IndexedDB const storage new OPFSStorage(); // 首选 await storage.init(); // 失败则 const storage new IndexedDBStorage(); // 兜底这套本地存储 操作队列 断点续传意味着飞机上编辑照常保存落地联网后操作队列自动重放同步——这正是 SyncKit True offline-first 的承诺文档可见 docs/guides/offline-first.md。部署与延伸阅读Demo 附带 demo/Dockerfile 和 demo/fly.toml一条fly deploy就能上线Nginx 静态托管 官方服务器接收同步流量。想动手跑起来git clone https://gitcode.com/gh_mirrors/syncki/synckit cd synckit/demo npm install npm run dev # 本地纯离线即可体验两个标签页互相协作源码导读地图demo/src/App.tsx入口、路由与全局状态demo/src/lib/synckit.tsSDK 初始化demo/src/lib/rooms.ts房间模型demo/src/lib/blocks.ts区块数据模型demo/src/hooks/useBlockText.tsCRDT 文本同步demo/src/components/Cursors.tsx实时光标docs/architecture/ARCHITECTURE.md整体架构设计docs/guides/getting-started.md5 分钟上手指南总结LocalWrite 用三层同步策略撑起类 Google Docs 体验——页面元数据走 LWW 文档、正文走 Fugue CRDT、光标走 Awareness 广播配合每块一字段的数据模型和 OPFS 离线存储。照 demo/ 的源码路径走一遍你就拥有了在自己项目里搭建实时协作编辑器的完整路线图。【免费下载链接】synckitLocal-first collaboration SDK for React, Vue, and Svelte. Batteries-included: Rich text, undo/redo, cursors, and presence.项目地址: https://gitcode.com/gh_mirrors/syncki/synckit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AppErrorsTracking工作原理揭秘:为何系统级注入比UncaughtExceptionHandler更强大

AppErrorsTracking工作原理揭秘:为何系统级注入比UncaughtExceptionHandler更强大

AppErrorsTracking工作原理揭秘:为何系统级注入比UncaughtExceptionHandler更强大 【免费下载链接】AppErrorsTracking Added more features to apps crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. 项目地址: https…

2026/8/25 8:21:42 阅读更多 →
如何在云上运行Cactus基因组比对:AWS Toil自动扩缩容与SLURM集群部署完整指南

如何在云上运行Cactus基因组比对:AWS Toil自动扩缩容与SLURM集群部署完整指南

如何在云上运行Cactus基因组比对:AWS Toil自动扩缩容与SLURM集群部署完整指南 【免费下载链接】cactus Official home of genome aligner based upon notion of Cactus graphs 项目地址: https://gitcode.com/gh_mirrors/cact/cactus Cactus(基于…

2026/8/25 8:21:42 阅读更多 →
BTree索引自适应调优:用模拟退火实现负载感知优化

BTree索引自适应调优:用模拟退火实现负载感知优化

1. 这不是“算法拼盘”,而是一次对索引结构与优化逻辑的深度耦合尝试BTree 和模拟退火算法——这两个词单独拎出来,一个扎根于数据库底层、一个游走于运筹学前沿,看起来风马牛不相及。但当我第一次在某次高并发订单路由场景中,发现…

2026/8/25 8:21:42 阅读更多 →

最新新闻

腾讯云服务器部署OpenClaw并接入自定义大模型实战指南

腾讯云服务器部署OpenClaw并接入自定义大模型实战指南

1. 项目背景与核心诉求最近在帮几个做电商和内容运营的朋友折腾AI客服和自动化流程,他们不约而同地提到了一个开源项目:OpenClaw。这玩意儿本质上是一个开源的AI智能体框架,你可以把它理解成一个“AI大脑”的调度中心。它本身不生产“智力”&…

2026/8/25 11:02:59 阅读更多 →
嵌入式Linux设备树与Platform驱动开发详解:从硬件描述到驱动匹配

嵌入式Linux设备树与Platform驱动开发详解:从硬件描述到驱动匹配

1. 项目概述:从混乱到秩序,设备树与Platform驱动的价值如果你在嵌入式Linux开发里摸爬滚打过一阵子,肯定对下面这个场景不陌生:为了给一块新板子上的GPIO按键写驱动,你不得不去翻看几百行甚至上千行的板级初始化代码&a…

2026/8/25 11:02:59 阅读更多 →
OpenClaw智能体流量镜像重构:插件化设计与性能优化实践

OpenClaw智能体流量镜像重构:插件化设计与性能优化实践

1. 项目缘起:一次“意外”的流量镜像需求最近在折腾一个基于OpenClaw的智能体项目,想给它加个“监控眼”——把智能体对外部服务的所有请求(也就是Outbound Session)都镜像一份,方便后续做日志审计、性能分析或者故障复…

2026/8/25 11:02:59 阅读更多 →
OpenClaw ACP Agents架构解析:从多智能体协同到生产部署实战

OpenClaw ACP Agents架构解析:从多智能体协同到生产部署实战

1. 项目概述:为什么OpenClaw的ACP Agents值得深挖?最近在折腾AI智能体(Agents)的朋友,估计没少被OpenClaw这个名字刷屏。特别是它核心的ACP Agents实现机制,几乎成了社区里讨论的焦点。我花了将近一个月的时…

2026/8/25 11:02:59 阅读更多 →
从零实现OpenClaw与飞书深度集成:打造企业级AI智能体协同办公方案

从零实现OpenClaw与飞书深度集成:打造企业级AI智能体协同办公方案

1. 项目概述:为什么要把OpenClaw和飞书绑在一起? 最近在折腾AI智能体(Agent)的朋友,估计没少听OpenClaw这个名字。它本质上是一个开源的AI智能体框架,你可以把它理解为一个“大脑调度中心”。它本身不产生…

2026/8/25 11:02:59 阅读更多 →
智能体技能自我进化:从静态编排到动态学习的工程实践

智能体技能自我进化:从静态编排到动态学习的工程实践

1. 项目概述:从“手动编排”到“自我进化”的智能体革命如果你和我一样,曾经为了一个智能体(Agent)项目,在深夜对着YAML配置文件、Python脚本和API文档“手动编排”技能逻辑,那么“Hermes Agent 如何让 Ope…

2026/8/25 11:01:59 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →