React 路由器 6.0 迁移
长期以来,Backstage 一直在使用react-router
版本6.0.0-beta.0
我们之所以采用这个不稳定版本,是因为 v6 有一些新功能与 Backstage 非常契合,尤其是相对路由功能。 因为我们很早就采用了这个不稳定版本,所以我们知道在某些时候我们需要向稳定版迁移。react-router
第 6 版,也就是我们现在所处的阶段!
这种迁移是必需的,但可由每个应用程序控制,也就是说,您可以选择何时迁移您的应用程序。 不过,在未来的某个时间点,我们将放弃对测试版的支持。react-router
届时,您将被迫迁移。
React Router v6 稳定版带来了许多改进和错误修复。 值得注意的是,路径的解析方式得到了改进,修复了一个错误,在该错误中,路径如/catalog
和/catalog-import
可能会混淆。
迁移
步骤 1 - 升级至 Backstage 1.6
Backstage 首次发布支持react-router
v6 是1.6
如果您是早起的鸟儿,想在该版本发布前尝试迁移,也可以在1.6.0-next.1
.
第 2 步 - 将 react-router
移到 peerDependencies
中
重要的是,只有一个版本的react-router
的方式类似。react
版本时,所有插件和软件包现在都会声明对 React Router 依赖项的对等依赖,而不是直接依赖。 唯一的例外是应用程序软件包(在packages/app/package.json
),其中的直接依赖关系最终会决定您在项目中使用的 React Router 版本。
您的内部软件包可能会指定依赖于react-router
或react-router-dom
在其package.json
重要的是,要将这些转换为peerDependencies
的版本,这样我们就可以控制react-router
在应用程序中package.json
.
您可以通过运行以下命令自动完成这一步骤:
yarn backstage-cli migrate react-router-deps
有兴趣手动操作的用户,请将以下更改应用到所有package.json
的文件除外。packages/app/package.json
或任何其他应用程序软件包。 跳过移动任何尚不存在的依赖项,同时移动dependencies
和devDependencies
.
dependencies {
...
- "react-router-dom": "^6.0.0-beta.0",
- "react-router": "^6.0.0-beta.0"
},
peerDependencies: {
...
+ "react-router-dom": "6.0.0-beta.0 || ^6.3.0",
+ "react-router": "6.0.0-beta.0 || ^6.3.0"
},
第 3 步 - 确保更新外部插件
重要的是,您还应将外部插件更新到最新版本,因为这些插件必须执行相同的功能peerDependencies
更新。
在迁移过程中,可能有外部插件需要更新。@backstage
请确保在插件的 GitHub 代码库中检查现有问题或提出新问题。
第 4 步 - 在应用程序中调整 React 路由器依赖关系
现在是时候迁移到最新版本的 React Router 了。 在撰写本文的时候,这就是6.3.0
但这当然是一个不断变化的目标。
第一步是修改packages/app/package.json
:
- "react-router": "6.0.0-beta.0",
- "react-router-dom": "6.0.0-beta.0",
+ "react-router": "^6.3.0",
+ "react-router-dom": "^6.3.0",
如果您的项目中恰好有多个应用程序软件包,请对所有这些软件包应用相同的更改。
更改完成后,运行yarn install
然后yarn why react-router
你会在日志中看到下面一行作为唯一的结果条目:
=> Found "[email protected]"
如果您看到多个条目,特别是=> Found "[email protected]"
那么您的依赖项还没有完全迁移到支持 React Router v6 稳定版。 请使用 Yarn 中的信息仔细检查上述步骤。why
命令记录。yarn why react-router-dom
.
如果您最终无法将整个项目干净利落地转移到稳定版本,那么您可以使用 Yarn"resolutions"
在根目录中覆盖package.json
尽量避免使用该选项,因为它可能会在运行时导致隐藏的故障,并验证任何需要覆盖的插件。 更好的选择可能是暂缓迁移,直到插件有时间更新。
第 5 步 - 打破常规更改
对于使用npx @backstage/create-app
如果您创建了内部插件和自定义,请务必查看React 路由器更新日志我们将最重要的重大变更总结如下。
打破常规
参见更新日志下面我们重点介绍几项最重要的变更。
路线路径
Route
组件必须始终包含一个path
或index
托。
<Routes>
{/* Invalid */}
<Route element={<Example />} />
{/* Valid */}
<Route path="/" element={<Example />} />
{/* Valid but discouraged due to incompatibility with react-router beta */}
<Route index element={<Example />} />
</Routes>
每个Routes
元素现在必须与自己的位置相匹配,这意味着以下内容无效:
<Routes>
<Route path="/foo">
<Route path="/bar" /> {/* INVALID, must be "/foo/bar" or "bar" */}
</Route>
</Routes>
路由和路由组件
Routes
和Route
组件都进行了大量的相关修改。Route
元素和 React 片段是一个Routes
这意味着像这样的结构
<Routes>
<MyComponent path="/foo" />
...
</Routes>
需要迁移至此:
<Routes>
<Route path="/foo" element={<MyComponent />} />
...
</Routes>
与Routes
改变,就无法再渲染Route
元素之外的Routes
以前,渲染这样的Route
元素的内容会导致其element
道具,但现在会出错。
PermissionedRoute
允许的路径
由于上述变化,"......PermissionedRoute
组件已不再适用于 React Router v6 稳定版的所有情况。 该组件已被弃用,转而使用新的RequirePermission