Slate v2 编辑器性能架构研究:对照 ProseMirror / Lexical / VS Code 的诚实裁决与 React 19.2 的价值边界
2026/9/16 16:22:54 网站建设 项目流程

Slate v2 编辑器性能架构研究:对照 ProseMirror / Lexical / VS Code 的诚实裁决与 React 19.2 的价值边界

【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate

导读

本文以 Plate 仓库中 2026-04-15-slate-v2-perf-architecture-research.md 这份性能架构研究计划为核心,完整还原它围绕「Slate v2 能否在纯理论上宣称与 ProseMirror、Lexical、VS Code 同档甚至更优的性能架构」「React 19.2 究竟带来了什么」「若要打造 field-best 的装饰(decoration)栈还需要怎样的重塑」三个问题开展的证据盘点、裁决与行动项。读完本文,你将掌握:这份研究是如何按证据台账(evidence ledger)组织五个直接对照语料与六个上下文语料的,为什么最终结论拒绝「纯理论全面优越」而接受「React 原生一等性能架构」这一收窄论断,以及仓库为下一步「source-scoped invalidation」留下的具体证明缺口与源码依据。

1. 研究目标与问题框架

这份 2026-04-15 的研究计划对编辑器架构候选车道(editor-architecture candidate lane)做了一次完整的 research-wiki 通读,核心要回答三个问题:

  1. Slate v2 能否仅凭理论诚实地宣称与严肃候选同档或更优的性能架构?
  2. React 19.2 实际买到了什么?
  3. 如果目标是 field-best 的装饰栈,还有什么重塑是合理的?

研究采用「直接对照语料 + 上下文语料」的双层结构。直接对照语料是能直接影响裁决的五组证据源:本地 Slate v2、ProseMirror、Lexical、VS Code,以及 React 19.2 官方文档;上下文语料则包括 Tiptap、Premirror / Pretext、edix / use-editable / rich-textarea、TanStack DB、EditContext,它们被保留在 landscape 中作为背景,不充当直接证明。研究完成后,仓库在 docs/research/systems/editor-architecture-landscape.md 中固化了系统级结论,并在 docs/research/decisions/slate-v2-react-19-2-perf-architecture-vs-field.md 中写下了正式裁决。

2. 证据台账:五个直接对照语料的逐项裁决

研究把每个语料的证据状态分为evidenced(已有证据支持)、compile gap(存在编译/整理缺口)、synthesis gap(存在综合缺口)三类,并逐项记录「最强证据」与「下一步行动」。

2.1 Slate v2 本地证明基底(evidenced)

研究查验了三类本地证据:

  • 编译层页面docs/research/sources/editor-architecture/slate-v2-local-proof-substrate.mddocs/research/systems/slate-v2-overlay-architecture.mddocs/research/decisions/slate-v2-overlay-superiority-vs-legacy-and-field.md
  • 原始源码路径.tmp/slate-v2/packages/slate-react/src及其 test 目录、.tmp/slate-v2/docs/walkthroughs/09-performance.md
  • 直接读取的源码文件projection-store.tshooks/use-slate-selector.tsxhooks/use-slate-annotations.tsxhooks/use-slate-widgets.tsx

最强证据包括:

  • 以 runtime-id 为键的本地订阅(runtime-id keyed local subscription)真实存在;
  • useSyncExternalStore支撑的 selector 与 store 真实存在;
  • 当前投影重算仍然从source(Editor.getSnapshot(editor))对完整快照发起。

裁决是evidenced,但留下了一个诚实的边界:UI 订阅侧与严肃候选同档,核心失效(core invalidation)侧尚未清晰做到 field-best。这与 slate-v2-local-proof-substrate.md 的细化结论一致——该页还指出:createSlateProjectionStore(...)已能把 range 投影为 runtime-id 键控切片并提供本地订阅,projection-store.ts已具备部分源码控制项(dirtinessruntimeScopesourceId、定向刷新、source 订阅者、runtime 订阅者、重算指标),Bookmark已是公开的持久锚点名词,快照已暴露idToPath/pathToId运行时索引,Editor.getDirtyPaths(...)已作为粗糙的「操作到路径」dirtiness 原语存在。

2.2 ProseMirror(evidenced)

