Skip to main content
Version: v8

Updating to Ionic 4

Updating from Ionic 3 to 4

note

This guide assumes that you have already updated your app to the latest version of Ionic 3. If you are using Ionic 1 or 2, Make sure to follow the Updating from Ionic 1 to 4 Guide instead.

破壊的変更

Ionic 3 から Ionic 4 への破壊的変更の完全なリストについては、Ionic Framework リポジトリの破壊的変更ドキュメントを参照してください。

We suggest the following general process when migrating an existing application from Ionic 3 to 4:

  1. blankスターターを使用して新しいプロジェクトを生成します(アプリの開始を参照)。
  2. src/providersからsrc/app/servicesへ Angular サービスをコピーします。
    • サービスには、@Injectable()デコレーター内で{ providedIn: 'root' }を含める必要があります。詳細は Angular プロバイダーのドキュメントを参照してください。
  3. アプリのその他のルートレベルのアイテム(パイプ、コンポーネントなど)をコピーします。ディレクトリ構造がsrc/componentsからsrc/app/componentsに変更されることに注意してください。
  4. グローバル Sass スタイルをsrc/app/app.scssからsrc/global.scssへコピーします。
  5. 残りのアプリケーションをページ単位または機能単位でコピーします。以下の点に注意してください:
    • エミュレートされたシャドウ DOM はデフォルトで有効になっています
    • ページ/コンポーネントの Sass はページ/コンポーネントタグでラップせず、Angular のstyleUrlsオプションを@Componentデコレーターで使用する必要があります
    • RxJS は v5 から v6 に更新されています(RxJS の変更を参照)
    • 特定のライフサイクルフックは Angular のフックに置き換える必要があります(ライフサイクルイベントを参照)
    • マークアップの変更が必要な場合があります(移行ツール利用可能、マークアップ変更を参照)

In many cases, using the Ionic CLI to generate a new object and then copying the code also works very well. For example: ionic g service weather will create a shell Weather service and test. The code can then be copied from the older project with minor modifications as needed. This helps to ensure the proper structure is followed. This also generates shells for unit tests.

Changes in Package Name

In Ionic 4, the package name is @ionic/angular. Uninstall Ionic 3 and install Ionic 4 using the new package name:

$ npm uninstall ionic-angular
$ npm install @ionic/angular@v4-lts

While migrating an app, update the imports from ionic-angular to @ionic/angular.

Project structure

One of the major changes between an Ionic 3 app and an Ionic 4 app is the overall project layout and structure. In v3, Ionic apps had a custom convention for how an app should be set up and what that folder structure should look like. In v4, this has been changed to follow the recommended setup of each supported framework.

For example, if an app is using Angular, that project structure will be exactly what an Angular CLI app would be. This change, while not too difficult to accommodate, helps to keep common patterns and documentation consistent.

src/
├── app/
│   ├── about/
│   ├── home/
│   ├── app-routing.module.ts
│   ├── app.component.html
│   ├── app.component.spec.ts
│   ├── app.component.ts
│   └── app.module.ts
├── assets/
├── environments/
├── theme/
├── global.scss
├── index.html
├── karma.conf.js
├── main.ts
├── polyfills.ts
├── test.ts
├── tsconfig.app.json
└── tsconfig.spec.json
.gitignore
angular.json
ionic.config.json
package.json
tsconfig.json
tslint.json

The above comparison is an example of a v4 app's project structure. For developers with experience in a vanilla Angular project, this should feel really familiar.

There is a src/ directory that acts as the home for the app. This includes the index.html, any assets, environment configuration, and any app-specific config files.

While migrating an app to take advantage of this new layout, it is suggested that a new project "base" is made with the CLI. Then, with the new project layout, migrate the features of the app piece by piece. Pages/components/etc. should be moved into the src/app/ folder.

Ensure your Ionic configuration file has the appropriate type. The project type for v3 is ionic-angular. The project type for v4 is angular. If this value is incorrect, the CLI may invoke the incorrect build scripts.

See the following ionic.config.json as an example:

{
"name": "my-app",
"type": "angular"
}

RxJS Changes

V3 から V4 の間で、RxJS はバージョン 6 に更新されました。これにより、オペレーターおよびコア RxJS 関数の多くのインポートパスが変更されます。詳細はRxJS 移行ガイドを参照してください。

Lifecycle Events

With V4, we're now able to utilize the typical events provided by Angular. But for certain cases, you might want to have access to the events fired when a component has finished animating during its route change. In this case, the ionViewWillEnter, ionViewDidEnter, ionViewWillLeave, and ionViewDidLeave have been ported over from V3. Use these events to coordinate actions with Ionic's own animations system.

Older events like ionViewDidLoad, ionViewCanLeave, and ionViewCanEnter have been removed, and the proper Angular alternatives should be used.

