我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Angular中怎么懒加载模块并动态显示它的组件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Angular中怎么懒加载模块并动态显示它的组件

本文小编为大家详细介绍“Angular中怎么懒加载模块并动态显示它的组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Angular中怎么懒加载模块并动态显示它的组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的。

比如, 点击一个按钮后显示一行工具栏, 这个工具栏组件我不希望它默认打包进main.js, 而是用户点按钮后动态把组件加载并显示出来.

那为什么要动态加载呢? 如果直接在目标页面组件引入工具栏组件, 那么工具栏组件中的代码就会被打包进目标页面组件所在的模块, 这会导致目标页面组件所在的模块生成的js体积变大; 通过动态懒加载的方式, 可以让工具栏组件只在用户点了按钮后再加载, 这样就可以达到减少首屏尺寸的目的.

为了演示, 新建一个angular项目, 然后再新建一个ToolbarModule, 项目的目录结构如图

Angular中怎么懒加载模块并动态显示它的组件

为了达到演示的目的, 我在ToolbarModule的html模板中放了个将近1m的base64图片, 然后直接在AppModule中引用ToolbarModule, 然后执行ng build, 执行结果如图

Angular中怎么懒加载模块并动态显示它的组件

可以看到打包尺寸到达了1.42mb, 也就是说用户每次刷新这个页面, 不管用户有没有点击显示工具栏按钮, 工具栏组件相关的内容都会被加载出来, 这造成了资源的浪费, 所以下面将ToolbarModuleAppModuleimports声明中移除, 然后在用户点击首次点击显示时懒加载工具栏组件.

懒加载工具栏组件

首先, 新建一个ToolbarModuleToolbarComponent, 并在ToolbarModule声明ToolbarComponent

Angular中怎么懒加载模块并动态显示它的组件

toolbar.module.ts
import { NgModule } from '@angular/core';import { CommonModule } from '@angular/common';import { ToolbarComponent } from './toolbar.component'; @NgModule({    declarations: [ToolbarComponent],    imports: [CommonModule],    exports: [ToolbarComponent],})class ToolbarModule {} export { ToolbarComponent, ToolbarModule };
toolbar.component.ts
import { Component, OnInit } from '@angular/core';@Component({    selector: 'toolbar',    templateUrl: './toolbar.component.html',    styles: [        `    svg {      width: 64px;      height: 64px;    }    img {      width: 64px;      height: 64px;      object-fit: cover;    }    `,    ],})export class ToolbarComponent implements OnInit {    constructor() {}    ngOnInit(): void {}}
toolbar.component.html
<p class="flex">  <svg t="1652618923451" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2104" width="200" height="200"><path d="M412 618m-348 0a348 348 0 1 0 696 0 348 348 0 1 0-696 0Z" fill="#C9F4EB" p-id="2105"></path><path d="M673.19 393h-333a25 25 0 0 1 0-50h433a25 25 0 0 1 0 50zM600.89 235H423.11C367.91 235 323 190.28 323 135.32v-12.5a25 25 0 0 1 50 0v12.5c0 27.39 22.48 49.68 50.11 49.68h277.78c27.63 0 50.11-22.29 50.11-49.68v-16.5a25 25 0 1 1 50 0v16.5c0 54.96-44.91 99.68-100.11 99.68zM673.19 585.5h-333a25 25 0 0 1 0-50h433a25 25 0 0 1 0 50zM467 778H340a25 25 0 0 1 0-50h227a25 25 0 0 1 0 50z" fill="#087E6A" p-id="2106"></path><path d="M739.76 952H273.62a125.14 125.14 0 0 1-125-125V197a125.14 125.14 0 0 1 125-125h566.14a125.14 125.14 0 0 1 125 125v630a125.14 125.14 0 0 1-125 125zM273.62 122a75.08 75.08 0 0 0-75 75v630a75.08 75.08 0 0 0 75 75h566.14a75.08 75.08 0 0 0 75-75V197a75.08 75.08 0 0 0-75-75z" fill="#087E6A" p-id="2107"></path></svg>  <svg t="1652618941842"       class="icon"       viewBox="0 0 1024 1024"       version="1.1"       xmlns="http://www.w3.org/2000/svg"       p-id="2247"       width="200"       height="200">    <path d="M415 624m-348 0a348 348 0 1 0 696 0 348 348 0 1 0-696 0Z"          fill="#C9F4EB"          p-id="2248"></path>    <path d="M695 790H362a25 25 0 0 1 0-50h433a25 25 0 0 1 0 50zM583 649H362a25 25 0 0 1 0-50h321a25 25 0 0 1 0 50zM262 287H129a25 25 0 0 1 0-50h233a25 25 0 0 1 0 50zM262 455.33H129a25 25 0 1 1 0-50h233a25 25 0 0 1 0 50zM262 623.67H129a25 25 0 0 1 0-50h233a25 25 0 0 1 0 50zM262 792H129a25 25 0 0 1 0-50h233a25 25 0 0 1 0 50z"          fill="#087E6A"          p-id="2249"></path>    <path d="M761.76 964H295.62a125.14 125.14 0 0 1-125-125V209a125.14 125.14 0 0 1 125-125h566.14a125.14 125.14 0 0 1 125 125v630a125.14 125.14 0 0 1-125 125zM295.62 134a75.09 75.09 0 0 0-75 75v630a75.08 75.08 0 0 0 75 75h566.14a75.08 75.08 0 0 0 75-75V209a75.09 75.09 0 0 0-75-75z"          fill="#087E6A"          p-id="2250"></path>    <path d="M617 376H443a25 25 0 0 1 0-50h274a25 25 0 0 1 0 50z"          fill="#087E6A"          p-id="2251"></path>    <path d="M530 463a25 25 0 0 1-25-25V264a25 25 0 0 1 50 0v174a25 25 0 0 1-25 25z"          fill="#087E6A"          p-id="2252"></path>  </svg>  <img class="lazy" data-src="<这里应该是一张大小将近1M的base64图片, 内容较大, 就略去了...>" alt=""></p>

