:为虚拟化与 Shell 模式划定原生行为底线)
Plate 编辑器降级契约Degradation Contract为虚拟化与 Shell 模式划定原生行为底线【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate导读本文围绕 Plate 仓库.agents/skills/performance/rules/degradation-contract.md中的核心规则展开说明在编辑器引入虚拟化渲染、Shell 岛屿shell islands、模型驱动选择model-backed selection或分阶段挂载staged mounting等激进性能手段时如何为每一种降级模式登记完整的行为契约明确哪些原生浏览器行为被改变、哪些保持原生、哪些显式不支持。读完本文你将掌握在 Plate/Slate v2 大文档性能工作中为降级模式撰写契约的完整字段清单、拒绝清单以及如何与同目录下的cohort-segmentation、repeated-unit-budget、staged-readiness、editor-native-behavior-proof等规则配合形成可评审、可验证的性能路线。为什么需要降级契约性能优化不能以静默破坏为代价在富文本编辑器领域更快从来不是唯一目标。浏览器为编辑器提供了大量原生能力——CtrlF查找、原生选区、屏幕阅读器遍历、剪贴板复制粘贴、IME 输入法组合、移动端触摸选字、撤销/历史栈、协作远程更新——这些能力依赖真实、完整、新鲜的 DOM 表面。一旦为了性能引入虚拟化、Shell 岛屿或分阶段挂载DOM 就不再完整或不再即时上述原生行为就可能悄悄失效。这正是degradation-contract.md要解决的问题。该规则文件位于.agents/skills/performance/rules/degradation-contract.md属于仓库中performance技能.agents/skills/performance/SKILL.md负责维护的独特性能评审维度。技能文档明确当性能需要虚拟化、Shell 岛屿、模型驱动选择、分阶段挂载或任何非原生模式时必须加载本规则degradation-contract一行的 use-when 条件。与它配套的规则还包括规则文件使用时机cohort-segmentation.md计划笼统说大文档大列表而不区分规模/复杂度分群repeated-unit-budget.mdblock、row、decoration、island 等重复单元以规模放大staged-readiness.md计划包含启动、水合、全文档替换或分阶段 DOM-present 挂载editor-native-behavior-proof.md更快的模式可能改变浏览器原生行为核心规则先优化原生 DOM-present 路径再谈降级规则文件的## Rule节给出了降级契约的第一原则原文可概括为两句话先优化原生 DOM-present 路径——在考虑任何激进模式之前先把所有 DOM 完整呈现DOM-present的默认路径做到极致只为具名分群降级并说明哪些原生行为发生改变——降级不是全局默认而是针对明确命名的 cohort分群且每个降级行为必须伴随行为变更声明。这条原则在仓库的实际执行中体现得非常具体。在 2026-05-03-slate-v2-dom-present-large-doc-phase-6-plan.md 的 Performance Pass 记录中该项目对 large-doc大文档路线的态度是degradation contractDOM-present 分阶段挂载是暂时缺失 DOM 完成承诺completion promiseShell 是显式激进的模式虚拟化保持实验性experimental文档同时强调No default mode——没有任何激进模式默认开启只有满足前置条件materialize caret target、model-backed copy、IME target mounting、mobile selection、browser find strategy、screen-reader strategy、persistent caret soak 等才考虑产品级模式。也就是说降级契约的第一条规则在实际路线图中被翻译为原生 DOM-present 是安全默认基线Shell/遮挡occlusion升级必须显式声明虚拟化只有在用户显式打开研究通道时才被允许。契约正文每个降级模式必须登记的十个字段规则文件的## Contract节定义了降级契约的最小信息集。对每一个降级模式都必须记录以下十个字段。下面逐项结合 Plate/Slate 编辑器的实际场景展开说明。1. Cohort threshold分群阈值该模式从哪个规模/复杂度阈值开始生效降级不允许一刀切必须绑定到具名分群。这与cohort-segmentation.md的基线分群表直接对应Cohort示例默认立场normal0–500 blocks低装饰量优化重复单元repeated unitmedium500–2000 blocksDOM-present严格执行预算large2000–10000 blocksDOM-present 分组分阶段工作保护原生行为stress10000–50000 blocks显式降级候选pathological自定义渲染器、comments、annotations、嵌套隐藏范围按复杂度打标签不藏在 block 数里例如一个虚拟化模式如果只应用于 stress cohort10000 blocks就必须在契约里写明这一阈值并说明 normal/large cohort 不采用该模式。在 2026-05-03-slate-v2-dom-present-large-doc-phase-6-plan.md 中实际记录的分群为1000, 5000, 10000, 25000 blocks且Shell 与 DOM-present 默认模式分开计数——这正是每个性能声明必须点名其覆盖的 cohort的落地。2. Browser find behavior浏览器查找行为CtrlF/CmdF是用户最依赖的原生能力之一而浏览器 find 只能命中真实存在于 DOM 中的文本。虚拟化意味着视口外的文本根本没有 DOM 节点浏览器 find 会搜不到Shell 模式若用代理 DOM 代替真实内容find 可能命中错误文本。契约必须写明该模式下浏览器 find 是否可用是 nativeDOM 完整还是需要 materialize-first先物化目标范围再查找是否需要显式 opt-in 的搜索模式来物化全部 DOM3. Screen-reader behavior屏幕阅读器行为屏幕阅读器同样依赖 DOM 的语义结构与文本顺序。分阶段挂载造成远处 DOM 缺失时阅读器遍历到一半就断了Shell 岛屿若在无障碍树accessibility tree中暴露了占位节点阅读器会读出错误的导航信息。契约需要声明阅读器遍历是 native、materialize-first还是显式不支持。4. Native selection behavior原生选区行为原生选区依赖 DOM Range 与真实文本节点。当选中范围跨越尚未物化的隐藏区域时Selection API 无法表示该范围。契约必须回答跨隐藏边界的选区如何映射是采用模型model映射选区、先物化目标范围再选择materialize-first还是该场景显式不支持5. Copy/paste behavior复制/粘贴行为这是规则文件## Reject节特别点名的一项禁止没有可见契约的模型驱动复制/粘贴。当选中内容部分在 DOM 外时document.execCommand(copy)/Clipboard API 只能拿到 DOM 中存在的部分。模型驱动复制意味着从编辑器数据模型重建剪贴板内容——这可行但必须在契约中显式说明复制内容由模型重建明确粘贴时序列化格式如 HTML、纯文本、自定义 JSON的映射规则保持复制/粘贴结果的可见性与一致性不能出现复制了 A 粘贴出 B的静默错误。6. IME/composition behaviorIME/组合输入行为中文、日文、韩文等输入法的 composition 过程极端依赖 DOM 文本节点的连续性与实时性。分阶段挂载若在组合输入进行中物化/卸载 DOM会导致拼音组合中断或候选词丢失。契约必须说明IME 目标区域的挂载策略IME target mounting、组合期间的 DOM 稳定性保证以及该模式是否要求先物化再输入。7. Mobile behavior移动端行为移动端触摸选字、长按菜单、虚拟键盘弹出等行为与 DOM 选区/焦点状态强耦合。契约需声明移动触摸选择mobile touch selection在该模式下是 native、materialize-first 还是显式不支持。8. Undo/history behavior撤销/历史行为撤销栈依赖操作与 DOM 变更的因果一致性。如果物化过程本身产生了大量隐藏的 DOM 变更撤销时这些变更会污染历史。契约必须说明物化/卸载操作是否进入历史栈、撤销是否能正确跨过隐藏区域、历史记录是否保持用户可理解的操作粒度。9. Collaboration behavior协作行为在 Plate 的 Yjs 协作场景中远程更新需要应用到 DOM 表面。分阶段挂载期间隐藏区域的远程更新是排队、丢弃还是立即物化协作行collaboration/remote update在editor-native-behavior-proof.md的 Proof Rows 中与其它原生行为并列必须逐一作答不能默认协作没问题。10. Escape hatch or explicit opt-in逃生通道或显式选择每个降级模式都必须给用户一条退路要么提供显式 opt-in用户主动开启例如实验性虚拟化开关要么提供逃生通道模式出问题时一键回退到原生 DOM-present 路径。契约需写明开关在哪、默认值是什么、回退后哪些能力恢复。拒绝清单三种一票否决的表述规则文件的## Reject节列出三种必须被拒绝的情况这是性能评审的红灯在重复单元预算耗尽之前就把虚拟化设为默认——即repeated-unit budgetrepeated-unit-budget.md没有先执行、先证明就直接上虚拟化。预算表的每个维度每个单元 DOM 节点数、React 组件数、事件处理器、effects、subscriptions、selectors、每次交互分配量、样式/布局成本、React scheduler/effect 成本都该先被压到最低正如预算规则所说每单元移除两个 DOM 节点在 10k 单元时就是 2 万个节点的减少。只有单元级优化到极限仍然不够时降级才进入讨论范围。把 Shell 模式描述成同一个编辑器只是更快same editor, just faster——Shell 改变了 DOM 表面与交互语义它就是不同的行为模式。任何只是更快的表述都是在掩盖未声明的行为变更必须拒绝并要求补全契约。没有可见契约的模型驱动复制/粘贴——模型重建剪贴板内容本身可以接受但必须伴随上面第 5 项要求的显式契约否则拒绝。与相邻规则的配合从降级到可验证降级契约不是孤立文件它处在 performance 技能规则网的中心。评审一个激进模式时四条规则需要联合使用staged-readiness给挂载过程两个可测量的终点staged-readiness.md 要求把可交互与原生表面完整分开度量interactiveReady活跃/走廊active/corridor内容已新鲜且可编辑nativeSurfaceComplete所有预期的 DOM 都已新鲜可供浏览器 find、原生选择、复制与阅读器遍历。其硬规则Hard Rule是预热期间缺失远处 DOM 可以接受但把陈旧旧 DOM 冒充当前内容展示则不可接受。评审时需要用 Gate 清单度量visible commit timing可见提交时机、background completion timing后台完成时机、max-latency budget最大延迟预算、stale DOM count陈旧 DOM 数量、pending group count待处理分组数、far interaction 的 materialization cost远处交互的物化成本。editor-native-behavior-proof给契约一个逐行打勾的证明editor-native-behavior-proof.md 提供 11 行 Proof Rowsbrowser find、screen-reader traversal、native selection、copy、paste、select-all、IME/composition、mobile touch selection、undo/history、collaboration/remote update、follow-up typing after repair/materialization。对每种模式逐行标注状态native原生model-backed模型驱动materialize-first先物化intentionally unsupported有意不支持explicit opt-in only仅显式选择其核心禁令与降级契约一脉相承不要把原生行为回归藏在时间收益里Do not hide native behavior regressions inside timing wins。仓库中的实战形态一个已应用的降级契约示例在 Plate 的 Slate v2 大文档路线中降级契约被正式应用于 2026-05-03-slate-v2-dom-present-large-doc-phase-6-plan.md。该计划第 242–269 行的 Performance Pass 记录了一个完整的契约形态repeated unit顶层 root group 与 editable 后代cohorts1000 / 5000 / 10000 / 25000 blocksShell 与 DOM-present 默认分开计数budgets普通打字不得查询文档扫描注册表pending root groups 应合并注册而非为每个隐藏 block 注册一个边界每个 root group 的事件/effect 工作量在注册之外趋近于零metricsstartup、typing、selecttype、full replace visible commit、interactiveReady、nativeSurfaceComplete、DOM nodes、editable descendants、root groups、shell count、heapdegradation contractDOM-present 分阶段挂载 暂时缺失 DOM completion promiseShell 显式激进模式virtualization 保持实验性dashboard/RUM gap未来生产级证明需要 document-size、mode、interaction name、group counts、DOM nodes、heap、browser、mobile、IME、release 等标签。与此同时2026-05-03-slate-v2-experimental-virtualized-rendering-boundary.md 展示了虚拟化实验性标签的落实公共Editable渲染策略配置保留type: virtualized但文档、JSDoc、示例侧边栏均标注Experimental. Not production-ready.且主Editable文档与性能文档改为链接到独立实验文档而不是内联教学。这正好呼应降级契约中显式 opt-in only的要求——虚拟化模式可以被代码支持但绝不能被描述为生产就绪的默认能力。快速撰写模板一份可直接套用的降级契约综合上述规则为一个新的降级模式例如某个 cohort 的虚拟化或 Shell撰写契约时可直接套用以下模板## Degradation Contract: 模式名 - 适用 cohort阈值如 stress 10000–50000 blocks且必须带复杂度标签 - 触发条件repeated-unit 预算已耗尽并留有证据 - browser findnative | materialize-first | unsupported - screen-readernative | materialize-first | unsupported - native selectionnative | model-backed | materialize-first | unsupported - copy/pastenative | model-backed必须描述序列化映射| unsupported - IME/compositionnative | materialize-firstIME target mounting 策略| unsupported - mobilenative | materialize-first | unsupported - undo/history变更是否入栈、跨隐藏区撤销策略 - collaboration远程更新在隐藏区的排队/物化策略 - escape hatch / opt-in开关路径、默认值、回退行为 - 证明文件editor-native-behavior-proof 11 行逐项状态 staged-readiness 的 interactiveReady/nativeSurfaceComplete 度量 浏览器 trace/RUM 标签结语降级契约的本质是把为了性能牺牲原生行为这件事从隐性决策变成显式、可评审、可回退的工程记录。在 Plate 这类以浏览器原生编辑能力为生命线的富文本编辑器中任何更快的声明都必须先回答更快之外我还改变了什么。遵循本文所述的十条契约字段、三条拒绝红线以及与 cohort-segmentation、repeated-unit-budget、staged-readiness、editor-native-behavior-proof 的组合用法可以让虚拟化、Shell 岛屿、模型驱动选择与分阶段挂载这些激进手段始终处于受控范围——原生 DOM-present 路径永远是默认基线降级只为具名分群发生且每一项原生行为变更都有据可查、有路可退。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考