Slate v2 深度架构评审实战Keep / Rewrite / Cut 决策框架与源码级执行验证【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate本篇技术指南以本仓库的 2026-05-11 Slate v2 深度架构评审计划 为骨架完整呈现一次针对 Slate v2 架构的当前状态审计哪些核心设计应当保留、哪些文档与子系统需要重写、哪些公共面应当裁剪或加门禁以及后续如何用证明优先proof-first的方式逐一切片执行。读完本文你将掌握一套可复用的编辑器架构评审方法——从源码证据清单、置信度计分卡、异议台账到选择器底层审计、根运行时拆分、渲染策略门禁与 5000 块级性能基准的完整闭环并能在本仓库 packages/slate 与 docs/slate-v2 中逐一验证每一项结论。评审结论核心架构不重写热点系统定点修复该评审文档的最终裁决非常明确不要重写核心架构那只是无谓的返工churn。核心押注是正确的具体体现在五条不可动摇的设计上Slate 文档模型保持简单 JSON——持久化内容以数据模型为先model-first操作operations始终是协作真相——历史与协作建立在确定性操作流之上editor.read/editor.update是公共生命周期——读有读的边界写有写的边界EditorCommit是运行时发布单元——作为本地运行时真相服务于历史、React、DOM 修复与证明扩展能力通过具名的editor、state、tx分组承载——而不是扁平的方法注入flat method injection。在此基础上评审给出了重写或裁剪清单与保留清单类别条目理由重写过期的架构文档活跃源码已拒绝扩展methods与公共扩展commands但活跃文档仍在教授editor.extend({ methods })重写/辩护选择器底层selector substrate主编辑器选择器仍用自研 reducer/ref 订阅辅助器而相邻的 annotation、widget、projection 存储已用useSyncExternalStore拆分根运行时协调器useEditableRootRuntime已成为所有权结选区导入导出、Android、组合输入、修复、事件运行时、外壳选区、全局监听器、pending 插入标记全部汇聚于此裁剪/收敛公共virtualized编辑模式被声明为公共渲染策略且标注 experimental但仍与auto、full、staged、shell并列出现在公共类型中保留数据模型优先的核心见上五条保留内部命令中间件属于内部运行时排序机制不是公共扩展 API保留运行时拥有的 void 外壳与 content-onlyrenderVoid已在源码与测试中修复并验证保留shell/staged 大文档显式性能模式原生行为证明完成之前不得把 shell 模式设为默认值得强调的边界原文明确本次评审不包含任何 Slate v2 代码补丁、不产生 PR、不声称关闭任何 issue只输出 keep/revise/gate/cut 决策与证明门禁。任何实际实现都需要后续独立的执行轮次ralph或显式执行 turn。决策原则与驱动因素评审文档的 Decision Brief 给出了七条决策原则这也是任何大型架构审计可复用的准则当前源码胜过旧文档与旧计划current source beats old docs and plans原始 Slate 保持无观点unopinionatedPlate 拥有产品级命令糖运行时性能胜出必须经受浏览器行为检验而不只是基准表格行公共 API 应当小到让 Agent 与人类开发者默认做对事协作始终基于操作与提交operation and commit based证明必须匹配声明层级文档证明关闭文档真相基准支持性能声明浏览器/设备行为需要浏览器/设备证明实验性面可以存在但不得读起来像稳定的发布承诺。评审识别出的五大驱动因素top drivers分别是issue 语料压力集中在运行时而非模型替换大文档性能仍有红色的输入/选区通道公共文档不得教授已删除的扩展模型根运行时密度使行为评审代价高昂React 选择器正确性是发布风险——因为大范围脏化会让其他所有运行时证明显得比实际更好。文档用一张选项对比表论证了保留架构、重写热点是唯一被选中的方案选项优点缺点裁决保留架构、重写热点在保留良好核心的同时攻击可测量的弱点需要在文档、选择器、根运行时、性能证明上保持纪律chosen整体重写为 Lexical 式核心更强的脏更新运行时故事抛弃 Slate JSON/op 熟悉度与迁移骨干reject转向 ProseMirror/Tiptap 引擎模型强 schema/view 纪律与产品 DX偏离 Slate 核心身份与 React 原生创作目标reject将当前 v2 冻结为完成避免返工无视过期文档、自研选择器风险、根运行时密度、性能红通道reject仅做文档清理最快获得更干净维护者文本选择器底层、根运行时密度、公共 virtualized 政策悬而未决reject不完整实现优先清理可能快速产生代码收益有在未接受的 issue/证明边界内打补丁的风险reject计划通过前源码证据清单评审的事实底座评审文档的核心方法论之一是建立一张当前源码证据表逐条记录每个表面surface的当前所有者、源码位置与读取结论。原文记录的是.tmp/slate-v2工作副本路径在当前仓库中对应的主线源码位于 packages/slate相关评审与发布文档位于 docs/slate-v2。原证据表要点如下表面证据点读取结论核心公共生命周期editor.ts:480BaseEditor暴露read、subscribe、update、extend内部变换editor.ts:493transform API 明确为内部运行时实现扩展形态editor.ts:890扩展字段含editor、state、tx无公共methods旧扩展拒绝editor-extension.ts:60methods与公共commands抛错并给出 state/tx 指引内部命令注册表editor.ts:1551defineCommand、registerCommand保持内部/静态 API主编辑器选择器底层use-generic-selector.tsx:22自研选择器钩子用 refs reducerforceRender运行时 id 选择器扇出use-editor-selector.tsx:189选择器上下文拥有全局、运行时 id、deferred 监听器集合根运行时协调器runtime-root-engine.ts:1导入选区、Android、组合输入、事件、修复、trace、输入 owner根运行时全局监听器runtime-root-engine.ts:412挂载 document selectionchange 与全局拖拽生命周期监听器void 渲染器editable-text-blocks.tsx:450renderVoid接收{ element, path }运行时包裹 shell/spacervoid 契约证明surface-contract.tsx:492测试证明无target、actions、selected、focused、children、attributes渲染策略 APIcreate-segment-plan.ts:3virtualized是公共RenderingStrategyType的一部分virtualized 实现use-virtualized-root-plan.ts:181仅视口viewport-only计划已实现含保留选中/提升行过期发布声明absolute-architecture-release-claim.md文档仍教授editor.extend({ methods })过期就绪声明release-readiness-decision.md文档仍称扩展方法通过methods组合性能红通道slate-react-perf-loop-context.mdshell 赢得 startup/full-doc 通道但输掉稳定输入/选区通道替代门禁replacement-gates-scoreboard.mdSlate React 性能优越性标记为pending / typing redissue 压力requirements-from-issues.md冻结语料显示运行时边界所有权主导核心引擎所有权覆盖率账本issue-coverage-matrix.mdfixed/improved/related 声明要求证明与 issue 类型匹配作为当前仓库可验证的旁证editor-type.ts 中的Editor类型由api、tf、transforms三组能力组合而成并显式声明使用meta字段承载自定义字段而非直接扩展编辑器editor-api.ts 则将after、before、edges、pathRef、pointRef、isEmpty、isVoid等查询/定位能力统一收编进EditorApi命名空间。这与评审文档扩展通过具名分组承载、而非扁平方法注入的裁决方向一致。Keep / Rewrite / Cut 决策矩阵评审按优先级给出了一份可直接执行的决策表优先级决策状态为什么证明或下一门禁P0将扩展契约文档与发布声明从methods改写revise活跃代码拒绝该 API维护者面向文档已过期用 grep 搜extend({ methods })修补活跃文档重跑 docs grepP0对照useSyncExternalStore审计主编辑器选择器底层revise当前自研 reducer/ref 辅助器与别处使用的 React 后端存储不一致聚焦选择器契约 rerender breadth 基准P0将useEditableRootRuntime拆成更小的控制器 ownerrevise根协调器导入并接线了太多行为 owner静态清单、每个控制器的聚焦测试、事件/监听器证明P1裁剪或硬性收敛公共virtualized编辑模式gate类型化为公共模式太容易被当作稳定编辑语义稳定文档/API 声明前的原生行为矩阵P1保持 shell 模式显式而非默认keep当前性能证明混合、原生行为证明不完整大文档对比 浏览器原生行为行P1保持运行时拥有的 void 外壳契约keep当前源码与测试已证明 content-only APIsurface contract 保持绿P2保留内部命令注册表但移出公共文档keep内部命令排序有用公共命令映射已被裁剪公共面契约与 docs grepP2在发布声明前增加 Plate/slate-yjs 底层证明行gate当前骨干合理但适配器证明还不是目标state/tx 扩展与操作重放证明置信度计分卡0.92 的构成评审给每个维度设置了权重、得分、证据与差距加权总分0.92且没有维度低于 0.85维度权重得分差距React 19.2 运行时性能0.200.90执行仍需选择器基准与热读证明Slate 式无观点 DX0.200.93文档仍需实现补丁Plate 与 slate-yjs 迁移骨干0.150.91适配器证明有意不声明回归证明测试策略0.200.92执行必须真正跑完门禁研究证据完整性0.150.94无开放研究矛盾shadcn 式可组合性与最小 hooks/组件0.100.93根拆分仍需执行文档明确标注这是计划就绪分plan-readiness score不是Slate v2 实现工作已完成的声明。状态为ready-for-review。生态策略综合steal 机制reject 身份评审文档将 React 19.2、ProseMirror、Tiptap、Lexical 四套生态各取所长形成一张借鉴什么、拒绝什么、Slate 目标是什么的综合矩阵系统机制借鉴steal拒绝rejectSlate 目标React 19.2external-store 订阅、非紧急 UI、Activity、性能轨道external-store 骨干Activity 仅用于后台 UI把 React 当作编辑器失效引擎选择器底层证明或重写partialProseMirror事务、映射选区、书签、单一视图权威事务元数据与持久锚点把 ProseMirror 视图/节点模型作为公共 Slate API保持 op/commit 真相改善 bulk fitting 证明agreeTiptap扩展打包、命令链、React 选择器钩子高于原始 Slate 的扩展打包经验把链式命令 API 塞进原始 Slate 核心Plate/产品层可拥有命令糖partialLexical脏节点调和引擎脏桶纪律与局部性证明类节点公共模型与插件重量定向脏运行时证明而非整体重写partial结论一句话Slate 应该偷这些机制而不是复制任何单一系统的身份。公共 API 与内部运行时的目标形态公共 APIkeep / cut / gate保留editor.read、editor.update、state 分组、tx 分组、用于本地编辑器绑定动作的扩展editor分组、renderVoid({ element, path })。从当前文档中裁剪editor.extend({ methods })任何称公共扩展方法是组合模型的措辞任何暗示公共扩展commands的措辞。加门禁公共virtualized渲染策略的稳定性。内部运行时保留模型拆分所有权评审建议把根运行时按 owner 拆分但绝不把职责移回Editableprops 或应用渲染器选择器底层 owner选区导入/导出 owner输入/组合输入 owner修复/trace owner渲染模式 owner根协调器仅作为薄装配点thin assembly。迁移骨干Plate 与 slate-yjsPlate 迁移骨干Plate 应能在以下基础上构建产品命令糖与有观点 UI扩展editor分组、state与tx分组、schema/spec 政策、content-only 渲染器、提交元数据。评审明确不要求当前 Plate 适配器兼容。slate-yjs 迁移骨干协作应始终扎根于确定性操作、快照、提交、本地/远程来源元数据、可重放的 tx 操作流。评审不要求当前 slate-yjs fixtures只要求操作与提交契约保持可信。浏览器与性能策略不得从命令存在宣布性能完成评审文档给出下一次性能证明必须命名的要素清单队列cohortsnormal、large、stress、pathological重复单位顶层块 文本/leaf 渲染单位p95/p99 交互行或实验室代理行DOM/组件/监听器计数原生行为保持或显式降级shell/staged/virtualized 模式政策。virtualized在浏览器查找、原生选区、复制、粘贴、全选、IME、移动端触摸选区、屏幕阅读器遍历、undo/history、协作行为被分类之前不得成为正常编辑承诺。高风险预案与维护者异议台账评审进入了high-risk deliberate mode因为公共 API 文档、React 选择器底层、根运行时、渲染策略政策都影响发布信任。其 blast radius 为 packages/slate、slate-react 相关源码、docs/slate-v2 下的文档、issue 覆盖率与 PR 引用文档、基准与浏览器证明门禁。五项 pre-mortem 风险已修订扩展文档清理被误当作源码 API 变更意外重开已删除的methods模型选择器重写回归运行时 id 扇出、deferred flush 或选择器错误重放根运行时拆分只搬代码、不降低排序风险virtualized 模式仍以正常编辑承诺示人用户依赖未挂载内容上的浏览器查找/屏幕阅读器遍历Plate/slate-yjs 迁移声明从底层证明漂移为适配器承诺。维护者异议台账objection ledger用最强合理异议 → steelman 反命题 → 权衡张力 → 采用/文档答案 → 所需证明 → 裁决六列格式逐条闭环代表性裁决包括扩展methods文档修订文档、保留源码教学具名分组而非复活methods选择器底层proof-first对照 external-store 适配器不盲目重写根运行时拆分按行为 owner 拆分并要求排序图ordering map根协调器仍是装配点virtualizedhard gate保持显式 experimentalJSDoc 必须点名浏览器查找、屏幕阅读器、选区、IME、移动端注意项核心 JSON/op/read-update 架构keep偷脏局部性、事务元数据、视图权威机制不换公共身份内部命令中间件保持内部原始 Slate 文档以生命周期/state/tx 优先Plate 后续可拥有产品命令链Plate/slate-yjs 声明gate只声明 state/tx 分组、操作流、提交、元数据、可重放性。硬裁剪hard cuts清单教授扩展methods的公共文档、暗示扩展commands的公共文档、把 shell/virtualized 当作无需证明的全原生行为的任何发布声明、无 owner 拆分的根运行时扩张。执行切片从规划到验证的七步闭环这是该文档最有工程价值的部分每一项决策都落到了一个可运行、可验证的执行切片上且每个切片都记录了状态、文件、验证命令与接受的残余风险。1. Docs Truth Sync文档真相同步将过期扩展methods教学从以下文件中移除absolute-architecture-release-claim.md、release-readiness-decision.md、final-api-hard-cuts-status.md、master-roadmap.md、architecture-contract.md、pr-description.md。结果扩展文档改为描述具名editor、state、tx分组commit 订阅者保持提交后集成路径命令中间件保持内部无 issue 声明变更。验证命令rg -n extend\(\{ methods\}\)|extension methods|public extension methods|Extension methods docs/slate-v2结果无命中。2. Selector Proof Spike选择器证明突击对活源码逐段读取并给出裁决不要直接用useSyncExternalStore替换useGenericSelector——那会丢掉太多隐式契约。正确的重写路径是做一个窄的编辑器选择器存储适配器保留现有监听器分类与 commit 扇出政策再让钩子通过 React 的 external-store 契约消费所选快照。适配器必须把以下项作为显式契约行保留最后选中值、最后选择器错误、选择器身份、相等性结果复用、操作线程化、shouldUpdate、deferred flush 语义、profiler 标识。被拒绝的捷径通用 helper 直接替换纸面上更干净但可能使选择器扇出更宽或把订阅错误推迟到后续渲染才暴露。3. Selector Contract Tests选择器契约测试在 provider-hooks-contract.tsx原记录于.tmp/slate-v2当前仓库对应测试树中新增公共钩子错误边界契约订阅时选择器错误在渲染期重放并带关联上下文、公共钩子操作契约commit 操作到达选择器更新路径、deferred 选择器契约同轮两次 commit 合并为一次选中渲染更新同时保留check/notifyprofiler 标记。实现代码保持不动——先用测试锁住行为再谈重写。4. Root Runtime Owner Split根运行时 Owner 拆分拆出两个已具备证明条件的 owner原生selectionchange监听器挂载与全局拖拽生命周期清理useEditableRootGlobalLifecycle、仅选区的 DOM 导出订阅useEditableRootSelectionExport。选区调和、Android 输入、修复、内核 trace、组合输入、事件运行时装配原样保留因为各自需要独立行为证明后才能继续抽取。同时增加静态所有权行防止这些路径漂移回根协调器。执行中遇到并解决了一个真实错误ReferenceError: ReactEditor is not defined——将ReactEditor从仅类型导入改为运行时导入后测试与类型检查全部通过。接受的残余风险这不声称整个根协调器已变小只是移除了两个已被证明的生命周期 owner。5. Virtualized Policy Syncvirtualized 政策同步从RenderingStrategyType中移除裸字符串virtualized使稳定字符串策略为auto、full、staged、shellvirtualized 渲染仅可通过显式对象形式{ type: virtualized, ... }使用JSDoc 强化为experimental 且仅对象形式并新增公共面契约防止其漂移回稳定字符串联合类型。接受的残余风险不增加任何浏览器/设备对等声明。6. Perf Proof性能证明验证命令bun run bench:react:rerender-breadth:local REACT_HUGE_COMPARE_BLOCKS5000 REACT_HUGE_COMPARE_ITERATIONS5 REACT_HUGE_COMPARE_TYPE_OPS10 bun run bench:react:huge-document:legacy-compare:local结果按文档记录rerender breadth 在热编辑通道上为0宽渲染、0兄弟 leaf 渲染、0父块渲染、0祖先渲染源码级失效保持精准文本编辑只唤醒文本行选区变化只唤醒选区行5000 块、5 次迭代、每次 10 个类型操作的大文档对比中v2DefaultRenderAuto全面胜出legacyChunkOnready17.01msvs298.87ms、start type15.64msvs36.66ms、middle type11.01msvs42.44ms、middle promote type16.76msvs40.71ms、replace full document5.37msvs128.48ms、insert fragment5.54msvs114.89msv2VirtualizedExperimental保持对象式 experimental同样快于legacyChunkOnready18.17ms、start type9.69ms、middle type14.54ms、replace full document7.90ms、insert fragment6.95msv2ShellExplicitRadius1不是发布级赢家middle select-then-type88.25ms、middle promote-then-type113.37ms差于legacyChunkOn记为后续项而非声明。裁决选择器/根运行时改动未造成广度回归5000 块基准支持当前默认渲染方向virtualized 仅作为压力证据不是稳定原生行为证明。7. Issue Syncissue 同步缓存优先cache-first记账不新增任何Fixes #...声明既有性能行保持Improves/Related/Not claimed/cluster-synced级别virtualized 政策变更只更新维护者 PR 引用措辞不运行任何 GitHub issue 评论、关闭或实时再发现。快速门禁与最终完成门禁计划阶段门禁cwd 为 plate 根rg -n \.tmp/completion-check\.md .agents docs bun run completion-check实现阶段的 Slate v2 门禁对应源码树bun test ./packages/slate/test/extension-methods-contract.ts ./packages/slate/test/public-surface-contract.ts bun test ./packages/slate-react/test/surface-contract.tsx bun test ./packages/slate-react/test/rendering-strategy-and-scroll.tsx bun run bench:react:rerender-breadth:local REACT_HUGE_COMPARE_BLOCKS5000 REACT_HUGE_COMPARE_ITERATIONS5 REACT_HUGE_COMPARE_TYPE_OPS10 bun run bench:react:huge-document:legacy-compare:local bun check仅在切片声称浏览器行为时的浏览器/设备门禁bun test:integration-local bun test:mobile-device-proof:raw该执行通道被标记为done的理由是ClawSweeper 通道经既有持久输出完成issue 账本记账完成过期扩展文档已修补选择器底层证明与契约测试已记录根运行时首批安全 owner 拆分已实现并通过测试virtualized 政策为对象式 experimental 且被 surface 测试覆盖rerender breadth 与 5000 块大文档对比的性能证明已记录。未被声称无任何 Slate v2 实现补丁完成、无测试或浏览器/设备门禁因本计划变绿、无 GitHub issue 被本计划新修复/关闭/评论。开放问题与决策变化条件当前对用户没有开放问题。会改变决策的三个条件若选择器迁移到 external-store 语义后测得局部性locality回归则保留自研辅助器并记录证明若根运行时拆分产生排序 bug则保留协调器但要求显式 owner 模块与聚焦测试若 virtualized 模式通过原生行为证明则从 gated 提升为 stable。结语给实现者的交接清单最终用户评审交接提纲浓缩为八行核心保留数据模型/操作/事务/read-update 架构扩展 API裁剪过期methods文档React 运行时重写或辩护选择器底层根运行时拆分协调器渲染契约保留 content-onlyrenderVoid性能模式shell/staged 保持显式virtualized 加门禁迁移保留 Plate/slate-yjs 骨干不承诺适配器issueClawSweeper 后按 fixed/improved/related/not claimed 列账。这套评审方法论的价值在于它以当前源码真相为准绳把好架构拆成可验证的 keep/revise/gate/cut 决策再用证明优先的切片执行逐项关闭——每一次重写都有契约测试先行每一次性能声明都有命名好的队列与重复单位每一次发布承诺都精确匹配证据层级。对于任何正在经历大版本架构收敛的编辑器项目这份 评审计划 都是一份可以照抄的完整模板。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考