登录后复制

然后再AppComponent的中按钮点击事件处理程序中写加载工具栏模块的代码:

app.component.ts
import { Component, createNgModuleRef, Injector, ViewChild, ViewContainerRef } from '@angular/core';@Component({    selector: 'root',    template: `               <p class="container h-screen flex items-center flex-col w-100 justify-center">                 <p class="mb-3"                      [ngClass]="{ hidden: !isToolbarVisible }">                   <ng-container #toolbar></ng-container>                 </p>                 <p>                   <button (click)="toggleToolbarVisibility()"                           class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">{{ isToolbarVisible ? '隐藏' : '显示' }}</button>                   <p class="mt-3">首屏内容</p>                 </p>               </p>             `,})export class AppComponent {    title = 'ngx-lazy-load-demo';    toolbarLoaded = false;    isToolbarVisible = false;    @ViewChild('toolbar', { read: ViewContainerRef }) toolbarViewRef!: ViewContainerRef;    constructor(private _injector: Injector) {}    toggleToolbarVisibility() {        this.isToolbarVisible = !this.isToolbarVisible;        this.loadToolbarModule().then();    }    private async loadToolbarModule() {        if (this.toolbarLoaded) return;        this.toolbarLoaded = true;        const { ToolbarModule, ToolbarComponent } = await import('./toolbar/toolbar.module');        const moduleRef = createNgModuleRef(ToolbarModule, this._injector);        const { injector } = moduleRef;        const componentRef = this.toolbarViewRef.createComponent(ToolbarComponent, {            injector,            ngModuleRef: moduleRef,        });    }}

关键在于其中的第32-42行, 首先通过一个动态import导入toolbar.module.ts中的模块, 然后调用createNgModuleRef并传入当前组件的Injector作为ToolbarModule的父级Injector, 这样就实例化了ToolbarModule得到了moduleRef对象, 最后就是调用html模板中声明的<ng-container #toolbar></ng-container>ViewContainerRef对象的createComponent方法创建ToolbarComponent组件

private async loadToolbarModule() {    if (this.toolbarLoaded) return;    this.toolbarLoaded = true;    const { ToolbarModule, ToolbarComponent } = await import('./toolbar/toolbar.module');    const moduleRef = createNgModuleRef(ToolbarModule, this._injector);    const { injector } = moduleRef;    const componentRef = this.toolbarViewRef.createComponent(ToolbarComponent, {        injector,        ngModuleRef: moduleRef,    });}

此时再来看下这番操作后执行ng build打包的尺寸大小

Angular中怎么懒加载模块并动态显示它的组件

可以看到首屏尺寸没有开头那么离谱了, 原因是没有在AppModuleAppComponent直接导入ToolbarModuleToolbarComponent, ToolbarModule被打进了另外的js文件中(Lazy Chunk Files), 当首次点击显示按钮时, 就会加载这个包含ToolbarModule的js文件

注意看下面的gif演示中, 首次点击显示按钮, 浏览器网络调试工具中会多出一个对class="lazy" data-src_app_toolbar_toolbar_module_ts.js文件的请求

Angular中怎么懒加载模块并动态显示它的组件

读到这里,这篇“Angular中怎么懒加载模块并动态显示它的组件”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Angular中怎么懒加载模块并动态显示它的组件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Angular中怎么懒加载模块并动态显示它的组件

本文小编为大家详细介绍“Angular中怎么懒加载模块并动态显示它的组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Angular中怎么懒加载模块并动态显示它的组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-04

Angular懒加载动态怎么创建显示该模块下声明的组件

这篇文章主要介绍“Angular懒加载动态怎么创建显示该模块下声明的组件”,在日常操作中,相信很多人在Angular懒加载动态怎么创建显示该模块下声明的组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ang
2023-06-30

权限管理模块中动态加载Vue组件怎么实现

本篇内容介绍了“权限管理模块中动态加载Vue组件怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!登录状态保存当用户登录成功之后,需要将
2023-06-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录