跳至主要内容
版本:v8

从 Ionic 5 更新到 6

注意

本指南假设您已将应用程序更新到 Ionic 5 的最新版本。请确保您已按照Ionic 5 升级指南在开始本指南之前。

重大变更

有关 Ionic 5 到 Ionic 6 的 **完整重大变更列表**,请参阅 Ionic Framework 存储库中的重大变更文档

入门

Angular

  1. Ionic 6 支持 Angular 12+。按照Angular 更新指南更新到 Angular 的最新版本。
  2. 更新到 Ionic 6 的最新版本
npm install @ionic/angular@6

如果您使用的是 Ionic Angular Server,请确保也对其进行更新

npm install @ionic/angular@6 @ionic/angular-server@6
  1. 移除所有对 Config.set() 的使用。相反,在 IonicModule.forRoot() 中设置您的配置。有关更多示例,请参阅Angular 配置文档
  2. 移除所有对之前从 @ionic/angular 导出的 setupConfig 函数的使用。改为在 IonicModule.forRoot() 中设置您的配置。

React

  1. Ionic 6 支持 React 17+。更新到 React 的最新版本
npm install react@latest react-dom@latest
  1. 更新到 Ionic 6 的最新版本
npm install @ionic/react@6 @ionic/react-router@6
  1. package.jsonscripts 对象中更新 test 字段以包括 transformIgnorePatterns
"scripts": {
"test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'",
...
}
  1. 在您的 App 组件文件中导入并调用 setupIonicReact。如果您也使用 setupConfig,请将您的配置传递给 setupIonicReact

之前

App.tsx
import { setupConfig } from '@ionic/react';

...

setupConfig({
mode: 'md'
});

之后

App.tsx
import { setupIonicReact } from '@ionic/react';

...

setupIonicReact({
mode: 'md'
});
注意

即使开发人员没有设置自定义配置,也必须导入并调用 setupIonicReact

有关更多示例,请参阅React 配置文档

  1. 将所有控制器导入从 @ionic/core 更新到 @ionic/core/components。例如,以下是 menuController 的迁移

之前

import { menuController } from '@ionic/core';

之后

import { menuController } from '@ionic/core/components';

Vue

  1. Ionic 6 支持 Vue 3.0.6+。更新到 Vue 的最新版本
npm install vue@3 vue-router@4
  1. 对于使用 Vue CLI 的应用程序,请安装 Vue CLI 5
npm install -g @vue/cli@next

然后,升级所有 Vue CLI 插件

vue upgrade --next
  1. 更新到 Ionic 6 的最新版本
npm install @ionic/vue@6 @ionic/vue-router@6
  1. 将以下 transformIgnorePatterns 添加到 jest.config.jspackage.json 中的 jest 字段
jest.config.js
module.exports = {
...
transformIgnorePatterns: ['/node_modules/(?!@ionic/vue|@ionic/vue-router|@ionic/core|@stencil/core|ionicons)']
}
package.json
  {
...
"jest": {
"transformIgnorePatterns": ["/node_modules/(?!@ionic/vue|@ionic/vue-router|@ionic/core|@stencil/core|ionicons)"]
}
}

有关更多信息,请参阅下面的测试部分

  1. 移除所有对之前从 @ionic/vue 导出的 setupConfig 函数的使用。改为在安装 IonicVue 插件时设置您的配置。有关更多示例,请参阅Vue 配置文档

  2. useIonRouterIonRouter 类型重命名为 UseIonRouterResult

  3. useKeyboardIonKeyboardRef 类型重命名为 UseKeyboardResult

  4. 将所有覆盖层事件监听器重命名为使用新格式

之前

<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-sheetion-alertion-loadingion-modalion-pickerion-popoverion-toast

  1. 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>
  1. 标签内的附加路由应作为同级路由而不是子路由重新编写

之前

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'),
},
],
},
];

核心

  1. 更新到 Ionic 6 的最新版本
npm install @ionic/core@6

更新您的代码

日期时间

  1. 移除所有对 placeholderpickerOptionspickerFormatmonthNamesmonthShortNamesdayNamesdayShortNames 属性的使用。ion-datetime 现在会根据设备上设置的语言和区域自动格式化组件内部显示的月份名称、日期名称和时间。有关更多信息,请参阅ion-datetime 本地化文档

  2. 移除所有对 textplaceholder CSS 阴影部分的使用。

  3. 移除所有对 --padding-bottom--padding-end--padding-start--padding-top--placeholder-color CSS 变量的使用。要自定义 ion-datetime 上的填充,您可以使用任何 padding CSS 属性。

  4. 移除所有对 open 方法的使用。要在覆盖层中呈现日期时间,请将其放置在 ion-modalion-popover 组件内。有关更多信息,请参阅ion-datetime 使用示例

  5. 移除所有对 displayFormatdisplayTimezone 属性的使用。要解析 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 一起工作

  1. 在您的 Jest 配置中添加一个transformIgnorePatterns字段,其中包含相关的 Ionic 包。这通常位于jest.config.jspackage.json中的jest字段中。
jest.config.js
module.exports = {
...
transformIgnorePatterns: ['/node_modules/(?!@ionic/core|@stencil/core|ionicons)']
}
package.json
  {
...
"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命令中。

package.json
"scripts": {
"test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'",
...
}

如果您仍然遇到问题,以下是一些尝试方法:

  1. 验证@babel/preset-env是否包含在您的项目范围配置中,而不是您的文件相对配置中。这通常意味着在<project-root>/babel.config.json中定义 Babel 配置。

  2. 如果您在package.json文件中有一个browserslist/test字段,请确保它设置为current node

需要升级帮助?

请务必查看Ionic 6 突破性变更指南。默认属性和 CSS 变量值发生了一些变化,开发人员可能需要了解。此页面上仅列出了需要用户操作的重大更改。

如果您需要升级帮助,请在Ionic 论坛上发布主题。