Ionic3新特性--頁面懶加載1


Ionic3新的懶加載機制給我帶來了如下新特性:

  1. 避免在每一個使用到某PageModule或其他Page中重復的import這個類(需要寫一堆路徑)
  2. 允許我們通過字符串key在任何想使用的地方獲取某一Page;
  3. 通過以上兩點讓我們的代碼更簡潔;
  4. 懶加載,客戶響應度更好,體驗更友好的加載,更快的響應。這個是我認為的帶來的最好的特性;
  5. 讓開發過程實時編譯更快。

下面我們對比的看看老的方式和新的懶加載方式的實現。

環境描述:
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也需要進行導航Pageimport

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裝飾器。
並且在同一個文件夾內,我們可以看到還自動生成了一個新的名為OptionsPageModuleModule
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所需要做的所有事情,剩下的就是直接使用了,我們簡單總結一下:

  1. 創建一個Component,並且通過@IonicPage()裝飾器進行裝飾;
  2. 創建一個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作為標簽使用),還是要采用老的加載機制。但是官方依然推薦我們對ComponentPipe等進行模塊化處理,后續會繼續說明這一點。

本文翻譯自Ionic 3 New Pages Lazy Loading並根據個人理解完善,並根據最新的情況對一些內容進行了修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM