从 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-router-outlet
传入任何正在使用的ion-tabs
中
之前
<ion-tabs>
<ion-tab-bar slot="bottom"> ... </ion-tab-bar>
</ion-tabs>
<script>
import { IonTabs, IonTabBar } from '@ionic/vue';
import { defineComponent } from 'vue';
export default defineComponent({
components: { IonTabs, IonTabBar },
});
</script>
之后
<ion-tabs>
<ion-router-outlet></ion-router-outlet>
<ion-tab-bar slot="bottom"> ... </ion-tab-bar>
</ion-tabs>
<script>
import { IonTabs, IonTabBar, IonRouterOutlet } from '@ionic/vue';
import { defineComponent } from 'vue';
export default defineComponent({
components: { IonTabs, IonTabBar, IonRouterOutlet },
});
</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'),
},
],
},
];
核心
- 更新到 Ionic 6 的最新版本
npm install @ionic/core@6
更新您的代码
日期时间
-
移除所有对
placeholder
、pickerOptions
、pickerFormat
、monthNames
、monthShortNames
、dayNames
和dayShortNames
属性的使用。ion-datetime
现在会根据设备上设置的语言和区域自动格式化组件内部显示的月份名称、日期名称和时间。有关更多信息,请参阅ion-datetime 本地化文档。 -
移除所有对
text
和placeholder
CSS 阴影部分的使用。 -
移除所有对
--padding-bottom
、--padding-end
、--padding-start
、--padding-top
和--placeholder-color
CSS 变量的使用。要自定义ion-datetime
上的填充,您可以使用任何padding
CSS 属性。 -
移除所有对
open
方法的使用。要在覆盖层中呈现日期时间,请将其放置在ion-modal
或ion-popover
组件内。有关更多信息,请参阅ion-datetime 使用示例。 -
移除所有对
displayFormat
或displayTimezone
属性的使用。要解析ionChange
事件有效负载中提供的 UTC 字符串,我们建议您使用date-fns。有关示例,请参阅ion-datetime 解析日期文档。
有关更多迁移示例,请参阅日期时间迁移示例应用程序。
图标
Ionic 6 现在附带 Ionicons 6。查看Ionicons 6 重大变更指南并进行任何必要的更改。
输入
确保 null
未作为 placeholder
属性的值传入。我们建议使用 undefined
代替。
模态框
ion-modal
现在使用 Shadow DOM。更新任何针对 ion-modal
内部元素的样式以使用ion-modal CSS 变量或ion-modal CSS 阴影部分
之前
ion-modal .modal-wrapper {
/* Any custom styles here */
}
ion-modal ion-backdrop {
/* Any custom styles here */
}
之后
ion-modal::part(content) {
/* Any custom styles here */
}
ion-modal::part(backdrop) {
/* Any custom styles here */
}
弹出框
ion-popover
现在使用 Shadow DOM。更新任何针对 ion-popover
内部元素的样式以使用ion-popover CSS 变量或ion-popover CSS 阴影部分
之前
ion-popover .popover-arrow {
/* Any custom styles here */
}
ion-popover ion-backdrop {
/* Any custom styles here */
}
ion-popover .popover-content {
/* Any custom styles here */
}
之后
ion-popover::part(arrow) {
/* Any custom styles here */
}
ion-popover::part(backdrop) {
/* Any custom styles here */
}
ion-popover::part(content) {
/* Any custom styles here */
}
单选按钮
移除所有对 RadioChangeEventDetail
接口的使用。
选择
确保 null
未作为 placeholder
属性的值传入。我们建议使用 undefined
代替。
文本区域
确保 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 论坛上发布主题。