在第一节中,咱们介绍了页面的懒加载方式,并进行了初步的分析,这里,咱们将进一步介绍如何配合页面懒加载进行其余组件Component
、Pipe
、Directive
等的模块化,和加载使用。
首先说明一点,除了页面外的这些其余组件,本质上是没有实现懒加载的,只是经过将其进行模块化,在合适的页面加载时,进行加载,从而基于页面的懒加载机制间接实现了懒加载。javascript
一、咱们集成了md2
、ngx-datatable
、ng2-tree
三套控件库;
二、咱们本身写了一些简单的Component
:
java
三、在home.ts
这个page中须要使用到这些本身写的Component
,并且home.ts
这个page是基于Ionic的懒加载机制进行编写加载的。app
Module
在自定义Component
所在的demo
文件夹下新建模块声明文件mycomp.module.ts
:ionic
import { NgModule } from '@angular/core'; import { IonicModule } from 'ionic-angular'; import { TreeModule } from 'ng2-tree'; import { Md2Module } from 'md2'; import { NgxDatatableModule } from '@swimlane/ngx-datatable'; import { MyTree } from './mytree'; import { Collapse } from './collapse'; import { Accordion } from './accordion'; import { MyDataTable } from './mydatatable'; @NgModule({ declarations: [ MyTree, Collapse, Accordion, MyDataTable ], imports: [ IonicModule, TreeModule, Md2Module, NgxDatatableModule ], exports: [ MyTree, Collapse, Accordion, MyDataTable ] }) export class MyCompModule {}
关键点描述:
1)、对于Component
来讲,必须import { IonicModule }
,并在@NgModule
的imports
部分进行声明,其余的Directive
和Pipe
不须要;
2)、由于是独立的模块,因此该模块须要依赖的第三方模块必须引入,并在@NgModule
的imports
部分进行声明,好比ngx-datatable
、md2
、ng2-tree
相关的Module;
3)、一个Component
、Directive
和Pipe
,不能同时在有依赖关系的多个模块中进行declarations
和exports
,这自己就是一种重复引入,会形成冲突。因此这样在最顶级的模块app.module.ts
中就要删掉对这些组件的declarations
和exports
。模块化
Page
中引入先看代码:code
import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { HomePage } from './home'; import { TestTreeComponentModule } from '../../../components/test-tree/test-tree.module' import { MyCompModule } from '../../../pages/demo/mycomp.module' import { Md2Module } from 'md2'; @NgModule({ declarations: [ HomePage ], imports: [ TestTreeComponentModule, IonicPageModule.forChild(HomePage), MyCompModule, Md2Module.forRoot() ], exports: [ HomePage ] }) export class HomePageModule {}
关键点描述:
1)、经过引入MyCompModule,引入了自定义的全部组件;
2)、由于是独立的模块,因此若是想直接使用第三方的组件,好比这里想使用md2
的datepicker
组件,依然须要使用以下两种方式中的一种进行引入:component
import { Md2Module } from 'md2';
,而且在@NgModule
中的imports
中声明。MyCompModule
中,exports
涉及到md2
相关的模块,代码示例以下:mycomp.module.ts
改造以下:... @NgModule({ ... exports: [ ... Md2Module ] }) export class MyCompModule {}
好了,这样就实现了其余组件的模块化,并能够经过页面的懒加载机制,实现组件的懒加载。blog
可是是否使用模块化,在对应的懒加载页面,间接实现组件的懒加载,还须要根据状况肯定。
例如,若是咱们将md2
、ngx-datatable
、ng2-tree
三套控件库经过模块引入的方式,独立引入懒加载页面home.ts
和list.ts
,可是没有在最顶级的模块app.module.ts
中,引入该模块,则会在每一个页面编译的结果中,都独立加载以上三套控件库对应代码,形成每一个页面都很大,以下图所示:ip
虽然这样main.js
小了一点,可是home.ts
对应的0.main.js
和list.ts
对应的1.main.js
都变为了1M多,这样也严重影响了页面的加载速度,如何解决呢?很简单,只须要在最顶级的模块app.module.ts
中,引入跨多个页面使用的模块,Ionic在编译的时候,就会自动判断,若是在父级模块中有了,子级模块就不会再冗余编译进去了,是否是很智能:get
哈哈,因此这里又引入了一个问题,模块的合理划分,将是一个很重要的问题。