Now vibe coding, so learning hammer FE ?
《Notion如何用CRDT解决并发编辑冲突》

标签:
#分布式系统 #协同编辑 #CRDT算法 #数据一致性

总结:

文章要点:

1. Notion在2025年重新设计了底层文本编辑系统,从"最后写入获胜"(LWW)模式转向基于CRDT的并发编辑方案,解决了多人同时编辑同一区块时的数据丢失问题。

2. CRDT(无冲突复制数据类型)允许多个客户端保留本地数据副本,并以确定性方式合并同时发生的更改,确保不会丢失任何人的修改。

3. Notion使用的CRDT基于经典的RGA(可复制增长数组)序列CRDT,这是一个树形数据结构,每个字符都有唯一且稳定的ID,插入和删除操作都引用这些ID。

4. 删除操作采用"墓碑"机制——标记项目为已删除但保留在树中,因为可能有在途或离线操作依赖于已删除字符的ID。

5. 为提升存储效率,Notion将连续字符分组,为整组字符分配一个ID并存储运行长度,而不是为每个字符单独分配ID。

6. 支持富文本格式需要解决注释冲突,Notion引入了基于Peritext算法的操作,支持可扩展和不可扩展的注释类型(如粗体vs超链接)。

7. Notion的区块模型带来了独特挑战:当用户按下回车键分割区块时,需要处理文本在区块间移动时的并发编辑问题。

8. 为解决这一问题,Notion引入了"文本切片"概念——每个区块的文本项属于一个文本切片,分割区块时切片也会相应分割并移动到新区块。

9. 每个文本项ID由会话ID和Lamport时钟组成,确保ID的唯一性;指向同一原点的项目按逻辑时间戳排序,会话ID作为平局决胜因素。

URL:
https://www.notion.com/blog/how-notion-handles-concurrent-editing-with-crdts How Notion handles concurrent editing with CRDTs
《前端状态管理的真相与迷思》

标签:#前端 #Web开发 #React #状态管理 #Redux #Zustand #Jotai #MobX #CRDT #离线优先 #实时协作 #前端架构

总结:
作者犀利指出,React生态中流行的"状态管理"库(Redux、Zustand、MobX等)本质上只是状态传播与通知系统,而非真正的状态管理。真正的状态管理必须包含时间维度与顺序概念,能正确应用变更并解决冲突。作者推荐转向Y.js、Zero、Fluid等基于CRDT或OT的时序感知系统,它们天然支持离线优先与实时协作,才是前端数据层的未来方向。

文章要点:
1. 那些我们天天用的Redux、Zustand、MobX,本质上更像"消息广播员"而不是"状态管家"——它们能通知组件更新,却搞不定时间顺序和冲突解决
2. React自己也不是状态管理系统,整个前端圈把这个词用得太随意,导致大家一直在用错误的工具硬撑复杂场景
3. 真正的状态管理必须懂"时间"和"顺序",就像分布式系统用向量时钟给事件排队,没有时间概念就谈不上管理
4. 值得庆幸的是,Y.js、Zero、Fluid这类基于CRDT和操作变换的工具已经相当成熟,它们天生会处理冲突,离线和实时协作都是顺手的事
5. 当我们把数据层从"发通知"升级到"管时序"后,离线优先和实时协作不再是昂贵的附加功能,而是正确架构带来的自然馈赠

URL:
https://infrequently.org/2026/07/state-management
《关于协作编辑的谎言(第二部分):为什么我们不用Yjs》

标签:#前端 #ProseMirror #CRDT #协作编辑 #性能优化 #Yjs #实时协作

总结:
本文是Moment.dev团队关于协作编辑算法分析的第二部分,作者详细阐述了为何在生产环境中放弃Yjs而选择基于ProseMirror-collab的简单方案。文章指出Yjs存在严重的性能问题(每次协作编辑会销毁重建整个文档)、与文档Schema冲突、权限控制困难、调试困难以及墓碑数据占用内存等问题。作者认为,除非真正需要无主节点的P2P架构,否则40行代码的"简单方案"在性能、可维护性和开发体验上都优于复杂的CRDT实现。

文章要点:
- Yjs存在严重性能缺陷:每次协作编辑会销毁并重建整个文档,导致60fps目标难以达成,影响NodeView、插件状态、撤销功能和光标位置管理
- 简单方案仅需40行代码:使用prosemirror-collab库,通过单一权威节点管理文档版本和事务,支持乐观更新、离线编辑和网络中断恢复
- Yjs与文档Schema冲突:在无主节点架构下难以验证事务有效性,可能导致数据永久丢失,升级时尤其危险
- 权限控制复杂化:需要将Yjs的XML更新预测转换为ProseMirror事务来判断权限,实现难度大
- 墓碑数据问题:Yjs需保留删除标记,导致内存持续增长或数据丢失风险,而简单方案通过数据库存储步骤即可解决
- 调试困难:CRDT仅保证最终一致性,难以区分暂时分歧与真正错误,调试工具受限
- 核心观点:技术选型应从最终用户体验出发,而非算法本身;如无P2P刚需,简单方案在各方面均优于CRDT

文章URL:https://www.moment.dev/blog/lies-i-was-told-pt-2 Lies I was Told About Collaborative Editing, Part 2: Why we don't use Yjs / Moment devlog
 
 
Back to Top