对照语料来自 ProseMirror 官方本地克隆(../prosemirror),直接读取了view/src/decoration.tsview/src/viewdesc.tsstate/src/selection.ts。最强证据:

  • 子作用域映射覆盖传播(child-scoped mapped overlay propagation);
  • 持久选择书签(durable selection bookmarks);
  • 增量 view/update 纪律(incremental view/update discipline)。

prosemirror-mapped-overlays-and-bookmarks.md 将其提炼为:DecorationSource/DecorationSet是持久化的映射覆盖数据而非渲染期回调;forChild(...)是真正的扩展关键——子作用域传播取代对整棵树的反复求交;SelectionBookmark是干净的持久锚点契约——随变更映射、之后针对当前文档解析;ViewDesc树则是显式的增量视图/更新基底,而非泛型 React 重渲染。ProseMirror 因此仍是「更显式的文档-视图 diff」的所有者,这也是 Slate v2 不能轻易宣称超越它的原因。

2.3 Lexical(evidenced)

对照语料来自 Lexical 官方本地克隆(../lexical),直接读取了src/LexicalUpdates.tslexical-react/src/useLexicalSubscription.tsxlexical-mark/src/MarkNode.ts、playground 的 commenting 与 CommentPlugin 实现。最强证据:

  • dirty leaf / dirty element 转换启发式(dirty leaf/element transform heuristic):在 React 介入之前就知道编辑器树哪些部分脏了;
  • 显式的 React 订阅助手useLexicalSubscription
  • mark id、comment store 与 decorator UI 分离

lexical-mark-store-and-decorator-split.md 的解读是:MarkNode在编辑树里存内联标记区间的 id;CommentStore把评论/线程元数据放到带变更监听的独立 store;DecoratorNode是独立的节点级 React 装饰车道。结论是 Lexical 在「编辑器核心失效引擎」这一轴线上强于当前 Slate v2——它在 React 参与之前就掌握脏节点集合,React 19.2 只能缩小 Slate v2 在 UI/运行时侧的差距,无法抹平这一核心 reconcile 优势。

2.4 VS Code(evidenced)

对照语料来自 VS Code 官方本地克隆(../vscode),直接读取了src/vscode-dts/vscode.d.tseditor/common/services/markerDecorationsService.tseditor/browser/widget/codeEditor/codeEditorWidget.tseditor/common/viewModel/viewModelImpl.ts。最强证据:

  • 类型化装饰句柄(typed decoration handles);
  • 独立评论控制器表面(independent comment controller surface);
  • widget/editor shell 与 view-model 分离

研究结论是:VS Code 证明了严肃编辑器会激进地分离视觉通道,其「服务/视图模型」切分比 Slate v2 更强;Slate v2 可以在 React 原生产品集成上更符合人体工学,但这不等于在编辑器核心架构上击败 VS Code。该语料还从「typed channels」升级为真正的性能架构参照。

2.5 React 19.2(compile gap)

React 19.2 只读官方文档(useTransitionuseDeferredValueuseSyncExternalStoreActivity),当时车道内还没有专门的编译页,因此状态记为compile gap,行动项是「为该车道创建专门的 React 19.2 编译源页」——研究随后确实补齐了 react-19-2-external-store-and-background-ui.md。最强证据:

  • useSyncExternalStore是外部 store 订阅的 React 原生一等原语;
  • transition 是非阻塞、可中断的;
  • 隐藏的Activity保留状态/DOM 供稍后恢复。

3. React 19.2 真正买到了什么

3.1 四个决定性原语

react-19-2-external-store-and-background-ui.md 把 React 19.2 对编辑器性能架构有意义的原语整理为四条:

原语作用
useSyncExternalStore稳定外部快照的 React 原生订阅原语
useTransition标记非阻塞后台工作,允许紧急输入中断它
useDeferredValue让非紧急派生 UI 滞后于紧急值(stale-while-fresh)
Activity隐藏 UI 时保留状态与 DOM,隐藏工作以更低优先级运行

此外,React 19.2 的官方发布说明还确认:Activity支持visible/hidden两种模式,hidden 子节点保留状态、可预渲染且不与可见工作竞争;Scheduler 与 Components Performance Tracks 暴露 React 正在渲染什么、使用了哪个优先级、组件何时渲染或执行副作用,这让编辑器压力测试期间的渲染/优先级证据更容易采集。

3.2 对 Slate v2 的含义

