从历史上看,WordPress 以跨版本保持向后兼容性而闻名。Gutenberg 在其生产环境公共 API 中尽可能遵循这一惯例。在极少数情况下,破坏向后兼容性是不可避免的,在这些情况下:
- 应将影响范围尽可能限制在 API 的一小部分区域。
- 应通过 Dev Notes(开发说明)尽可能清晰地向第三方开发者记录这些变更。
什么属于生产环境公共 API
Gutenberg 代码库由两种不同类型的包组成:
- 生产包(production packages):这些包作为 WordPress 脚本发布(例如:wp-components、wp-editor……)。
- 开发包(development packages):这些包由开发者工具组成,可供第三方开发者用于对其主题和插件进行 linting(静态检查)、测试、格式化和构建(例如:@wordpress/scripts、@wordpress/env……)。通常,这些包作为 npm 依赖项被第三方项目使用。
向后兼容性保证仅适用于生产包,因为更新是通过升级 WordPress 来完成的。
生产包使用 wp 全局变量向第三方开发者提供 API。这些 API 可以是 JavaScript 函数、变量和 React 组件。
如何为 JavaScript 函数保持向后兼容性
- 函数的名称不应更改。
- 函数参数的顺序不应更改。
- 函数返回值的类型不应更改。
- 如果对参数进行修改(新增参数、语义修改),只要确保所有以前的调用仍然可行即可。
如何为 React 组件保持向后兼容性
- 组件的名称不应更改。
- 不应移除组件的 props。
- 现有的 prop 值应继续得到支持。如果组件接受一个函数作为 prop,我们可以更新组件以接受同一 prop 的新类型,但这不应破坏现有用法。
- 允许添加新的 props。
- 只有在确保不破坏之前的上下文契约的情况下,才能添加或移除 React Context 依赖。
如何为一个区块(Block)保持向后兼容性
- 当编辑器加载时,该区块的现有用法不应中断或被标记为无效。
- 应保证现有区块的样式不受影响。
- Markup(标记语言)的变化应限制在最小范围内,但如果某个区块需要改变其保存的 markup,导致以前版本的区块失效,则应添加该区块的废弃版本(deprecated version)。
类名和 DOM 更新
React 组件树内部使用的类名和 DOM 节点不被视为公共 API 的一部分,因此可以进行修改。
对这些内容的修改应谨慎行事,因为这可能会影响第三方代码的样式和行为(尽管它们最初就不应依赖于这些内容)。如果可能,请保留旧的类名/DOM 结构。如果不保留,请记录这些变化并编写一篇 dev note。
弃用(Deprecations)
随着项目的演进,我们会发现现有 API 的缺陷,或者需要进行更新以支持新功能。发生这种情况时,我们尽量保证现有 API 不会中断,并构建新的替代 API。
为了鼓励第三方开发者采用新 API,我们可以使用deprecated 辅助函数,在旧 API 被使用时显示一条消息,解释弃用原因并提出替代方案。
更清晰地标明功能是何时被弃用的。请使用辅助方法的 since 和 plugin 选项。
示例:
deprecated( 'wp.components.ClipboardButton', {
since: '10.3',
plugin: 'Gutenberg',
alternative: 'wp.compose.useCopyToClipboard',
} );
Dev notes(开发说明)
Dev notes 是在 WordPress 发布之前发布在 make/core 网站上的文章,旨在通知第三方开发者关于开发者 API 的重要变更,这些变更可能包括:
- 新的 API。
- 可能影响现有插件和主题的现有 API 变更。(例如:类名变更……)
- 不可避免的向后兼容性破坏,附带理由和迁移流程。
- 重要的弃用操作(即使没有造成破坏),附带理由和迁移流程。
Dev note 工作流程
- 在处理拉取请求(pull request)时,如果发现需要撰写 dev note,请为该 PR 添加 Needs Dev Note 标签。
- 如果可能,请在 PR 中添加评论,解释为何需要这篇 dev note。
- 当即将发布的 WordPress 第一个 beta 版推出后,遍历该版本中包含的已合并 PR 列表,筛选出带有 Needs Dev Note 标签的 PR。
- 针对每一个这样的 PR,撰写一篇 dev note,并与 WordPress 发布负责人协调以发布该 dev note。
- 一旦某 PR 的 dev note 发布完毕,请从该 PR 上移除 Needs Dev Note 标签。