ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Slate v2 React 运行时重构 Ralplan:selector-first 订阅与 sidecar 投影架构实战

Slate v2 React 运行时重构 Ralplan:selector-first 订阅与 sidecar 投影架构实战 Slate v2 React 运行时重构 Ralplanselector-first 订阅与 sidecar 投影架构实战【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate导读本文基于 plate 仓库中的规划文档 docs/plans/2026-05-04-slate-v2-clawsweeper-v2-react-runtime-ralplan.md完整拆解 Slate v2 对v2-react-runtime议题桶issue bucket的执行规划。该文档为后续实现划定了清晰的架构边界React 只作为提交快照committed snapshot之上的适配层热路径必须走命名 selector runtime-id 扇出投影、注解、widget 全部收敛到 sidecar 存储。读完本文你将掌握该规划的核心决策、28 条相关 issue 的分类账本逻辑、slate-react内部的提交发布链、可复现的单元/基准/浏览器证明门禁以及 Plate 与 slate-yjs 的迁移基板要求。一、规划背景为什么下一个集群是v2-react-runtime文档首先给出Verdict结论下一个执行集群是v2-react-runtime既不再回退到v2-input-runtime该检查点已在本地产明通道上完成也不直接跳到更大的v2-core-engine。理由来自完整 issue 账本的分阶段编排React 运行时/投影projection必须排在输入input与 DOM 桥DOM bridge证明之后而当前活跃的 React 表面已经具备足够的 provider、selector、projection、annotation 与 widget 契约足以支撑一个高杠杆的证明批次。规划给出的硬目标Hard take非常明确——这个桶不能退化为一次泛泛的 React 清理真正的靶心收窄为六条stable editor identity committed snapshot publishing selector-first subscriptions projection/annotation/widget sidecars focus/scroll lifecycle ownership no broad rerender as default behavior即稳定的编辑器身份、提交快照发布、selector 优先的订阅、投影/注解/widget 侧车、焦点/滚动生命周期归属以及默认不做大范围重渲染。该 Ralplan 状态为done已完成现状读取、ClawSweeper 相关 issue 发现、issue 账本路由、研究/活源刷新、性能/DX/迁移证明、异议/高风险评审、issue 同步核算与关闭评分为后续ralph逐片执行铺路。二、意图、边界与非目标意图Intent有三层把v2-react-runtime议题桶转化为可执行的证明切片proof slices阻止 React 的生命周期、订阅、焦点、投影与渲染器压力泄漏进核心 Slate让原生 Slate 保持无立场unopinionated同时让 React 的用法对开发者、Plate 与 Agent 都可预测。范围内In scope包括.tmp/slate-v2/packages/slate-react的 provider、hooks、selector 运行时、投影存储、annotation/widget 存储、焦点/滚动生命周期以及 React 可见的渲染契约仅在与焦点、选区、滚动、渲染行为用户可见时做浏览器/示例证明同时承担v2-react-runtime账本核算。非目标Non-goals同样清晰不建立 React 特定的核心编辑器模型不要求当前版本的 Plate 适配器不在原生 Slate 中加入产品级评论/工具栏/注解 UX不复活旧版受控valueprop不在缺少当前可复现用例的情况下对 Redux/MobX/HMR/debugger 类报告做精确关闭exact closure。决策边界Decision boundaries界定了三个包的职责包职责slate-reactReact context、provider 替换、订阅扇出、焦点状态对账、渲染期投影、sidecar UI 存储slate提交快照、操作、运行时 ID、供 selector 消费的事务事实slate-domReact 生命周期可调用的 DOM point/range 与浏览器选区桥但 React 不拥有 DOM 事实文档特别强调useEditor这类宽泛 hook 按契约可以保持宽泛但窄 hook 与 selector 才是推荐的 hot path而精确的 issue 关闭必须以当前可复现证明为准不能靠架构感觉architecture vibes。规划中无未决的用户决策点。三、源码支撑的当前状态Source-Backed Current State规划用真实源码与测试建立了现状基线这是全文最值得对照仓库的部分issue 矩阵v2-react-runtime共28 条行动桶行含 #5826、#5806、#5690、#5689、#5669、#5603、#5473、#5404、#3497、#3478、#3383、#4995、#4590、#4366、#4315、#4311、#4298、#4225、#4221、#4025、#3924、#3892、#2608、#5509、#3309 等。冻结需求文件React 运行时/身份/订阅压力覆盖111 条 issue且slate-react-v2拥有订阅、生命周期、焦点时序、占位符/渲染时序、编辑器替换语义、React 面生命周期集成、渲染期 decoration/annotation 投影等责任。provider 实现链.tmp/slate-v2/packages/slate-react/src/components/slate.tsx中:96创建 selector context:108订阅编辑器提交:123批处理提交扇出:162派发 selector 更新:175组合 decoration 与 annotation 投影源:216发布 provider 栈。selector hook 实现链.tmp/slate-v2/packages/slate-react/src/hooks/use-editor-selector.tsx中:66暴露useEditorSelector:135暴露useEditorState:171拥有 global/runtime/deferred 三档 selector 扇出。契约测试链provider-hooks-contract.tsx:53证明useEditor随Slate editor更换而更新:127证明 selectorshouldUpdate收到提交事实:182证明useEditorState经由editor.read读取projections-and-selection-contract.tsx:105证明产品名词 decoration 源、重叠投影与跨节点投影annotation-store-contract.tsx:126证明单一 annotation 实体同时驱动内联投影与侧栏状态widget-layer-contract.tsx:88证明选区 widget 切换不重渲染文本切片surface-contract.tsx:152把泛化 selector 归属围栏到命名表面。现状读取结论#5709的 provider 替换证明、#6013/#5605的编辑器初始化证明已在活源中完成且不在本桶重新争论#3656/#4141渲染广度、#4483/#4392/#3382/#3352投影压力、#3478/#5509Redux/MobX/外部 store 压力、#3497焦点丢失已表示但未精确关闭。ClawSweeper 已对所有当前行、相邻投影行与重路由候选跑完但该桶尚无关闭评分研究/活源、异议、证明门禁未完成前不得开始实现阶段。四、决策简报架构选项与最终形态规划用一张选项表锁定方向选项结论原因把核心 Slate 做成 React 形态reject用污染数据模型的方式解决适配层压力把宽泛 provider 失效当作常态reject会重新制造渲染广度与焦点抖动问题增加产品化 annotation/comment APIreject那是 Plate/产品通道不是原生 SlateSelector-first React 运行时 sidecar 存储choose与活源、issue 压力与性能约束一致只聚焦投影行reject for cluster桶还覆盖 provider 替换、焦点、滚动、readOnly/静态渲染、hook 类型、占位符渲染选定形态Chosen shape是一条单向数据流editor commit - committed snapshot - provider publishes editor/context - selector runtime fans out by global/runtime/deferred owner - projection/annotation/widget stores update by affected ids - DOM/selection/focus bridges repair only their owned browser surface原则Principles归纳为五条React 是提交快照之上的适配器不是编辑器事实的来源热路径优先命名 selector 与 runtime-id 扇出避免宽泛 context 失效投影、注解、widget UI 生活在 sidecar 通道中精确 issue 声明必须可重放证明原生 Slate 只暴露基板原语产品 UI 留在外面。后果Consequencesv2-react-runtime通过证明切片执行而非一次巨型 hook 重写宽泛 hook 允许保留但需文档注明宽泛热用法应使用 selector 或 sidecar 存储外部响应式集成报告在获得当前 Redux/MobX/父级重渲染复现之前一律保持Related。后续动作是把焦点/滚动/浏览器声明与纯 hook 测试分开压测且仅在声明状态变化时更新账本/dossier/PR 引用。五、公共 API 目标与硬切断规划的公共 API 目标保持如下方向Slate editor{editor} decorationSources{[source]} annotationStore{store} Editable / /Slate推荐热路径 hooksuseEditorState(selector, options); useEditorSelector(selector, equalityFn, options); useNodeSelector(selector, equalityFn, options); useTextSelector(selector, equalityFn, options); useSlateProjections(runtimeId); useSlateAnnotation(id); useSlateWidget(store, id);硬切断Hard cut四条不要 provider 级initialValue不要受控 Reactvalueprop 作为主状态模型当产品名词decorationSources与annotationStore已覆盖形态时不暴露公共projectionStoreprop原生 Slate 不放应用级评论/widget UX。内部运行时目标Slate保持提交订阅者 context 发布者selector 扇出集中在useEditorSelectorContext根 selector 源命名且围栏化投影/注解/widget 存储按 runtime 事实为键的 sidecar对焦点/滚动/readOnly/静态渲染只做集群同步而未精确声明的部分补证明。六、Issue 账本核算28 行的家族分类规划完整展示了 ClawSweeper 相关 issue 通道status: complete。搜索表面覆盖v2-react-runtime、already-accounted投影行、gitcrawl 集群3、10、19与单例 React 运行时行。gitcrawl 证据包括gitcrawl doctor --json返回659 个开放线程、617 个集群2026-05-04 同步集群3#3478、#4001、#3497、#3777为混合簇必须人工拆分集群10#5987 与 PR #6033为强异步 decoration 光标家族集群19#5088、#5473为scrollSelectionIntoView家族。分类结果表是本文档的信息密度核心完整继承如下家族Issues分类理由provider 身份 / 外部 React 存储#3478, #3497, #5509Related架构属主是 React 运行时/焦点/订阅精确的 Redux/MobX/父状态复现未重放projection / decoration / annotation sidecar#5987, #4483, #4477, #4392, #3382, #3352Improves现有投影/annotation/widget/渲染广度证明实质缓解压力但不声明旧 API 关闭decoration/mark 语义候选#3383, #3309Relatedv2 投影模型是属主但重叠 mark 与 Firefox 装饰选区复现未证明内联与手势选区#5806, #5690, #5689Related需要内联/自定义边界周围的浏览器手势证明滚动与焦点生命周期#5826, #5473, #4995, #4590Related需要精确的 refocus/delete/arrow/自定义边界浏览器证明原生输入事件透传#5603, #5669Related已由 input-runtime dossier 覆盖无 React 运行时声明变化hook 与组件类型#5404, #4366Relatedv2 hook/组件类型表面更干净但不声明旧 API 精确关闭占位符渲染#4315, #4221, #2608Related属主是 React 运行时精确的符号/全选/对齐证明缺失readonly/static/自定义表面#4311, #4025, #3924, #3892Related / Not claimed静态/readOnly 压力有效自定义布局引擎属生态/产品领域mark 查询/渲染编辑器状态#4298, #4225Related需要聚焦的 mark-query/hook 证明固定修复Fixed本规划不新增保持 #6013、#5605、#5709 三条不变。账本重路由#5509与#3309从v2-input-runtime移到v2-react-runtime证据来自类别、包、集群与 dossier导致v2-input-runtime由 149 降到 147、v2-react-runtime由 26 升到 28这两个 issue 保持Related而非Fixed。PR 引用同步API 形态、证明状态、精确固定声明与 PR 可见 issue 计数未变故本趟无需编辑docs/slate-v2/references/pr-description.md。Fork dossier 同步为 #5806、#5690、#5689、#5404、#3383、#4995、#4590、#4366、#4315、#4311、#4298、#4225、#4221、#4025、#3924、#3892、#2608、#4483、#4477、#4392、#3382、#3352 新增 fork 本地节其余 9 条已有覆盖。本规划引用的账本文件均可直接在仓库中查阅issue 矩阵、开放 issue 账本、gitcrawl 活开放账本、issue 覆盖矩阵、fork issue dossier。七、研究/活源刷新五家编辑器的横向证据规划做了跨项目源码比对research/live-source refresh, status: complete结论是不转向no pivot但执行计划要针对两家基准强化Reactuse-sync-external-store的useSyncExternalStoreWithSelector暴露 selector/equality 外部 store 形态选中值相等时 bail out并委托给useSyncExternalStore——支撑 Slate v2 的 selector-first 适配器但不取代 Slate 自身的提交脏度或 runtime-id 索引。LexicalLexicalEditor.ts把 update 与 decorator 监听分区read/update是显式一致性边界LexicalUpdateTags为历史、粘贴、协作、滚动、DOM 选区、焦点、组合命名标签LexicalUpdates.ts先处理脏叶子再处理脏元素LexicalReconciler把脏集合喂给对账。这是 Slate v2 必须以操作派生的提交脏度回应的更强 dirty-reconcile 基准。ProseMirrorselection.ts集中 DOM 选区导入/导出domobserver.ts拥有突变观察并协调脏标记、DOM 变更处理、视图状态更新与 DOM 选区修复viewdesc.ts定义 NodeView 义务、contentDOM是子渲染边界decoration.ts保持 decoration 为映射后的视图数据。这强化了 Slate v2 的集中 DOM 桥与投影存储方向。TiptapuseEditor.ts默认使用外部 store 订阅并退出事务重渲染useEditorState.ts使用useSyncExternalStoreWithSelectorCommandManager.ts围绕单事务构建链式命令。Tiptap 是 DX 基准但引擎模型不可整体照抄。Legacy Slate被 v2 切割的残余形态use-decorations.ts通过ReactEditor.findPath重算 decoration selectoruse-children.tsx在渲染期刷新NODE_TO_INDEX/NODE_TO_PARENTuse-slate-selector.tsx在每次编辑器变更时扇出宽泛 selector 监听。Current Slate v2slate.tsx发布提交感知的 selector 派发use-editor-selector.tsx有 global/runtime-id/deferred 三档扇出use-slate-projections.tsx使用 runtime-id 投影订阅use-decoration-selector.tsx把 decoration 读取限定到 runtime-id 存储。现有测试已经证明 provider 替换、selector 相等性、运行时投影唤醒与 annotation/投影拆分的第一层。研究结论明确不复制 Lexical 类节点、ProseMirror NodeView、Tiptap command-first 创作模型作为原生 Slate 公共模型精确 issue 声明保持不变。八、置信度评分与门禁结果规划给出六维加权评分总计0.92维度权重得分React 19.2 运行时性能0.200.93Slate 贴近的无立场 DX0.200.92Plate 与 slate-yjs 迁移基板0.150.88防回归测试策略0.200.93研究证据完整性0.150.92shadcn 风格可组合性与最小 hooks0.100.91门禁结果done无新固定 issue 声明计划已可交给ralph执行。九、通过调度与状态账本七个 pass 的演化轨迹规划把从初评到交付的七个 pass 完整记录在案展示评分如何从 0.78 涨到 0.92Pass证据规划增量current-state-read-and-initial-scoreissue 矩阵、需求、覆盖矩阵、活slate-react源码/测试选定v2-react-runtime评分 0.78related-issue-discovery-passgitcrawl doctor、集群 3/10/19、单例批次、活账本、dossier分类 React 运行时/投影家族补 dossier 节评分 0.81issue-ledger-passissue 矩阵、开放账本、gitcrawl 账本、dossier、覆盖矩阵重路由 #5509/#3309评分 0.84research-and-live-source-refresh五家编辑器源码与编译研究页方向不变补 dirty-set/DOM 桥/NodeView/映射 decoration/Tiptap selector 证据评分 0.86performance-dx-migration-proof-pass性能规则、基准命令面、render-profiler 契约、压力浏览器预算测试补 cohort/重复单元/单元-浏览器-基准/React 19/TDD/迁移基板门禁评分 0.88objection-and-high-risk-passsteelman 行、高风险触发、爆炸半径、pre-mortem、扩展证明计划修订宽泛 hook、基准范围、React Activity、shell/压力退化、issue 声明、迁移非声明的证明策略评分 0.89issue-sync-accounting-pass覆盖矩阵、dossier、PR 引用、gitcrawl 账本、issue 矩阵声明行确认性能与异议 pass 后无新声明变化无需 PR 引用编辑评分 0.90closure-score-and-handoff最终评分、接受决策、硬切断、执行交接标记计划可交ralph评分 0.92无新 issue 声明十、实现阶段草稿与快速驱动门禁实现阶段草稿闭评分前不得执行共六步React provider/hook 身份与 selector 扇出证明保护编辑器替换、hook 返回类型、宽窄 hook 语义与 provider 回调事实证明 runtime-id selector 忽略无关提交、宽 selector 保持有意宽泛。Projection/annotation/widget 证明投影 rebase、重叠负载、稳定 annotation/widget 更新、无重复文本切片重渲染。焦点/滚动/readOnly/静态渲染证明把 #5826、#5473、#4995、#4590、#4311、#4025、#3924 映射为精确证明或保持Related。性能工件证明性能声明前必须运行当前 React 基准命令rerender breadth、huge document overlays、huge document legacy compare。迁移基板证明Plate/slate-yjs 证明保持在基板层——provider 替换、selector 事实、annotation/widget sidecars、runtime ids/bookmarks、扩展命名空间、事务事实、提交元数据。账本与 PR 同步只添加证明真正支撑的Fixes/Improves/Related行。快速驱动门禁Fast Driver Gates分为四类单元门禁cd .tmp/slate-v2 bun --filter slate-react test:vitest -- provider-hooks-contract projections-and-selection-contract annotation-store-contract widget-layer-contract surface-contract render-profiler-contract rendering-strategy-and-scroll bun --filter slate-react typecheck基准门禁cd .tmp/slate-v2 bun run bench:react:rerender-breadth:local bun run bench:react:huge-document-overlays:local bun run bench:react:huge-document:legacy-compare:local bun run bench:core:refs-projection:local基准工件必须复用.tmp/slate-v2/scripts/benchmarks/README.md中的现有命令面与packages/slate-react/tmp/、.tmp/下的 JSON 输出不新建平行基准文件。浏览器/压力门禁为搜索高亮渲染预算、外部 decoration 源、annotation 元数据更新、annotation bookmark rebase、widget dirty id 更新、混合 overlay 更新、渲染策略运行时预算保持生成的压力行绿色实现触及焦点/滚动/静态渲染/readOnly/void/占位符/内联自定义边界/浏览器可见选区时先跑/补所属 Playwright 路由 grep 再改 issue 声明。TDD 门禁每个实现切片一个行为优先的红/绿证明测公共契约与浏览器行为而非私有 store 内部不为本重写有意切断的 API 写死代码删除测试。原生行为分类表也是关键约束表面Normal/medium/large DOM-presentShell/virtualized/stress浏览器查找原生或显式nativeSurfaceComplete门控not-native-until-mounted原生选区DOM 桥拥有导入/导出model-backed或 materialize-first复制/全选原生/模型负载必须匹配当前策略model-backed 负载带显式策略粘贴绝不落入过期/缺失 DOM先 materialize 或按策略拒绝IME/移动触摸紧急目标必须已挂载目标交互前先 materializeundo/历史/协作提交事实与 runtime ids 驱动 selector历史中无挂载状态污染React 19 规则useSyncExternalStore带 selector/equality 是提交编辑器/运行时状态的获批外部 store 形态Activity只允许用于隐藏面板、调试 UI 与后台示例不是隐藏可编辑子树原语startTransition与 deferred values 允许用于非紧急 overlay、搜索侧栏与检查器工作而打字、选区、组合、光标修复保持紧急。工作负载队列Workload Cohorts按块数分级normal0-500DOM-present无降级原生行为、medium500-2000DOM-present严格重复单元预算、large2000-10000仅在原生行为被分类并测量后做 DOM-present 分组或分阶段就绪、stress10000-50000显式 opt-in 降级候选不声明原生等价、pathological自定义渲染器、多 decoration 源、annotation、widget、void、隐藏边界、表格、IME/移动必须携带独立浏览器/原生证明行。重复单元预算默认段落/文本渲染路径每重复单元0 个 Slate 自有事件处理器、0 次 useEffect除非同步真实外部系统、渲染期无 O(document) 查找、selector 订阅按 runtime id/根源/显式宽泛属主限定、不在每个重复文本单元挂载评论/widget/菜单/annotation 状态。投影/annotation/widget 通道要求 runtime-id/source-id 作用域唤醒、变更桶计数匹配受影响 id、纯元数据更新不得重绘稳定投影文本切片、产品 UI 保持 sidecar/portal。十一、异议与高风险 pass十行维护者反对意见该 passstatus: complete应用了steelman-pass与high-risk-deliberate-pass跳过intent-boundary-pass规划已有显式意图/范围/非目标/决策边界。高风险触发器涵盖公共 React hook/provider 行为、运行时订阅扇出、浏览器可见行为、性能发布门禁、迁移基板与 issue 声明准确性。爆炸半径覆盖slate-react为主、触及浏览器行为时波及slate-dom消费方包括原生 Slate React 用户、Plate、slate-yjs 式协作消费方、示例与文档。十行维护者反对意见表最值得引用的决策仲裁决策最强公平反对裁定接受修订Selector-first React 运行时这可能变成比 context 更难推理的自研迷你 React storekeepselector 必须基于提交事实、按 runtime/source 作用域用 render-profiler 与基准行测量宽泛 hook 保留useEditor和宽 selector 会让用户重造渲染广度 bugrevise宽 hook 契约允许但热路径文档/证明必须指向窄 selector 与 sidecarProjection/annotation/widget sidecars把行为拆到多个 store 会隐藏过期投影或复制/选区 bugkeepsidecar 更新需要 runtime-id/source-id 唤醒证明影响可见文本时还需浏览器/原生行为证明焦点/滚动/readOnly/静态证明这个桶会膨胀成所有旧浏览器 bugrevise精确 issue 声明必须精确浏览器复现证明否则保持Related性能基准门禁每个切片都跑全量基准太慢会腐化revise单元门禁按切片基准门禁是桶/发布证明性能声明前执行React 19Activity人们会把 Activity 当虚拟化可编辑体支持hard cutActivity 仅限隐藏/后台 UI可编辑缺 DOM 走 DOM 覆盖策略而非 React 隐藏Shell/压力退化给降级原生行为分类等于把更差编辑器正常化hard cutshell/虚拟化/压力保持显式 opt-in/非默认不得声明原生等价Plate/slate-yjs 迁移基板基板证明太模糊帮不了真实迁移revise实现触及迁移表面时要求 runtime ids/bookmarks、扩展命名空间、事务事实与提交元数据Issue 声明计划听起来像修复了 #3478/#3497/#5509 却没重放keep hard boundary精确固定声明保持仅 #6013/#5605/#5709直到当前复现证明落地Hook/store 表面积hook 太多会成 API 蔓延revise保留唯一规范 selector 路径便捷 hook 视为经过证明的包装而非独立概念三场景 pre-mortem覆盖三个最可能的失败模式(1) 渲染广度在更漂亮 API 下回归——宽 hook 或 sidecar 订阅过广导致打字唤醒投影/评论/widget 区域外的文本预防手段是 render-profiler、生成压力预算与 rerender-breadth 基准前置(2) 浏览器行为过单元测试却在真实编辑失败——焦点/滚动/静态/readOnly/占位符只经 hook 证明导致选区跳动、焦点丢失、浏览器查找/复制分歧、自定义边界附近移动/IME 异常预防手段是浏览器/压力行在改精确声明前强制执行(3) 迁移与 PR 叙事过度声明——架构方向更好就把 related 行升级而无复现证明预防手段是本趟零声明变化非精确证明一律保留Related。十二、Issue 同步核算、关闭评分与 Ralph 交接Issue 同步核算 passstatus: complete复查了 issue 矩阵、覆盖矩阵、fork dossier、PR 引用与 gitcrawl 账本结论是五个无需编辑精确固定声明仍仅 #6013/#5605/#5709#5509/#3309 在覆盖矩阵与 dossier 中已是Related异议 pass 只改了证明策略而非 issue 状态公共 API/证明/发布门禁/固定计数无变化。账本结果四类全不变PR 可见声明计数不变。关闭评分总分0.92无维度低于 0.85所有 pass 完成计划就绪可交ralph执行且关闭过程未新增任何 issue 声明。Ralph 执行顺序五步① provider/hook 身份与 selector 扇出保护编辑器替换、hook 返回类型、selector 相等性、宽窄语义、runtime-id 扇出② projection/annotation/widget sidecars投影 rebase、重叠负载、annotation 元数据更新、widget dirty ids、无重复文本切片重渲染③ 浏览器可见生命周期焦点/滚动/readOnly/静态/占位符/内联行仅在聚焦浏览器证明后精确声明④ 性能工件性能声明前跑选定门禁⑤ 迁移与账本同步保持基板级证据仅在证明改变具体声明时更新账本。首个ralph目标是 provider/hook 身份与 selector 扇出且首个执行切片除非为具名 issue 增加精确复现证明否则不得改动 issue 声明。十三、Ralph 执行账本切片落地实录规划末尾的执行账本记录了实际切片结果与仓库当前状态相互印证Pass状态证据规划增量provider-hook-identity-selector-fanoutcompleteEditorSelectorOptionsTEditor红/绿类型契约聚焦 provider/surface 测试包 typecheck 现含泛型 selector 契约导出类型化 selector 选项、内部 selector 扇出保持原样PR 引用为公共 hook 类型同步projection-annotation-widget-sidecarscompleteprojection、annotation、widget、render-profiler、rendering-strategy 单元门禁全绿无代码增量现有 sidecar 证明保持有效browser-visible-lifecycleskipped本切片只改 selector 类型表面无焦点/滚动/选区/静态渲染/占位符/void/浏览器路由行为变化浏览器门禁仍为未来浏览器可见增量保留performance-artifactsskipped无性能声明变化基准门禁仍是发布/性能声明门禁migration-and-ledger-synccompleteissue 覆盖不变PR 引用为公共 API 形态同步执行检查点更新active goal state为下一 pass 交接十四、硬切断与最终完成门禁硬切断五条红线不复活 providerinitialValue不添加受控 Reactvalue不让核心 Slate 拥有 React 订阅不把 projection、annotations、widgets、产品评论折叠成一个产品化公共 API无当前复现证明不声明 Redux/MobX/焦点/HMR/debugger 修复。最终完成门禁ClawSweeper 与 issue-ledger pass 在 React 运行时/投影表面完成每个评审 issue 节的矩阵与 dossier 已同步PR 引用仅在声明/API/证明状态变化时更新每个被接受的实现阶段都有聚焦单元证明、需要处有浏览器证明评分 ≥ 0.92 且无维度低于 0.85关闭前 pass 账本全部完成。当前关闭结果complete。结语这份 Ralplan 的价值与当前仓库的对照这份规划的价值不在于修了多少 issue而在于建立了一套可复证的执行纪律slate-react只做适配层、selector-first 是热路径契约、投影/注解/widget 走 sidecar、issue 声明必须有当前复现证明。在当前仓库中v2-react-runtime的架构方向已通过EditorSelectorOptionsTEditor类型契约与 provider/surface 测试在 packages/slate/src 与 packages/core/src/react/stores/plate/useEditorSelector.ts 中得到落地印证——后者正是 selector-first 思想在 Plate 侧的现役实现selectAtomequalityFn 按 id 的 store 选择。若你需要在 Plate 生态中实践同样的性能纪律可对照本文的重复单元预算、工作负载队列与原生行为分类表为你的编辑器建立自己的证明门禁若你在评审或迁移 Slate 类编辑器这份文档的反对意见表 pre-mortem方法同样可以直接复用。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表