研究给出的判断分三层:

  1. React 19.2 是严肃的 overlay/UI 调度器。annotation store、widget store、selector-first 快照读取、隐藏审阅面板、大文档侧边栏,都能从「workaround 重重」变成「架构上严肃」。它足以让 React 原生编辑器运行时架构可信,也抹掉了「React 承载不了严肃编辑器运行时」的旧借口。
  2. React 19.2 不替代核心失效引擎。React 能调度与订阅,但不会替你发明子作用域文档映射、dirty-node reconcile 或 view-model 分离。如果核心仍过度重算,React 19.2 只会让外围 UI 更聪明,而不是让引擎奇迹般变好——它甚至会更清晰地暴露宽泛 React 树被脏化的问题。
  3. 本地 Slate v2 的用法方向正确。仓库已采用useSlateSelector(...)useSlateAnnotations(...)useSlateWidgets(...)useSlateProjections(...),并在大文档 overlay 示例中用Activity承载隐藏面板——React 侧不缺架构,缺的是更深的失效证明。

4. 最终裁决:收窄后的诚实论断

正式决策页 slate-v2-react-19-2-perf-architecture-vs-field.md 接受了如下收窄论断:

  • React 19.2 移除了「React 无法承载严肃编辑器运行时」的旧借口;
  • Slate v2 在 React 面向的 overlay/UI 侧已与严肃候选同属一个架构类别;
  • Slate v2 明显优于 legacy Slate;
  • Slate v2 不能在纯理论上诚实地宣称对 ProseMirror、Lexical、VS Code 的全面性能架构优越

4.1 为什么不能宣称普遍优越

裁决逐条给出了理由:

  • ProseMirror仍有更强的显式文档-视图 diff:子作用域装饰传播、映射装饰集、书签语义、ViewDesc更新纪律。Slate v2 只是对齐了好想法,尚未证明更强的失效引擎。
  • Lexical仍有更强的显式脏节点运行时:dirty leaf/dirty element 追踪、React 渲染前的 transform 启发式、独立订阅助手。React 19.2 帮助的是订阅/UI 侧,不抹平 Lexical 的核心 reconcile 优势。
  • VS Code仍有更强的服务/视图模型切分:类型化装饰句柄、评论控制器表面、独立 widget 通道、分离的 view model。Slate v2 对 React 原生产品集成更符合人体工学,但这不是击败 VS Code 编辑器核心架构。

4.2 Slate v2 现在能诚实宣称什么

  • 比 legacy Slate 好一大截;
  • 对 overlays 与审阅 UI 是 React 原生一等性能架构;
  • 在显式车道分离、持久锚点、外部 store 订阅姿态上与严肃候选同档。

5. 下一步重塑:失效发生在 React 之下

5.1 唯一的严肃路径

决策页与系统页给出了一致的答案:如果目标是 field-best 性能架构,下一步重塑不是又一个 React 技巧,而是:

  • source-scoped invalidation(按源作用域的失效);
  • 每个 overlay source/store 的显式 dirtiness 声明
  • 在 React 层之下做更多索引化或子作用域的投影重算

这是对 ProseMirror、Lexical、VS Code 提出更强理论主张的唯一严肃路径。slate-v2-overlay-architecture.md 的同款表述是:source-scoped dirtiness、更多索引化投影重算、每次提交快照减少全源投影重建——React 19.2 对 UI 侧已经够好,剩余差距(如果有)比 React 更深。

5.2 本地证明基底指出的具体缺口

slate-v2-local-proof-substrate.md 把「下一个缺口在 React 之下」细化为可验证清单:

  • sources 默认作为整体刷新,除非调用方显式控制 refresh;
  • 投影重算尚未接收 source 级脏区域;
  • range 投影尚未使用索引化的本地文本条目查找(range-projection.ts目前在投影 range 前仍跨快照收集文本条目);
  • annotation store 尚未按脏 annotation id 解析/投影;
  • widget store 暴露重算计数,但缺少按 anchor 或按 widget 的脏记账;
  • 基准指标只统计重算次数,未统计 source id、runtime id、投影 range、subscriber 唤醒次数。

同时该页明确了两条边界:其一,当前 live source 还没有独立的decoration-sources.ts/use-slate-decoration-sources.tsx层,装饰源行为下沉在更底层的 projection store 中;其二,annotation 投影弱于普通投影源——annotation store 会解析每个 annotation 书签、投影每个 annotation range,并暴露一个没有 runtime/source 订阅 API 的部分投影 store。

