어떻게 angular 모듈을 지연 로드하고 라우팅 없이 모듈에 선언된 구성 요소를 동적으로 생성할 수 있나요? 다음 글에서는 그 방법을 소개하겠습니다. 도움이 되셨으면 좋겠습니다!
환경: Angular 13.x.x
Angular는 첫 번째 화면의 크기를 줄이고 첫 번째 화면의 로딩 속도를 향상시키기 위해 라우팅을 통해 특정 페이지 모듈의 지연 로딩을 지원합니다. 그러나 이러한 라우팅 방식은 때때로 수요를 충족시킬 수 없습니다. [관련 튜토리얼 추천: "angularjs 비디오 튜토리얼"]
예를 들어, 버튼을 클릭하면 일련의 툴바 구성요소가 main.js가 기본적으로 적용되지만 사용자가 버튼을 클릭하면 구성 요소가 동적으로 로드되어 표시됩니다. <code>main.js
, 而是用户点按钮后动态把组件加载并显示出来.
那为什么要动态加载呢? 如果直接在目标页面组件引入工具栏组件, 那么工具栏组件中的代码就会被打包进目标页面组件所在的模块, 这会导致目标页面组件所在的模块生成的js体积变大; 通过动态懒加载的方式, 可以让工具栏组件只在用户点了按钮后再加载, 这样就可以达到减少首屏尺寸的目的.
为了演示, 新建一个angular项目, 然后再新建一个ToolbarModule
, 项目的目录结构如图
为了达到演示的目的, 我在ToolbarModule
的html模板中放了个将近1m的base64图片, 然后直接在AppModule
中引用ToolbarModule
, 然后执行ng build
, 执行结果如图
可以看到打包尺寸到达了1.42mb
, 也就是说用户每次刷新这个页面, 不管用户有没有点击显示工具栏按钮, 工具栏组件相关的内容都会被加载出来, 这造成了资源的浪费, 所以下面将ToolbarModule
从AppModule
的imports
声明中移除, 然后在用户点击首次点击显示时懒加载工具栏组件.
懒加载工具栏组件
首先, 新建一个ToolbarModule
和ToolbarComponent
, 并在ToolbarModule
声明ToolbarComponent
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; } 모듈을 느리게 로드하고 Angular에서 해당 구성 요소를 동적으로 표시하는 방법에 대해 이야기해 보겠습니다. { width: 64px; height: 64px; object-fit: cover; } `, ], }) export class ToolbarComponent implements OnInit { constructor() {} ngOnInit(): void {} }
toolbar.component.html
<p> <svg><path></path><path></path><path></path></svg> <svg> <path></path> <path></path> <path></path> <path></path> <path></path> </svg> " 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></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
打包的尺寸大小
可以看到首屏尺寸没有开头那么离谱了, 原因是没有在AppModule
和AppComponent
直接导入ToolbarModule
和ToolbarComponent
, ToolbarModule
被打进了另外的js文件中(Lazy Chunk Files), 当首次点击显示
按钮时, 就会加载这个包含ToolbarModule
的js文件
注意看下面的gif演示中, 首次点击显示
按钮, 浏览器网络调试工具中会多出一个对src_app_toolbar_toolbar_module_ts.js
시연을 위해 새 각도 프로젝트를 만든 다음 새 ToolbarModule
을 만듭니다. 프로젝트는 그림과 같습니다
시연을 위해 1m에 가까운 base64 이미지를 넣은 후 AppModule
에서 ToolbarModule
을 직접 참조한 후 ng build
를 실행합니다. > 실행 결과는 그림과 같습니다
1.42mb
에 도달한 것을 확인할 수 있습니다. 이는 사용자가 도구 모음 표시 버튼을 클릭했는지 여부에 관계없이 사용자가 이 페이지를 새로 고칠 때마다 이 페이지를 새로 고칠 때마다 의미합니다. , 도구 모음 구성 요소와 관련된 콘텐츠가 로드되어 리소스 낭비가 발생하므로 다음은 AppModule의 <code>imports
선언에서 ToolbarModule
이 제거됩니다. 를 적용한 다음 사용자가 첫 번째 클릭을 클릭하여 표시할 때 도구 모음 구성 요소를 지연 로드합니다.🎜지연 로드 도구 모음 구성 요소
🎜먼저 새 ToolbarModule 및ToolbarComponent
를 선언하고 ToolbarModule
ToolbarComponent🎜🎜🎜toolbar.module.ts
rrreeetoolbar.comComponent.ts
rrreeetoolbar.comComponent.html
rrreeeAppComponent
의 버튼 클릭 이벤트 핸들러에서 도구 모음 모듈을 로드하는 코드를 작성합니다.🎜import
모듈을 통해 를 가져온 다음 <code>createNgModuleRef
를 호출하세요. 현재 구성 요소의 Injector
를 ToolbarModule
Injector의 상위 요소로 전달하여 ToolbarModule
을 인스턴스화하고 moduleRef 객체, 그리고 마지막으로 html 템플릿에 선언된 <ng-container>ViewContainerRef</ng-container>
객체의 createComponent
메소드 ;는 ToolbarComponent
컴포넌트를 생성합니다🎜rrreee🎜 이번에 살펴보겠습니다. 이 작업을 수행한 후 ng build
를 실행하여 패키지합니다. 크기 🎜🎜🎜🎜할 수 있습니다 첫 번째 화면 크기가 처음만큼 크지는 않은지 확인하세요. 그 이유는 ToolbarModule을 가져온 후 <code>AppModule
과 AppComponent
사이에 직접적인 링크가 없기 때문입니다. 및 ToolbarComponent
, ToolbarModule
을 다른 js 파일(Lazy Chunk Files)로 가져옵니다. 를 처음 클릭하면
버튼이 나타납니다. , ToolbarModule
이 포함된 js 파일이 로드됩니다🎜🎜아래 gif 데모를 보시고 처음으로 브라우저 네트워크 디버깅 도구에서 Show
버튼을 클릭하세요. src_app_toolbar_toolbar_module_ts.js
파일을 한 번 더 요청해 주세요🎜🎜🎜🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜위 내용은 모듈을 느리게 로드하고 Angular에서 해당 구성 요소를 동적으로 표시하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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

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

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

Vue中如何实现懒加载和异步组件加载懒加载(或延迟加载)指的是在需要时才加载资源,而不是在页面加载时全部加载。这样可以减少初始加载时间,提高页面性能和用户体验。Vue框架提供了懒加载的功能和对异步组件加载的支持,使得开发者可以轻松实现懒加载和异步组件加载。一、懒加载的实现在Vue中,我们可以使用异步组件和Webpack的代码分割功能来实现懒加载。具体步骤如下


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
