Slate v2 绝对架构洁净度评审保留什么、重写还是证明以及 5000 块巨型文档的性能回归门【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate本文基于 plate 仓库中的评审规划文档 docs/plans/2026-05-11-slate-v2-absolute-architecture-cleanliness-review-ralplan.md完整复盘 Slate v2 的一次绝对架构洁净度评审它的最终结论是什么、哪些核心设计被判定必须保留、哪三个 P0 项需要重写或者证明、哪些候选改动被直接砍掉以及评审之后的实际执行结果selector 基座迁移useSyncExternalStore、根运行时按职责拆分、巨型文档对比基准回归门。读完你可以掌握Slate v2 当前架构的定论、架构决策的评分方法、可复跑的验证命令以及大规模文档性能对比的真实数据口径。评审结论核心赌注正确但还不是最洁净的架构评审的裁决Verdict是明确的Slate v2 押对了核心方向但它还不是理论上最洁净的架构。因此评审给出的行动原则是——不要重写编辑器内核而是保留现有形状并集中处理三件更窄、更有用的架构债证明或替换自定义 selector 基座custom selector substrate把根运行时协调器拆分成更小的 ownerroot runtime coordinator 职责拆分把巨型文档直接对比当作回归门而非发布阻塞fresh narrowed run 已经让默认auto渲染模式对架构规划足够有力而 DOM-present 暂存模式和实验模式仍需诚实保留 native-behavior/proof 行。评审原文还给出了一条重要的防发散警示Anything broader than that is architecture theater——超出上述范围的动作都属于架构表演不该做。这份评审的定位是评审/规划门review/planning gate对应的意图边界Intent Boundary如下字段决策意图判定 Slate v2 是否已经是最优、最洁净的架构并为剩余工作产出可执行计划期望产出一份保护正确架构 只点名真实清理工作的评分计划范围内Slate v2 运行时架构、公开 API 形状、React selector/运行时行为、大规模文档性能门、issue 核算影响非目标本 pass 不做实现改动、不做广泛的 GitHub 重新发现、不追求当前 Plate 公开 API 兼容、不稳定实验性压力模式、不因感觉代码太大就重写内核决策边界评审者只能编辑规划、研究、issue-ledger、PR 引用和受限.tmp文件Slate v2 实现属于后续ralph执行待用户决策本 pass 无需额外决策评审门已完成执行属于后续ralph运行当前源码证据评审基于哪些文件做出判断评审的Current Source Evidence表逐项记录了每个架构面的现状与Keep保留理由。原始证据路径指向评审当时使用的现场副本.tmp/slate-v2/...对应维护中的源码位于本仓库 packages/slate例如公开读 API 形状见 packages/slate/src/interfaces/editor/editor-api.ts编辑器装配与editor.api/editor.tf/editor.transforms的绑定见 packages/slate/src/create-editor.ts。核心判断如下架构面现状与结论编辑器状态/更新主干公开形状通过 editor 方法读取、通过editor.update写入并暴露state/tx扩展命名空间。保留。旧扩展槽位运行时已拒绝methods与公开commands活动源码已裁掉陈旧扩展形状内部命令注册表命令仍作为内部机制存在这没问题但不要把它们暴露成产品 APISelector 基座主编辑器 selector 路径使用自定义useReducer强制渲染 helper而非 React 外部 store 原语——这是最大的清理候选邻近外部 storeannotations/projections/widgets 等邻近 store 已使用useSyncExternalStore因此自定义 selector helper 需要证明或替换Selector 扇出runtime/global/deferred 监听集合边界清晰但所有权绑定在自定义 selector 基座上根运行时一个 hook 串联了 composition、Android 输入、selection 导入/导出、repair、trace、input rules、事件运行时、根 refs、生命周期、pending marks。能用但太密集。虚拟化公开形状virtualized仅为对象形态、明确标记实验性不是稳定的字符串对等物。保留。虚拟化契约测试契约测试证明virtualized保持对象形态且实验性useElementIf全量搜索未发现活动源码中的公开使用不是当前架构阻塞项性能替换门Slate React 相对 legacy chunking 的性能优势仍为pending / typing red见 docs/slate-v2/replacement-gates-scoreboard.mdRC 证明账本v2 相对 legacy 的巨型文档直接输入优势仍然 open见 docs/slate-v2/true-slate-rc-proof-ledger.md当前验证本次评审跑过的命令与基准亮点评审在现场兄弟仓库/Users/zbeyens/git/slate-v2而非plate-2中运行了以下验证命令命令结果证明内容bun --filter slate-react typecheckpass当前slate-react类型自洽bun test:vitest test/surface-contract.test.tsx test/provider-hooks-contract.test.tsx test/rendering-strategy-and-scroll.test.tsx3 个文件 / 64 个测试通过公开表面、provider hooks、渲染策略、scroll 包契约全绿bun run bench:react:rerender-breadth:localpassReact 重渲染广度强测量行中 broad/sibling/ancestor 渲染均为 0新鲜基准亮点来自评审原文记录单位为 msselection breadthbroad 渲染0、left block 渲染0、right block 渲染0selection p954.6msmany leaf editblock 渲染0、sibling leaf 渲染0、edited leaf 渲染1edit p954.27msdeep ancestor editancestor 渲染事件0、sibling branch/leaf 渲染0、deep leaf 渲染1edit p954.33mssource-scoped invalidation无关 source 的 text / selection / external 三条 lane 的 recompute 保持0。评审强调这是当前失效invalidation方向上的真实证据但并未关闭针对 legacy chunking 的直接巨型文档输入/选择门。最终评分0.93达标但未完成实现评审的done阈值为0.92且不允许存在未解决的 P0 架构项。加权评分结果如下维度权重得分理由React 运行时性能0.200.94重渲染广度强fresh 5000 块 narrowed compare 显示默认auto在 release 相关 type/promote/edit 三条 lane 上胜过 legacy chunking-onSlate-close 无观点 DX0.200.94editor.read/update、state/tx、无公开useElementIf、活动文档不再教授 legacymethodsPlate/slate-yjs 迁移主干0.150.90commit/operation/state 主干正确adapter 证明不属于本 pass防回归测试策略0.200.92聚焦契约、重渲染广度、narrowed 巨型文档对比均通过未来重构仍需契约优先执行研究证据完整性0.150.92React/Lexical/ProseMirror/Tiptap 汇编研究 缓存 issue ledger 对更窄计划达成一致组合性/极简主义0.100.92稳定 API 更干净根运行时密度与 selector 基座使其未达 excellent加权得分1.000.93作为评审/规划门done作为实现未完成该保留什么六个被确认的架构决定决定为什么保留保留editor.read/editor.update作为公开状态生命周期让写入保持事务化为协作/commit 证明提供稳定主干保留state与tx扩展命名空间用类型化、作用域化的扩展模型替代任意方法袋保留静态Editor.*helpers 作为兼容/运行时逃生舱它们不需要成为推荐创作 API保留内部操作中间件插件需要确定性钩子但公开命令中间件会变成产品框架保留virtualized对象形态实验性诚实对病态文档有用但不追求 native-behavior 对等保留 shell/staged/full 显式策略默认 native-ish 编辑不能静默退化为降级压力模式三个 P0 项重写还是证明评审把剩余架构债收敛为三个 P0 项每项都给出了当前源码 → 计划 → 决策 → 证明命令的完整链条。P0-1Selector 基座selector substrate当前状态useGenericSelector使用useReducer强制渲染 ref 缓存的 selector 状态useEditorSelector把它接入 editor/global/runtime/deferred 监听扇出而邻近的 annotation/projection/widget store 已经使用useSyncExternalStore。计划在执行切片中构建一个极小的useEditorExternalStoreSelectoradapter与现有useGenericSelector对比以下行为同轮 commit 合并same-turn commit coalescing、selector 错误重放error replay、runtime-id 作用域失效、deferred selector flush、React 19 在 hidden/activity 面板下的兼容性只有当执行证明能解释为什么useSyncExternalStore使行为更差或无法干净建模 operations/change 元数据时才保留现有 helper若外部 store 胜出把所有 editor 与 decoration selector 迁移到同一 adapter 之后保持公开 hook 表面不变。决策不盲目重写每个 selector先执行证明 spike最洁净的终态是一个能解释自己为什么是/不是useSyncExternalStore基础的 editor selector store adapter——自定义强制渲染 helper 只有被测试和基准明确辩护时才可接受。证明命令评审记录于现场兄弟仓库执行cd /Users/zbeyens/git/slate-v2 bun --filter slate-react typecheck cd /Users/zbeyens/git/slate-v2/packages/slate-react bun test:vitest test/provider-hooks-contract.test.tsx test/surface-contract.test.tsx cd /Users/zbeyens/git/slate-v2 bun run bench:react:rerender-breadth:localP0-2根运行时协调器root runtime coordinator当前状态useEditableRootRuntime有 405 行几乎串联了全部浏览器运行时子系统若干子系统已是独立模块但组合 owner 仍是密集的依赖中枢。计划保持公开EditableAPI 稳定按所有权而非文件行数虚荣拆分composition 与 pending marks、Android/native 输入导入、selection 导入/导出/调和、repair 与 trace、input rules、事件运行时绑定、scroll intent/export 交接每次拆分前先加包契约行钉死行为如果拆出的 owner 只是一堆 refs 的袋子就不拆。决策拆分所有权不只是拆文件根 hook 可以继续当协调器但不应再直接拥有每个浏览器子系统一个只是导出巨型可变 context 的拆分比什么都不做更糟。证明命令cd /Users/zbeyens/git/slate-v2/packages/slate-react bun test:vitest test/rendering-strategy-and-scroll.test.tsx cd /Users/zbeyens/git/slate-v2 bun --filter slate-react typecheckP0-3巨型文档输入/选择门huge-document typing/select gate既有文档明确说明 typing/select lane 的 legacy 直接对比仍是 open 的本 pass 对 release 相关当前表面重跑了 narrowed fresh 对比。命令评审原文记录cd /Users/zbeyens/git/slate-v2 REACT_HUGE_COMPARE_SKIP_BUILD1 REACT_HUGE_COMPARE_SURFACESv2DefaultRenderAuto,v2DomPresent,v2VirtualizedExperimental REACT_HUGE_COMPARE_BLOCKS5000 REACT_HUGE_COMPARE_ITERATIONS5 REACT_HUGE_COMPARE_TYPE_OPS10 bun run bench:react:huge-document:legacy-compare:local5000 块文档、5 次迭代、10 次输入操作的结果均值单位 msLaneLegacy chunking-on 均值v2 默认auto均值结论ready322.45ms26.28msv2 胜start block type39.04ms11.46msv2 胜start select then type47.63ms21.93msv2 胜middle block type39.11ms10.79msv2 胜middle select then type33.77ms31.74msv2 险胜middle promote then type39.21ms30.50msv2 胜replace full document118.14ms5.42msv2 胜insert fragment full document115.04ms7.94msv2 胜评审同时记录了诚实的边界selectAllMs在默认auto上有微小均值回退1.16ms对比0.94ms由单个4.65ms样本造成中位数仍更优0.30ms对比0.93ms——不是架构阻塞项v2DomPresent在中部选择 lane 上对 legacy chunking-on 仍有少量均值损失v2VirtualizedExperimental仍是显式降级层——保留为 proof 行不作为默认架构阻塞项。对比命令与门的状态还记录在 docs/slate-v2/replacement-gates-scoreboard.md 与 docs/slate-v2/true-slate-rc-proof-ledger.md 中1000 块运行仅作 smoke/debug不关闭该 lane。该砍掉什么五个候选的全部裁决候选裁决理由公开useElementIf现场源码已裁不要恢复别名或兼容名教授editor.extend({ methods })的活动文档已从活动文档裁掉历史计划可留历史不要复活此表面稳定字符串形态virtualized现场源码已裁对象形态实验性才是正确的压力阀公开扩展commands硬砍内部注册表足够公开命令会让 Slate 变成产品框架整核重写拒绝当前内核不是问题所在问题在 selector/运行时组合与最终性能证明生态综合从 ProseMirror / Lexical / Tiptap / React 19.2 偷什么系统偷取拒绝Slate v2 当前答案ProseMirror事务化状态、selection 映射、持久书签、单一 DOM 桥 ownerschema/产品重量editor.update、commit 元数据、运行时拥有的浏览器桥Lexical脏区纪律、命令/运行时分离、给 React 的 commit 数据把类节点模型和自定义 DOM reconciler 当作编辑器身份脏 runtime ids 作用域 selector 扇出但不采纳 Lexical 的产品模型Tiptap产品 DX 清晰度与扩展 ergonomics把有观点的产品 API 当 Slate 核心Slate 保持 raw产品 ergonomics 由 Plate 拥有React 19.2useSyncExternalStore、transitions/deferred work、hidden/background UI 证明假装 React 原语能解决编辑器失效问题在能证明订阅/渲染行为处用 React 原语编辑器脏区才是真实真相React 19.2 外部 store 与后台 UI 方向的更深层研究见 docs/research/sources/editor-architecture/react-19-2-external-store-and-background-ui.md公开运行时形状editor.read/editor.update、扩展契约、硬砍清单、浏览器编辑声明见 docs/slate-v2/absolute-architecture-release-claim.md。Issue 核算本 pass 不新增任何声明本 pass 没有改动任何 issue 声明。评审遵循先读缓存账本策略未做广泛的 GitHub issue 重新发现读取的缓存账本包括docs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/references/pr-description.mddocs/slate-issues/gitcrawl-v2-sync-ledger.mddocs/slate-issues/gitcrawl-live-open-ledger.mdClawSweeper 对四类表面的处理selector 基座与 React 订阅相关 issue#5131、#3656、#4141、#4210、#3430、#2051、#4483保持既有Improves/Related/Not claimed状态不新增Fixes根运行时/组合/选择压力#5398、#5433及 Android/IME/focus 行保持闭合需设备/浏览器证明门槛巨型文档性能#5992、#5945、#4056、#790、#4202、#2733、#2669保持保守状态——fresh 默认auto对比增强了架构信心但不产生新 issue 文本可访问性/native 行为#2572及策略行作为 release 守卫保留任何性能胜利都不能绕过它们。评审后的实际执行Ralph Execution Ledger评审文档末尾记录了 2026-05-11 当天的执行结果证明证明或替换 selector 基座已经落地Selector 基座use-generic-selector已从useReducer强制渲染切换到以useSyncExternalStore作为订阅原语surface-contract测试现在钉死外部 store 基座provider/decorator 契约保持绿色根运行时runtime-root-selection-import模块拥有selectionchangehandler、调度器与 import-controller 构造kernel-authority-audit-contract契约把 selection 导入所有权钉死在根 selection 导入模块引用/issue 同步本次切片只改内部运行时所有权与 selector 基座公开 API 与 issue 声明未变无需同步验证bun run lint:fixpass格式化三个文件bun --filter slate-react typecheckpass5 个测试文件 / 91 个测试全部通过provider-hooks-contract、surface-contract、projections-and-selection-contract、kernel-authority-audit-contract、rendering-strategy-and-scrollbun run bench:react:rerender-breadth:localpassbroad/sibling/ancestor 渲染计数保持 0追加REACT_HUGE_COMPARE_DISPOSE_DELAY_MS0的 5000 块对比v2DefaultRenderAuto在每一条记录均值上都胜过 legacy chunking-on——ready22.82ms对332.03ms、select all0.31ms对0.98ms、start type11.64ms对51.02ms、middle type10.88ms对56.47ms、middle select then type45.61ms对48.6ms、promote then type33.18ms对54.5ms、full replace5.35ms对117.34ms、fragment insert6.52ms对115.96ms。未来执行队列与当前交接评审把后续执行明确留给ralph用户要求执行时才运行队列为selector 基座证明 spike契约优先的根运行时拆分若实现改变了 selector/运行时行为同步巨型文档直接对比回归守卫仅当公开声明变化时才做 PR 引用与 issue-ledger 同步。评审的最终交接语可概括为核心架构是。最终实现最洁净还不是。下一步执行工作是 selector 基座证明、根运行时所有权清理、以及回归守卫下的巨型文档验证。如果你正在评估是否重写 Slate v2 内核或该不该引入useSyncExternalStore基座这类决策这份评审的完整评分框架与证明命令都保留在 docs/plans/2026-05-11-slate-v2-absolute-architecture-cleanliness-review-ralplan.md可以作为同类架构评审的直接模板。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考