6. 上下文语料与综合边界

研究对上下文语料的态度在计划中写得很清楚:Tiptap、Premirror / Pretext、TanStack DB、EditContext 以及轻量表面(edix / use-editable / rich-textarea)仍然重要,但不会实质改变针对严肃对照集的直接性能架构裁决,因此状态记为synthesis gap,行动项是「保留在 landscape/system 页作为背景,不冒充直接证明」。

系统页 editor-architecture-landscape.md 给出了各候选的角色定位与取用建议:

  • ProseMirror:映射覆盖纪律与持久书签语义的基准——取 child-scoped 映射装饰纪律与书签语义;
  • Lexical:运行时/store 切分与 React 原生 portal 的基准——取 mark id 与评论/线程 store 分离、decorator UI 与文本 overlay 分离、dirty 失效与泛型重渲染分离;
  • Tiptap:产品化与打包基准,引擎教训大多只是穿着更好文档的 ProseMirror 教训;
  • Premirror + Pretext:布局/分页/测量基准,组合与测量应保持派生,布局应属于独立车道;
  • TanStack DB:annotation store 的最佳非编辑器参照模型;
  • EditContext:值得跟踪的未来平台原语,而非当下主干;
  • edix / use-editable / rich-textarea:下界警告——不要在小型表面上过度建造。

7. 错误与记录:研究自身的诚实性

计划在 Errors 一节留下了一条未闭环的约束:这些编辑器架构候选语料还没有规范化的../raw/<corpus>家族,该车道仍部分依赖../下的官方本地克隆。这解释了为什么证据引用大量指向.tmp/slate-v2../prosemirror../lexical../vscode等外部克隆路径,也说明该车道当前的证据基建处于「官方本地克隆支撑」而非「归一化 raw 语料支撑」的状态。研究同时记录了当日进度:核对 ProseMirror、Lexical、VS Code 三个仓库的具体修订版本,更新了编译研究层(新增 React 19.2 源页、强化三家源码摘要、收紧 landscape/system 裁决、显式拒绝「纯理论全面优越」的声明并点名最佳重塑方向),并同步更新了docs/research/index.mddocs/research/log.md

8. 方法论要点:这类性能架构研究如何复用

这份研究计划本身是一个可复用的「证据优先」模板,其关键纪律值得总结:

  1. 问题收窄先行:先定义「理论层面能否宣称同档或更优」「React 19.2 买到什么」「还需什么重塑」三个可裁决问题,再展开证据搜集;
  2. 语料分级:直接对照语料影响裁决,上下文语料只作背景,避免用弱证据冒充直接证明;
  3. 证据台账化:每个语料记录 compiled pages、raw paths、direct raw files、strongest evidence、disposition、next action 六项,状态显式标记为evidenced/compile gap/synthesis gap
  4. 裁决收窄而非膨胀:最终结论明确拒绝「全面优越」的笼统主张,只接受证据能支撑的窄结论,并把「要做到 field-best 还需什么」写成可执行的重塑清单;
  5. 缺口显式化:把证明缺口(如缺少 source 级脏区域、缺少索引化文本条目查找、缺少规范 raw 语料)写进文档,而不是隐藏。

这套方法在仓库中已有完整落点:裁决见 docs/research/decisions/slate-v2-react-19-2-perf-architecture-vs-field.md,系统图景见 docs/research/systems/editor-architecture-landscape.md 与 docs/research/systems/slate-v2-overlay-architecture.md,证据源页见 docs/research/sources/editor-architecture/,研究总览见 docs/research/index.md(位于 docs/research/ 目录体系内)。

9. 结论速览

  • 裁决:React 19.2 让 Slate v2 成为 React 原生一等性能架构,但没有、也不会在纯理论上证明它全面优于 ProseMirror、Lexical 与 VS Code。
  • React 19.2 的贡献:外部 store 订阅、非阻塞后台工作、隐藏面板保活——UI/调度侧的缺口被补上,核心失效缺口原样保留。
  • 下一步重塑:source-scoped invalidation、显式 dirtiness 声明、React 层之下的索引化/子作用域投影重算;断言与缺口清单均已落在本地证明基底页中,可直接作为后续性能工作的验收依据。

【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询