性能工程与构建演进
1. 运行时性能:大文档编辑
1.1 Chunking 插件
ChunkingPlugin 默认 chunkSize=1000,并支持 content-visibility: auto 渲染优化:
- 路径:
packages/core/src/lib/plugins/chunking/ChunkingPlugin.ts
这类设计针对的是“上千块级节点”的典型编辑器痛点。
1.2 NodeId 的性能折中
NodeIdPlugin 有一个很实用的优化:当 normalizeInitialValue=false 时,只先看首尾节点判断是否需要全量补 ID。
- 路径:
packages/core/src/lib/plugins/node-id/NodeIdPlugin.ts
这体现了 Plate 在 correctness 和初始化速度之间的工程平衡。
2. 操作链性能:按需执行
在 SlateExtensionPlugin 的 apply 覆盖里,Plate 会先判断有没有 onNodeChange/onTextChange 处理器,没有就快速路径直通 apply。
- 路径:
packages/core/src/lib/plugins/slate-extension/SlateExtensionPlugin.ts
这是典型的热路径优化:把“无监听场景”成本降到最低。
3. 配置合并策略的性能演进
迁移文档记录过一次关键优化:插件 options 从 deep merge 改为 shallow merge,以修复 v37 引入的 editor 创建性能回退。
- 证据:
docs/migration/v48.mdx(@udecode/plate-core@38.0.1说明)
这类优化很利于说明工程取舍:能说明团队如何从真实性能回归里反推 API 策略。
4. 构建性能:Rollup -> Tsup/tsdown
Issue #2627 的目标非常明确:
- 更快构建与 watch
- 更好的 Next.js 联调热更新(
transpilePackages) - 保持产物行为无回归
这说明 Plate 对“开发反馈速度”高度敏感,不只是关注运行时。
5. 大规模重构中的性能线索
PR #3920 讨论里直接提到表格编辑性能、React.memo、resizable 依赖等问题,属于“用真实场景驱动架构重排”的典型案例。
6. 可讲的性能方法论
- 热路径先短路(无 handler 直接过)
- 大数据量场景做结构化分块(chunking)
- 初始化成本做启发式判断(NodeId 首尾检测)
- 构建链路与运行链路一起优化(不是二选一)
小结
Plate 的性能思路是系统性的:编辑运行时、初始化、插件合并策略、构建反馈链路都在同一优化框架里。