详解使用路由延迟加载 Angular 模块


Posted in Javascript onOctober 12, 2017

Angular 非常模块化,模块化的一个非常有用的特性就是模块作为延迟加载点。延迟加载意味着可以在后台加载一个模块和其包含的所有组件等资源。这样 Angular 就不需要在第一个界面从服务器下载所有的文件,直到您请求它,才下载相应的模块。这对提供性能和减少首屏的初始下载文件尺寸有巨大的帮助。而且它可以很容易设置。

这里将使用一个简单示例来演示这个特性是如何工作的。将应用拆分为多个不同的模块,可以在需要的时候再进行延迟加载。

延迟加载的路由需要在根模块之外定义,所以,你需要将需要延迟加载的功能包含在功能模块中。

我们使用 Angular CLI 来创建一个演示项目:Demo.

ng new demo

然后,进入到 demo 文件夹中。安装必要的 package。

npm i

在安装之后,我们创建一个新的模块 shop。在 angular CLI 中,ng 是命令提示指令,g 表示 generate,用来创建某类新 item。

创建新的名为 shop 的模块就是:

ng g module shop

这会导致在 Angular 项目的 src/app 文件下创建一个新的文件夹,并添加一个名为 shop.module.ts 的模块定义文件。

然后,我们在默认的 app 模块和新创建的 shop 模块中分别创建组件。

ng g c home/home
ng g c shop/cart
ng g c shop/checkout 
ng g c shop/confirm

CLI 会将 home 分配到 app 模块中,将 cart、checkout、confirm 分配到 shop 模块中,比如,

此时的 shop.module.ts 内容如下:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CheckoutComponent } from './checkout/checkout.component';
import { CartComponent } from './cart/cart.component';
import { ConfirmComponent } from './confirm/confirm.component';

@NgModule({
 imports: [
  CommonModule
 ],
 declarations: [CheckoutComponent, CartComponent, ConfirmComponent]
})
export class ShopModule { }

修改根组件

Angular CLI 默认生成的 app.component.ts 组件是应用的主页面,其中包含了一些关于 Angular 的介绍信息,我们将它修改成我们需要的内容。将默认生成的 app.component.html 内容修改为如下内容。

<!--The content below is only a placeholder and can be replaced.-->
<h1>Lazy Load Module</h1>
<a [routerLink]="['/shop']" >Shop Cart</a>
<router-outlet>
</router-outlet>

这里提供了一个占位的 router-outlet,各个组件将显示在这里面。

同时,提供了一个导航链接,可以直接导航到 /shop/cart 组件。

创建路由

根路由

首先创建根路由。

我们在 app 文件夹中,添加一个名为 main.routing.ts 的路由配置文件。内容如下:

import { Routes } from '@angular/router';
// HomeComponent this components will be eager loaded
import { HomeComponent } from './home/home.component';

export const routes: Routes = [
  { path: '', component: HomeComponent, pathMatch: 'full' },
  { path: 'shop', loadChildren: './shop/shop.module#ShopModule' },
  { path: '**', component: HomeComponent }
];

其中,home 组件是正常的提前加载。

需要注意的是一下几点:

1. 我们使用了 loadChildren 来延迟加载一个模块。而不是使用提前加载所使用的 component。
2. 我们使用了一个字符串而不是符号来避免提前加载。
3. 我们不仅定义了模块的路径,还提供了模块的类名。

在 app.module.ts 中启用根路由。主要需要使用 forRoot 来启用根路由。

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { routes } from './main.routing';
import { RouterModule } from '@angular/router';

@NgModule({
 declarations: [
  AppComponent,
  HomeComponent
 ],
 imports: [
  BrowserModule,
  RouterModule.forRoot(routes)
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

模块路由

定义模块路由

对于 shop 模块来说,定义路由就没有什么特别了,我们这里可以定义一个名为 shop.route.ts 的路由定义文件,内容如下所示:

import { Routes } from '@angular/router'; 
import { CartComponent } from './cart/cart.component'; 
import { CheckoutComponent } from './checkout/checkout.component'; 
import { ConfirmComponent } from './confirm/confirm.component'; 
export const routes: Routes = [   
     { path: '', component: CartComponent },   
     { path: 'checkout', component: CheckoutComponent },  
     { path: 'confirm', component: ConfirmComponent } 
];

还需要修改一下模块定义文件 shop.module.ts 文件,以使用这个路由定义。注意我们需要使用 forChild 来启用子路由。

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CheckoutComponent } from './checkout/checkout.component';
import { CartComponent } from './cart/cart.component';
import { ConfirmComponent } from './confirm/confirm.component';

import { routes } from './shop.routing'; 
import { RouterModule } from '@angular/router';

@NgModule({
 imports: [
  CommonModule,
  RouterModule.forChild(routes)
 ],
 declarations: [CheckoutComponent, CartComponent, ConfirmComponent]
})
export class ShopModule { }

已经一切就绪了。

测试延迟加载

现在启动应用。

ng serve

默认会在 4200 端口启动应用,请打开浏览器,访问:http://localhost:4200/

访问首页的网络访问如下,其中并不包含功能模块的内容。

详解使用路由延迟加载 Angular 模块

我们先将网络请求的历史记录清除掉。

然后点击链接,访问 /shop/cart 的时候,网络请求如下,可以看到一个新的脚本文件被加载,这里包含的就是延迟加载的功能模块。

详解使用路由延迟加载 Angular 模块

仅仅功能模块被加载了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery实现图片放大镜效果的思路及代码(自写)
Oct 18 Javascript
js中document.write使用过程中的一点疑问解答
Mar 20 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
node.js中的fs.renameSync方法使用说明
Dec 16 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
Apr 06 Javascript
JavaScript函数的调用以及参数传递
Oct 21 Javascript
jQuery的层级查找方式分析
Jun 16 Javascript
jQuery 选择符详细介绍及整理
Dec 02 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
Jun 05 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
Oct 11 #Javascript
js实现单张图片平移切换效果
Oct 11 #Javascript
jQuery自动或手动图片切换效果
Oct 11 #jQuery
简单实现vue验证码60秒倒计时功能
Oct 11 #Javascript
mui框架移动开发初体验详解
Oct 11 #Javascript
Scala解析Json字符串的实例详解
Oct 11 #Javascript
jQuery使用bind函数实现绑定多个事件的方法
Oct 11 #jQuery
You might like
PHP 安全检测代码片段(分享)
2013/07/05 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
Prototype ObjectRange对象学习
2009/07/19 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python动态加载包的方法小结
2016/04/18 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
旧时光糖果:Old Time Candy
2018/02/05 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
应届生会计求职信
2013/11/11 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
民主生活会汇报材料
2014/12/15 职场文书
礼貌问候语大全
2015/11/10 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL