# 性能表现 性能是编辑器应用的关键特性,块编辑器也不例外。 ## 指标衡量 为确保块编辑器在版本迭代和开发过程中始终保持高性能,我们通过[性能基准测试任务](#性能基准测试任务)监控以下核心指标: 部分关键指标包括: - **加载时间:** 编辑器页面加载所需时长。涵盖服务器响应时间、首次绘制时间、首次内容绘制时间、DOM内容加载完成时间、页面完全加载时间以及首区块渲染时间(文章与站点编辑场景均包含)。 - **输入响应时间:** 在编辑器中输入时浏览器作出响应所需时长。 - **区块选择时间:** 用户选择区块后浏览器作出响应所需时长(插入区块等效于选择区块,监控选择操作即可同步覆盖这两项指标)。 ## 关键性能决策与解决方案 **数据模块异步模式** WordPress组件库与块编辑器的数据模块基于Redux构建。这意味着状态全局存储,当状态发生变化时,依赖该状态的组件(UI)会相应更新。 随着渲染组件数量增加(例如长文编辑时),由于全局状态会向所有组件分发事件,性能将受到影响。这是Redux应用的常见问题,Gutenberg通过数据模块异步模式解决了这一难题。 异步模式的核心在于:开发者可自主决定以同步或异步方式刷新/重渲染React组件树的特定部分。 在此语境下,异步渲染意味着当全局状态触发变更时,订阅者(组件)不会立即被同步调用,而是等待浏览器进入空闲状态后再执行React树更新。 基于**编辑特定区块时,该区块的更新极少影响内容其他部分**这一理念,块编辑器画布仅以同步模式渲染当前选中区块,其余所有区块均采用异步渲染。这确保了随着文章内容增长,编辑器仍能保持流畅响应。 ## 性能基准测试任务 我们提供了跨分支/标签/提交进行性能对比的工具。可通过以下方式本地运行:`./bin/plugin/cli.js perf [分支名]`,例如: ``` ./bin/plugin/cli.js perf trunk v8.1.0 v8.0.0 ``` 为获得最精确结果,运行测试时必须确保测试版本与环境(主题等)完全一致,各分支间唯一差异应为Gutenberg插件版本(或用于构建插件的分支)。 为实现该目标,指令会先创建以下目录结构: │ ├── tests/packages/e2e-tests/specs/performance/* │ 待运行的实际性能测试 │ ├── tests/test/emptytheme │ 测试环境所用主题(站点编辑器) │ │── envs/branch1/.wp-env.json │ branch1的wp-env配置文件(除插件目录外与其他分支配置相同) │── envs/branch1/plugin │ branch1的Gutenberg插件构建副本(通过git checkout branch1获取) │ └── envs/branchX 所有其他分支均复制perf-envs/branch1的目录结构 完成目录准备后,性能测试指令将循环执行各性能测试套件(文章编辑器与站点编辑器),并执行以下操作: 1. 启动`branch1`对应环境 2. 运行当前套件的性能测试 3. 停止`branch1`对应环境 4. 对其余所有分支重复前三步操作 5. 计算当前套件所有性能指标的中位数值 所有测试套件执行完毕后,将生成汇总报告。 ## 通过CodeVitals追踪性能 每次提交的性能结果将推送至codevitals,可在[Gutenberg数据看板](https://www.codevitals.run/project/gutenberg)查看。通过趋势图可追踪特定指标随时间的变化情况。 因此确保所计算指标的稳定性至关重要。这意味着在代码与环境相同的情况下,重复运行测试应获得相近结果。 由于性能任务运行于GitHub CI环境,我们不能完全相信两次相似任务运行获得的数值一致性。例如GitHub CI可能随时间推移分配不同的CPU与内存资源。为缓解此问题,每次在trunk分支运行性能任务时,我们会将当前提交的性能与固定的参考提交哈希进行对比,这样无论环境如何变化,都能持续追踪当前提交与参考提交间的相对差异。 ### 更新参考提交 Gutenberg仅支持两个WP版本,这对性能任务产生两方面影响: - 当Gutenberg支持的最低版本变更时,用于运行性能任务的基础WP版本需同步更新。为此,我们依赖插件`readme.txt`文件中的`Tested up to`标识。每次该标识变更时,性能任务所用版本也会相应调整。 - 更新性能任务使用的WP版本意味着,用于保证性能测试稳定性的参考提交很可能与当前WP版本不兼容。因此每次`readme.txt`中的`Tested up to`标识更新时,必须同步更新`.github/workflows/performance.yml`中使用的参考提交。 新选的参考提交哈希需满足以下要求: - 与`Tested up to`标识使用的新WP版本兼容 - 已在codevitals.run平台追踪所有现有指标 当发布涉及最低WordPress版本要求变更的插件更新时,需更新Core SVN中失去支持分支的端到端测试GitHub Action工作流,否则该分支在发布后的首次工作流运行将会失败。 可通过在测试矩阵中添加`gutenberg-version`输入来固定工作流中使用的插件版本。[Core-59221](https://core.trac.wordpress.org/changeset/59221)展示了6.4分支的此类变更示例。 **注意:** 请始终使用包含错误修复的最终发行版(例如`x.y.2`或`x.y.3`)。若最终发行版尚未确定,请创建[Trac工单](https://core.trac.wordpress.org/ticket/62488)以免遗忘。 **选择提交的简易方法是选取trunk分支上最近一次通过性能测试的提交。** ## 拓展阅读 - [高性能编辑器的演进之路](https://riad.blog/2020/02/14/a-journey-towards-a-performant-web-editor/)