For more details, check out the router-outlet docs

Overlay Components

In prior versions of Ionic, overlay components such as Loading, Toast, or Alert were created synchronously. In Ionic v4, these components are all created asynchronously. As a result of this, the API is now promise-based.

// v3
showAlert() {
const alert = this.alertCtrl.create({
message: "Hello There",
subHeader: "I'm a subheader"
});

alert.present();
}

In v4, promises are used:

showAlert() {
this.alertCtrl.create({
message: "Hello There",
subHeader: "I'm a subheader"
}).then(alert => alert.present());
}

// Or using async/await

async showAlert() {
const alert = await this.alertCtrl.create({
message: "Hello There",
subHeader: "I'm a subheader"
});

await alert.present();
}

In V4, navigation received the most changes. Now, instead of using Ionic's own NavController, we integrate with the official Angular Router. This not only provides a consistent routing experience across apps, but is much more dependable. The Angular team has an excellent guide on their docs site that covers the Router in great detail.

To provide the platform-specific animations that users are used to, we have created ion-router-outlet for Angular Apps. This behaves in a similar manner to Angular's router-outlet but provides a stack-based navigation (tabs) and animations.

For a detailed explanation in navigation works in a V4 project, check out the Angular navigation guide.

Lazy Loading

Since Navigation has changed, the mechanism for lazy loading has also changed in V4.

In v3, a typical lazy loading setup worked like this:

// home.page.ts
@IonicPage({
segment: 'home'
})
@Component({ ... })
export class HomePage {}

// home.module.ts
@NgModule({
declarations: [HomePage],
imports: [IonicPageModule.forChild(HomePage)]
})
export class HomePageModule {}

However, in v4, lazy loading is done via the loadChildren method of the Angular router:

// home.module.ts
@NgModule({
imports: [IonicModule, RouterModule.forChild([{ path: '', component: HomePage }])],
declarations: [HomePage],
})
export class HomePageModule {}

// app.module.ts
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
IonicModule.forRoot(),
RouterModule.forRoot([
{ path: 'home', loadChildren: './pages/home/home.module#HomePageModule' },
{ path: '', redirectTo: 'home', pathMatch: 'full' },
]),
],
bootstrap: [AppComponent],
})
export class AppModule {}

For a detailed explanation of lazy loading in V4 project, check out the Angular navigation guide.

Markup Changes

Since v4 moved to Custom Elements, there's been a significant change to the markup for each component. These changes have all been made to follow the Custom Elements spec, and have been documented in a dedicated file on GitHub.

To help with these markup changes, we've released a TSLint-based Migration Tool, which detects issues and can even fix some of them automatically.

Updating from Ionic 1 to 4

Ionic 1 to Ionic 4: What’s Involved?

Migrating from Ionic 1 to Ionic 4 involves moving from AngularJS (aka Angular 1) to Angular 7+. There are many architectural differences between these versions, so some of the app code will have to be rewritten. The amount of work involved depends on the complexity and size of your app.

One upside is that for the most part, the Ionic UI components you know and love from V1 haven’t changed much.

Here are some considerations to review before beginning the upgrade:

  • App complexity: Naturally, the larger and more complex the app is, the longer it will take to migrate.
  • Framework support: In 2019, Ionic will release full support for React. You can also use Ionic Framework components without a framework. Since these are not production-ready yet, we recommend sticking with Angular or waiting until the other framework support is available.
  • Budget and team makeup: The length of a migration project will vary based on the size of your team, the complexity of the app, and the amount of time allotted to make the transition.

Suggested Strategy

Once your development team has identified a good time frame for beginning the migration, Ionic recommends feature-freezing the Ionic 1 application and getting the code in order: Fix any major bugs, eliminate tech debt, and reorganize as you see fit. Then, identify which features to migrate over and which to abandon.

Once the Ionic 1 app is stable, create a new Ionic 4 project. The majority of the dev team’s attention should be given to the new project; only bugs should be fixed in the Ionic 1 app to ensure that the transition happens as quickly and smoothly as possible.

Once the team is comfortable that the Ionic 4 app has become stable and has fulfilled a core set of features, you can then shut down the Ionic 1 app.

Moving From AngularJS to Angular

Please reference official Angular upgrade guide information.

Ionic Changes

上記の Ionic 3 から Ionic 4 への移行セクションは、参考になる場合があります。ブランクスターターを使用して新しい Ionic 4 プロジェクトを生成してください(アプリの開始を参照)。Ionic 4 のコンポーネントに慣れるための時間を費やしてください。楽しい開発を!

Need Assistance?

If your team would like assistance with the migration, please reach out to us! Ionic offers Advisory Services, which includes Ionic 4 training, architecture reviews, and migration assistance.