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并根据我的理解完善,并根据最新的状况对一些内容进行了修改。