升级到 Strapi 5 的分步指南
页面摘要: 按照分步说明将你的 Strapi v4 应用升级到 Strapi 5,包括数据库与代码备份、运行自动化升级工具、处理手动代码更新,以及使用兼容请求头逐步迁移你的 REST 与 GraphQL API 调用。
Strapi 的最新主版本是 Strapi 5。
本页面将作为分步说明,用于把你的 Strapi v4 应用升级到 Strapi 5。
你的 Strapi v4 应用已在运行最新的 v4 小版本(minor)和补丁(patch)版本。如果没有,请使用 upgrade tool(升级工具)并带上 minor 命令来达到该版本:npx @strapi/upgrade minor。
第 1 步:准备升级
在进入升级过程本身之前,请采取以下预防措施:
- 备份你的数据库:
- 如果你使用的是默认配置的 SQLite(Strapi 提供的默认数据库),你的数据库文件名为
data.db,位于 Strapi 应用根目录下的.tmp/文件夹中。 - 如果你使用其他类型的数据库,请参考其官方文档(参见 PostgreSQL 文档 和 MySQL 文档)。
- 如果你的项目托管在 Strapi Cloud 上,你可以手动 创建备份。
- 如果你使用的是默认配置的 SQLite(Strapi 提供的默认数据库),你的数据库文件名为
- 备份你的代码:
- 如果你的代码使用 git 进行版本管理,请创建一个专用分支来运行迁移。
- 如果你的代码未使用 git 进行版本管理,请为正在运行的 Strapi v4 代码创建一份备份,并存放到安全的位置。
- 确保你正在使用的插件与 Strapi 5 兼容。
为此,请列出你正在使用的插件,然后通过阅读 Marketplace(市场)网站上各自的专属文档,逐一检查它们的兼容性。
第 2 步:运行自动化迁移
Strapi 提供了一个工具来自动化升级到 Strapi 5 的部分工作:即 upgrade tool(升级工具)。
- 运行升级工具。
npx @strapi/upgrade major
该命令将执行 Strapi 5 依赖项的更新与安装,并运行 codemods 来处理随 Strapi 5 带来的一些破坏性变更。
codemods 将处理以下变更:
| Codemod 名称与 GitHub 代码链接 | 说明 |
|---|---|
| comment-out-lifecycle-files | 注释掉生命周期(lifecycles)文件,改用 Document Service Middlewares(文档服务中间件) |
| dependency-remove-strapi-plugin-i18n | 移除 i18n 插件依赖,因为 i18n 现已集成到 Strapi 核心中 |
| dependency-upgrade-react-and-react-dom | 升级 react 与 react-dom 依赖 |
| dependency-upgrade-react-router-dom | 升级 react-router-dom 依赖 |
| dependency-upgrade-styled-components | 升级 styled-components 依赖 |
| deprecate-helper-plugin | 部分处理从 @strapi/helper-plugin 的迁移 |
| entity-service-document-service | 部分处理从 Entity Service API 到新的 Document Service API 的迁移 |
| s3-keys-wrapped-in-credentials | 对于使用 aws-s3 提供方(provider)的用户,将 accessKeyId 和 secretAccessKey 属性包裹进一个 credentials 对象中 |
| sqlite3-to-better-sqlite3 | 将 sqlite 依赖更新为 better-sqlite3 |
| strapi-public-interface | 将 @strapi/strapi 的导入转换为使用新的公共接口(public interface) |
| use-uid-for-config-namespace | 在可能的情况下,将 config 的 get/set/has 所用的字符串点号格式替换为 'plugin' 与 'api' 命名空间的 uid 格式 |
| utils-public-interface | 更新 utils 以使用新的公共接口 |
如果你开发 Strapi 插件,还有其他 codemods 会处理 helper-plugin 弃用(deprecation)的某些方面。请参阅 相关的破坏性变更 了解更多信息。
- 检查升级工具所做的更改,以确认你是否必须手动完成某些代码更新:
查找 codemods 自动添加到你代码中的 __TODO__。其中一些可能是在从 Entity Service API 迁移到 Strapi 5 引入的新 Document Service API 时添加的。
:::info Document Service API 关于 Document Service API 的更多信息,可在 破坏性变更条目说明、专项迁移指南 以及 API 参考 中找到。 :::
第 3 步:检查并处理手动升级
以下主要变更可能会影响你的 Strapi 应用,并要求你执行一些手动操作。
针对每一项,请阅读所指明的破坏性变更条目,并确认在升级工具运行之后是否仍需要手动操作:
- 数据库迁移:
- 配置:
- 管理面板自定义:
👉 最后,请通读 破坏性变更数据库 的其余部分,查看你可能关心的任何边缘情况。
第 4 步:迁移 API 消费侧
Strapi 5 已更新 REST 与 GraphQL 两套 API。
请遵循以下步骤,并借助向后兼容(retro-compatibility)请求头与引导式迁移资源,逐步更新你的代码以适配 Strapi 5。
迁移 REST API 调用
- 在你仍期望返回
attributes的所有位置启用兼容请求头,方法是:在 HTTP 客户端、SDK 以及中间件发出的 REST 调用中添加Strapi-Response-Format: v4(具体示例参见 破坏性变更条目)。 - 在启用请求头期间,审计现有的负载(payload)。捕获有代表性的响应(包括联表加载(populated)的关系、组件和媒体),以便你验证遗留消费方在过渡期间仍能正常工作。
- 通过以下方式更新并测试每个客户端:
- 移除对
data.attributes的访问, - 切换到扁平化的负载,
- 并在 REST API 之前仅返回数字型
id的位置,采用documentId。
- 移除对
- 按端点或消费方禁用兼容请求头:一旦某个给定客户端的测试通过,就从它的请求中移除
Strapi-Response-Format: v4。重复此过程,直到没有任何消费方依赖遗留包装器。
迁移 GraphQL API 调用
- 通过在
graphql插件配置中将v4CompatibilityMode设为true来启用兼容请求头,这样在重构客户端代码期间,客户端可以继续依赖data.attributes。 - 遵循 GraphQL 破坏性变更条目 的每一步。它将引导你用
documentId替换id、采用_connection查询、移除attributes,并最终切换到nodes/pageInfo。 - 通过确认在移除不需要 Relay 语义的客户端所用的
_connection和data后,分页元数据仍然符合预期,来测试 Relay 与非 Relay 查询。 - 禁用
v4CompatibilityMode兼容请求头:在每一个查询(query)与变更(mutation)都能使用扁平化模式正常工作后,将该请求头设为false,这样服务器默认就会发出 Strapi 5 格式。