搜索
首页web前端js教程聊聊Angular中懒加载模块并动态显示它的组件
聊聊Angular中懒加载模块并动态显示它的组件Oct 18, 2022 pm 08:46 PM
angularangularjs懒加载

不通过路由的情况下, 怎么懒加载一个angular模块,并动态创建其中声明的组件?下面本篇文章给大家介绍一下方法,希望对大家有所帮助!

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

环境: Angular 13.x.x

angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的。【相关教程推荐:《angularjs视频教程》】

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

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

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

img

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

img

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

懒加载工具栏组件

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

img

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
bb7c8a3c48daf437f95bddfad9adcdd3
  c3e31d1d418ab9f4007d38c5ac2fc5057f91e44147938d6522b1422fb3a442f2e4fcdcbb0d6601bf10cd349e0bd6245eaf498d71e5ba47c26386fa0f7569ac15e4fcdcbb0d6601bf10cd349e0bd6245e2e4cfd7d5488a090b41b02b3972a2426e4fcdcbb0d6601bf10cd349e0bd6245ede28f444098d408d960da4dccff3a948
  52be54e3dccd6b798164cd60badaba3f
    c4c827904d1e82fd2276bbddd50b33b2e4fcdcbb0d6601bf10cd349e0bd6245e
    f4d2997a7a46bf7c3bd131c8f61772a1e4fcdcbb0d6601bf10cd349e0bd6245e
    5a30b4f8470a3e683e0c631f03094fe4e4fcdcbb0d6601bf10cd349e0bd6245e
    7b79ceabc1df51c7770c133fc8068dcfe4fcdcbb0d6601bf10cd349e0bd6245e
    0f9024d0f9f2c41ecdc45637f6db9756e4fcdcbb0d6601bf10cd349e0bd6245e
  de28f444098d408d960da4dccff3a948
  70fb08151376ce251cd154168f95aaf0" alt="">
94b3e26ee717c64999d7867364b1b4a3

然后再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 ? &#39;隐藏&#39; : &#39;显示&#39; }}</button>
                   <p class="mt-3">首屏内容</p>
                 </p>
               </p>
             `,
})
export class AppComponent {
    title = &#39;ngx-lazy-load-demo&#39;;
    toolbarLoaded = false;
    isToolbarVisible = false;
    @ViewChild(&#39;toolbar&#39;, { 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(&#39;./toolbar/toolbar.module&#39;);
        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模板中声明的8457fb9b49dea8e9792cc67459d83c4e633f406ed589335d7b1bcccc83c74ebaViewContainerRef对象的createComponent方法创建ToolbarComponent组件

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

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

img

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

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

img

更多编程相关知识,请访问:编程视频!!

以上是聊聊Angular中懒加载模块并动态显示它的组件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:博客园。如有侵权,请联系admin@php.cn删除
Vue如何实现组件的懒加载和预加载?Vue如何实现组件的懒加载和预加载?Jun 27, 2023 pm 03:24 PM

随着Web应用程序的日益复杂,前端开发人员需要在保证页面加载速度的前提下更好地提供功能和用户体验。这就涉及到Vue组件的懒加载和预加载,它们是优化Vue应用程序性能的重要手段。本文将深入介绍Vue组件的懒加载和预加载的实现方法。一、什么是懒加载懒加载就是当用户需要访问某个组件时才会把该组件的代码加载进来,而不是一开始就把所有组件的代码都加载进来,这样可以减少

Vue3中的lazy函数详解:懒加载组件提高应用性能Vue3中的lazy函数详解:懒加载组件提高应用性能Jun 19, 2023 am 08:39 AM

Vue3是一款流行的JavaScript框架,它具有易学易用、高效稳定的特点,尤其擅长构建单页应用程序(SPA)。Vue3中的lazy函数,作为懒加载组件的利器之一,可以很大程度上提高应用程序的性能。本文将详解Vue3中的lazy函数的使用方法与原理,以及它在实际开发中的应用场景和优点。什么是懒加载?在传统的前后端分离的开发中,前端开发人员往往需要处理大量的

Vue懒加载图片失败问题解决方案Vue懒加载图片失败问题解决方案Jun 29, 2023 pm 10:42 PM

Vue开发中如何解决图片懒加载失败的问题懒加载(LazyLoad)是现代Web开发中常用的优化技术之一,特别在加载大量图片和资源时,可以有效减轻页面的负担,提升用户体验。然而,在使用Vue框架进行开发时,有时候我们可能会遇到图片懒加载失败的问题。本文将介绍一些常见的问题和解决方案,以便开发者能够更好地应对这个问题。图片资源路径错误首先,我们需要确保图片资源

懒加载的方式有哪些懒加载的方式有哪些Nov 13, 2023 pm 03:14 PM

懒加载的方式有图片懒加载、视频懒加载、脚本文件懒加载和数据懒加载等。详细介绍:1、图片懒加载,是一种常见的懒加载实现方式,在页面加载时,只加载可视区域的图片,其他区域的图片则以占位符的形式呈现,当用户滚动页面到图片位置时,才加载真正的图片,图片懒加载可以通过使用现有的JavaScript库或自定义代码实现;2、视频懒加载的实现方式与图片懒加载类似,在页面加载时等等。

Vue3中的lazy函数详解:懒加载组件提高应用性能的应用Vue3中的lazy函数详解:懒加载组件提高应用性能的应用Jun 18, 2023 pm 12:06 PM

Vue3中的lazy函数详解:懒加载组件提高应用性能的应用在Vue3中,使用懒加载组件可以显著提高应用性能。Vue3提供了lazy函数,用于异步加载组件。在本文中,我们将详细了解lazy函数的使用方法,并介绍一些懒加载组件的应用场景。lazy函数是Vue3中的内置功能之一。当使用lazy函数时,Vue3不会在初始渲染时加载该组件,而是在组件被需要时才会进行加

什么是懒加载技术什么是懒加载技术Nov 15, 2023 pm 02:03 PM

懒加载技术是一种提高网页性能和用户体验的优化技术,它允许在需要时才加载页面的一部分或全部资源,以减少初始加载时间和网络流量。这种技术可以应用于各种类型的网页,包括单页面应用、多页面应用和响应式网页等。其实现原理是在页面初次加载时只加载必要的资源,其他资源则在需要时才加载,可以通过异步加载、延迟加载、按需加载等技术实现。懒加载技术可以显著减少初始页面加载时间,提高页面加载速度。

vue懒加载有哪些vue懒加载有哪些Nov 13, 2023 pm 01:51 PM

vue实现懒加载方式有Vue Router懒加载、Vue异步组件、Vue的v-lazy指令。详细介绍:1、Vue Router懒加载:Vue Router允许将组件按需加载,以减少初始加载时间,可以通过Webpack的import语法来实现懒加载;2、Vue异步组件:Vue提供了异步组件的方式来实现懒加载,可以使用Vue.component方法来定义异步组件等等。

Vue技术开发中如何处理图片资源的懒加载和预加载Vue技术开发中如何处理图片资源的懒加载和预加载Oct 09, 2023 am 09:45 AM

Vue技术开发中如何处理图片资源的懒加载和预加载随着网页内容的丰富化,图片已经成为网页中必不可少的一部分。然而,大量的图片资源加载可能会导致网页加载速度变慢,影响用户的体验。为了解决这个问题,我们可以使用图片资源的懒加载和预加载技术来优化用户体验。一、懒加载技术懒加载是指网页中的图片在初次加载时只加载可视区域内的图片,当用户滚动页面到达图片所在区域时再加载图

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),