Ionic3新的懶加載機制給我帶來了如下新特性:
- 避免在每一個使用到某
Page
的Module
或其他Page
中重復的import這個類(需要寫一堆路徑) - 允許我們通過字符串key在任何想使用的地方獲取某一Page;
- 通過以上兩點讓我們的代碼更簡潔;
- 懶加載,客戶響應度更好,體驗更友好的加載,更快的響應。這個是我認為的帶來的最好的特性;
- 讓開發過程實時編譯更快。
下面我們對比的看看老的方式和新的懶加載方式的實現。
環境描述:
Ionic CLI: 3.1.2
1. 老的加載方式實現
首先我們在terminal中通過如下命令創建一個新的Ionic3的應用:
ionic start routy tabs --v2
這里創建了一個Ionic3的app,來看一下app.module.ts
的定義:
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
中,也需要同樣的引入:
import { TabsPage } from '../pages/tabs/tabs';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
rootPage:any = TabsPage;
...
}
這里當需要設置rootPage時,也需要通過import
來引入對應Page
。
同樣的對於navigation
也需要進行導航Page
的import
:
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
。
2. 新的懶加載的方式實現
我們可以看到,基於我當前的最新的Ionic CLI的版本(3.1.2),創建的新工程里面的默認頁面不是基於Lazy Load
的。
然后我們通過命令新創建一個page
試試:
ionic g page options
注意,這個命令要在當前工程根目錄下執行。
創建完成后,我們就在pages
文件夾下擁有了一個新的OptionsPage
:
pages/options/options.ts
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並根據個人理解完善,並根據最新的情況對一些內容進行了修改。