Ionic3新的懶加載機制給我帶來了以下新特性:javascript
Page
的Module
或其餘Page
中重複的import這個類(須要寫一堆路徑)下面咱們對比的看看老的方式和新的懶加載方式的實現。html
環境描述:
Ionic CLI: 3.1.2java
首先咱們在terminal中經過以下命令建立一個新的Ionic3的應用:shell
ionic start routy tabs --v2
這裏建立了一個Ionic3的app,來看一下app.module.ts
的定義:app
import { AboutPage } from '../pages/about/about'; import { ContactPage } from '../pages/contact/contact'; import { HomePage } from '../pages/home/home'; import { TabsPage } from '../pages/tabs/tabs'; @NgModule({ declarations: [ MyApp, AboutPage, ContactPage, HomePage, TabsPage ], ... entryComponents: [ MyApp, AboutPage, ContactPage, HomePage, TabsPage ] })
每次咱們建立一個新的Page
,咱們須要在app.moudle.ts
中添加對應的import和聲明。
************
一樣,在Main Component
中,也須要一樣的引入:less
import { TabsPage } from '../pages/tabs/tabs'; @Component({ templateUrl: 'app.html' }) export class MyApp { rootPage:any = TabsPage; ... }
這裏當須要設置rootPage時,也須要經過import
來引入對應Page
。
************
一樣的對於navigation
也須要進行導航Page
的import
:ionic
import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; import { AboutPage } from '../about/about'; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { constructor(public navCtrl: NavController) { } ngOnInit() { this.navCtrl.push(AboutPage); } }
這裏咱們須要在經過NavController
導航前,import AboutPage
。模塊化
咱們能夠看到,基於我當前的最新的Ionic CLI的版本(3.1.2),建立的新工程裏面的默認頁面不是基於Lazy Load
的。
而後咱們經過命令新建立一個page
試試:測試
ionic g page options
注意,這個命令要在當前工程根目錄下執行。
建立完成後,咱們就在pages
文件夾下擁有了一個新的OptionsPage
:
pages/options/options.ts
ui
import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; /** * Generated class for the OptionsPage page. * * See http://ionicframework.com/docs/components/#navigation for more info * on Ionic pages and navigation. */ @IonicPage() @Component({ selector: 'page-options', templateUrl: 'options.html', }) export class OptionsPage { ... }
能夠看到與之前建立的Page
不一樣的是,增長了一個@IonicPage
裝飾器。
而且在同一個文件夾內,咱們能夠看到還自動生成了一個新的名爲OptionsPageModule
的Module
:
pages/options/options.module.ts
import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { OptionsPage } from './options'; @NgModule({ declarations: [ OptionsPage, ], imports: [ IonicPageModule.forChild(OptionsPage), ], exports: [ OptionsPage ] }) export class OptionsPageModule {}
好了,到此爲止,就是咱們引入一個新的Page
所須要作的全部事情,剩下的就是直接使用了,咱們簡單總結一下:
Component
,而且經過@IonicPage()
裝飾器進行裝飾;Module
,在其中引入建立的Page
,而且經過IonicPageModule.forChild(OptionsPage)
在全局中聲明這個Page。pages/home/home.ts
中增長以下代碼:goToOption():void{ this.navCtrl.push('OptionsPage'); }
注意這裏,調用的時候也有改變,咱們只須要傳遞一個字符串,這個字符串默認就是Page
對應的類名。
而後在pages/home/home.html
中增長按鈕,經過點擊來觸發上面的方法:
<button ion-button secondary (click)="goToOption()">懶加載</button>
而後咱們就能夠經過Chrome跟蹤一下是否真正實現了懶加載,在www
目錄下能夠看到下圖:
增長了一個0.main.js
文件,這裏面就是咱們的OptionsPage
聲明。
***********
好了,讓咱們能夠經過將默認的頁面也都改爲這種模式,修改後app.module.ts
變得很是簡潔:
@NgModule({ declarations: [ MyApp ] ... entryComponents: [ MyApp ] ... })
固然別忘了,將相應的路由的位置的類名,修改成對應的字符串名:
app.component.ts
:
export class MyApp { rootPage:any = "Tabs"; ... }
tabs.ts
:
export class Tabs { tab1Root = "Home"; tab2Root = "About"; tab3Root = "Contact"; ... }
做爲Ionic3推出的最重要的特性,經測試,當前基於3.1.2的最新Ionic CLI已經徹底穩定的支持Lazy Loaded Pages
,其在解決項目加載慢的同時,也大大的簡化了咱們代碼量。可是仍是有一些設計上的問題須要解決,固然設計上的事情,沒有銀彈,咱們仍是能夠根據具體狀況具體的處理。
less code, less imports, less paths to remember: The less, the better!
注意:只能是在基於NavController
導航的Page
能夠實現懶加載,若是做爲Component
使用(直接在html中使用selector做爲標籤使用),仍是要採用老的加載機制。可是官方依然推薦咱們對Component
、Pipe
等進行模塊化處理,後續會繼續說明這一點。
本文翻譯自Ionic 3 New Pages Lazy Loading並根據我的理解完善,並根據最新的狀況對一些內容進行了修改。