从 Ionic 5 升级到 6
本指南假设您已将应用程序更新到 Ionic 5 的最新版本。请确保在开始本指南之前,您已遵循 升级到 Ionic 5 指南。
有关从 Ionic 5 到 Ionic 6 的 完整重大变更列表,请参阅 Ionic Framework 仓库中的 重大变更文档。
开始之前
Angular
- Ionic 6 支持 Angular 12+。请按照 Angular 更新指南 更新到最新版本的 Angular。
- 更新到 Ionic 6 的最新版本:
npm install @ionic/angular@6
如果您正在使用 Ionic Angular Server,请确保也将其更新:
npm install @ionic/angular@6 @ionic/angular-server@6
- 移除所有
Config.set()的使用。改为在IonicModule.forRoot()中设置配置。更多示例请参阅 Angular 配置文档。 - 移除之前从
@ionic/angular导出的setupConfig函数的所有使用。改为在IonicModule.forRoot()中设置配置。
React
- Ionic 6 支持 React 17+。更新到最新版本的 React:
npm install react@latest react-dom@latest
- 更新到 Ionic 6 的最新版本:
npm install @ionic/react@6 @ionic/react-router@6
- 更新
package.json中scripts对象的test字段,包含transformIgnorePatterns:
"scripts": {
"test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'",
...
}
- 在您的
App组件文件中导入并调用setupIonicReact。如果您也使用setupConfig,请将配置传递给setupIonicReact:
升级前
import { setupConfig } from '@ionic/react';
...
setupConfig({
mode: 'md'
});
升级后
import { setupIonicReact } from '@ionic/react';
...
setupIonicReact({
mode: 'md'
});
即使不设置自定义配置,开发者也必须导入并调用 setupIonicReact。
更多示例请参阅 React 配置文档。
- 将所有控制器的导入从
@ionic/core更新 为@ionic/core/components。例如,以下是menuController的迁移示例:
升级前
import { menuController } from '@ionic/core';
升级后
import { menuController } from '@ionic/core/components';
Vue
- Ionic 6 支持 Vue 3.0.6+。更新到最新版本的 Vue:
npm install vue@3 vue-router@4
- 对于使用 Vue CLI 的应用程序,请安装 Vue CLI 5:
npm install -g @vue/cli@next
然后,升级所有 Vue CLI 插件:
vue upgrade --next
- 更新到 Ionic 6 的最新版本:
npm install @ionic/vue@6 @ionic/vue-router@6
- 将以下
transformIgnorePatterns添加到jest.config.js或package.json的jest字段中:
module.exports = {
...
transformIgnorePatterns: ['/node_modules/(?!@ionic/vue|@ionic/vue-router|@ionic/core|@stencil/core|ionicons)']
}
{
...
"jest": {
"transformIgnorePatterns": ["/node_modules/(?!@ionic/vue|@ionic/vue-router|@ionic/core|@stencil/core|ionicons)"]
}
}
更多信息请参阅下面的 测试部分。
-
移除之前从
@ionic/vue导出的setupConfig函数的所有使用。改为在安装IonicVue插件时设置配置。更多示例请参阅 Vue 配置文档。 -
将
useIonRouter的IonRouter类型重命名为UseIonRouterResult。 -
将
useKeyboard的IonKeyboardRef类型重命名为UseKeyboardResult。 -
重命名所有覆盖层事件监听器,使用新格式:
升级前
<ion-modal
:is-open="modalOpenRef"
@onWillPresent="onModalWillPresentHandler"
@onDidPresent="onModalDidPresentHandler"
@onWillDismiss="onModalWillDismissHandler"
@onDidDismiss="onModalDidDismissHandler"
>
...
</ion-modal>
升级后
<ion-modal
:is-open="modalOpenRef"
@willPresent="onModalWillPresentHandler"
@didPresent="onModalDidPresentHandler"
@willDismiss="onModalWillDismissHandler"
@didDismiss="onModalDidDismissHandler"
>
...
</ion-modal>
这适用于 ion-action-sheet, ion-alert, ion-loading, ion-modal, ion-picker, ion-popover 和 ion-toast。
- 向任何正在使用的
ion-tabs传入一个ion-router-outlet:
升级前
<ion-tabs>
<ion-tab-bar slot="bottom"> ... </ion-tab-bar>
</ion-tabs>
<script setup lang="ts">
import { IonTabs, IonTabBar } from '@ionic/vue';
</script>
升级后
<ion-tabs>
<ion-router-outlet></ion-router-outlet>
<ion-tab-bar slot="bottom"> ... </ion-tab-bar>
</ion-tabs>
<script setup lang="ts">
import { IonTabs, IonTabBar, IonRouterOutlet } from '@ionic/vue';
</script>
- 选项卡内的额外路由应重写为同级路由,而不是子路由:
升级前
const routes: Array<RouteRecordRaw> = [
{
path: '/',
redirect: '/tabs/tab1'
},
{
path: '/tabs/',
component: Tabs,
children: [
{
path: '',
redirect: 'tab1'
},
{
path: 'tab1',
component: () => import('@/views/Tab1.vue'),
children: {
{
path: 'view',
component: () => import('@/views/Tab1View.vue')
}
}
},
{
path: 'tab2',
component: () => import('@/views/Tab2.vue')
},
{
path: 'tab3',
component: () => import('@/views/Tab3.vue')
}
]
}
]
升级后
const routes: Array<RouteRecordRaw> = [
{
path: '/',
redirect: '/tabs/tab1',
},
{
path: '/tabs/',
component: Tabs,
children: [
{
path: '',
redirect: 'tab1',
},
{
path: 'tab1',
component: () => import('@/views/Tab1.vue'),
},
{
path: 'tab1/view',
component: () => import('@/views/Tab1View.vue'),
},
{
path: 'tab2',
component: () => import('@/views/Tab2.vue'),
},
{
path: 'tab3',
component: () => import('@/views/Tab3.vue'),
},
],
},
];
Core
- 更新到 Ionic 6 的最新版本:
npm install @ionic/core@6
更新您的代码
Datetime
-
移除所有
placeholder,pickerOptions,pickerFormat,monthNames,monthShortNames,dayNames和dayShortNames属性的使用。ion-datetime现在会根据设备上设置的语言和区域,自动格式化组件内部显示的月份名称、日期名称和时间。更多信息请参阅 ion-datetime 本地化文档。 -
移除所有
text和placeholderCSS Shadow Parts 的使用。 -
移除所有
--padding-bottom,--padding-end,--padding-start,--padding-top和--placeholder-colorCSS 变量的使用。要自定义ion-datetime的内边距,您可以使用任何paddingCSS 属性。 -
移除所有
open方法的使用。要在覆盖层中显示 datetime,请将其放置在ion-modal或ion-popover组件内。更多信息请参阅 ion-datetime 使用示例。 -
移除所有
displayFormat或displayTimezone属性的使用。要解析ionChange事件负载中提供的 UTC 字符串,我们建议使用 date-fns。示例请参阅 ion-datetime 解析日期文档。
更多迁移示例请参阅 Datetime 迁移示例应用程序。
Icon
Ionic 6 现在附带 Ionicons 6。请查看 Ionicons 6 重大变更指南 并进行必要的更改。
Input
确保不要将 null 作为值传递给 placeholder 属性。我们建议改用 undefined。
Modal
ion-modal 现在使用 Shadow DOM。更新所有针对 ion-modal 内部结构的样式,以使用 ion-modal CSS 变量 或 ion-modal CSS Shadow Parts:
升级前
ion-modal .modal-wrapper {
/* 任何自定义样式 */
}
ion-modal ion-backdrop {
/* 任何自定义样式 */
}
升级后
ion-modal::part(content) {
/* 任何自定义样式 */
}
ion-modal::part(backdrop) {
/* 任何自定义样式 */
}
Popover
ion-popover 现在使用 Shadow DOM。更新所有针对 ion-popover 内部结构的样式,以使用 ion-popover CSS 变量 或 ion-popover CSS Shadow Parts:
升级前
ion-popover .popover-arrow {
/* 任何自定义样式 */
}
ion-popover ion-backdrop {
/* 任何自定义样式 */
}
ion-popover .popover-content {
/* 任何自定义样式 */
}
升级后
ion-popover::part(arrow) {
/* 任何自定义样式 */
}
ion-popover::part(backdrop) {
/* 任何自定义样式 */
}
ion-popover::part(content) {
/* 任何自定义样式 */
}
Radio
移除所有 RadioChangeEventDetail 接口的使用。
Select
确保不要将 null 作为值传递给 placeholder 属性。我们建议改用 undefined。
Textarea
确保不要将 null 作为值传递给 placeholder 属性。我们建议改用 undefined。
浏览器支持
Ionic 支持的浏览器列表已更改。请查看 浏览器支持指南,确保您将应用程序部署到受支持的浏览器。
如果您有 browserslist 或 .browserslistrc 文件,请使用以下内容更新它:
Chrome >=60
Firefox >=63
Edge >=79
Safari >=13
iOS >=13
测试
Ionic 6 现在以 ES 模块的形式提供。所有主流浏览器都支持 ES 模块,并带来了开发者体验和代码维护方面的改进。使用 Jest 进行测试的开发者需要更新他们的 Jest 配置,因为截至 Jest 27,Jest 尚未完全支持 ES 模块。
此更新涉及使用 Babel 将 Ionic 的 ES 模块编译为 CommonJS (CJS) 格式,这是一种 Jest 能够理解的格式。一旦 Jest 提供了对 ES 模块的支持,此更改将不再必要。有关 Jest 中 ES 模块支持的更新,请参阅 https://github.com/facebook/jest/issues/9430。
如果您是从头开始创建新的 Ionic 应用程序,我们的入门应用程序中已为您完成了此配置。对于现有的 Ionic 应用程序,请按照以下步骤使 Jest 与 Ionic 6 配合工作:
- 在 Jest 配置中添加一个
transformIgnorePatterns字段,其中包含相关的 Ionic 包。这通常在jest.config.js或package.json的jest字段中找到:
module.exports = {
...
transformIgnorePatterns: ['/node_modules/(?!@ionic/core|@stencil/core|ionicons)']
}
{
...
"jest": {
"transformIgnorePatterns": ["/node_modules/(?!@ionic/core|@stencil/core|ionicons)"]
}
}
如果您正在使 用 Ionic React 或 Ionic Vue,请确保将相应的包添加到 transformIgnorePatterns 数组中。对于 Ionic React,这包括 @ionic/react 和 @ionic/react-router。对于 Ionic Vue,这包括 @ionic/vue 和 @ionic/vue-router。
对于使用 Create React App (CRA) 的开发者,目前无法在 Jest 配置文件中更新 transformIgnorePatterns。这是 CRA 的限制,而非 Ionic 可控。但是,我们可以直接将 transformIgnorePatterns 传递给 react-scripts test 命令:
"scripts": {
"test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'",
...
}
如果您仍然遇到问题,可以尝试以下方法:
-
验证
@babel/preset-env是否包含在您的 项目级配置 中,而不是 文件相对配置 中。这通常意味着在<project-root>/babel.config.json中定义 Babel 配置。 -
如果您的
package.json文件中有browserslist/test字段,请确保它设置为current node。
需要升级帮助?
请务必查看 Ionic 6 重大变更指南。默认属性和 CSS 变量值有几处更改,开发者可能需要了解。本页仅列出了需要用户操作的重大变更。
如果您需要升级帮助,请在 Ionic 论坛 上发帖。