游乐游手机版
首页/前端开发/文章详情

Angular懒加载路由实现方法详解

时间:2026-06-17 06:47
简介 延迟加载(Lazy Loading)是一种按需加载模块的策略,即仅在用户实际访问时加载所需模块。该策略能够显著提升 Angular 应用的性能,并有效减小初始打包体积——在大型项目中,优化效果尤为突出。 默认情况下,Angular 采用“急切加载”(Eager Loading)模式,即在应用启

简介

延迟加载(Lazy Loading)是一种按需加载模块的策略,即仅在用户实际访问时加载所需模块。该策略能够显著提升 Angular 应用的性能,并有效减小初始打包体积——在大型项目中,优化效果尤为突出。

在 Angular 中使用懒加载路由的方法

默认情况下,Angular 采用“急切加载”(Eager Loading)模式,即在应用启动前加载所有模块。对于小型项目这或许足够,但随着模块数量增加,加载时间会迅速成为性能瓶颈。事实上,许多开发者容易忽略这一关键优化点。

接下来,我们将逐步介绍如何在 Angular 应用中配置并实现懒加载路由(Lazy Loading Routes)。

先决条件

要完成本教程,你需要具备以下条件:

  • 在本地环境中安装 Node.js(具体安装步骤可参考《如何安装 Node.js 并创建本地开发环境》)。
  • 具备基本的 Angular 项目搭建知识。

本教程已在 Node v16.4.0、npm v7.19.0、@angular/core v12.1.0 和 @angular/router v12.1.0 环境下完成测试验证。

步骤 1 – 设置项目

懒加载的路由不能定义在根应用模块中,而应放置在独立的功能模块内,这是实现懒加载的基本设计原则。

首先,使用 Angular CLI 创建一个带路由的新项目:

ng new angular-lazy-loading-example --routing --style=css --skip-tests

接着,进入项目目录:

cd angular-lazy-loading-example

下一步,生成一个新的功能模块:

ng generate module shop --route shop --module app.module

在 shop 功能模块中,我们需要创建以下三个组件:

第一个是购物车组件(Cart):

ng generate component shop/cart

第二个是结算组件(Checkout):

ng generate component shop/checkout

第三个是确认组件(Confirm):

ng generate component shop/confirm

这三个组件都将位于 shop 目录下。至此,项目已准备好一个包含 3 个组件的 shop 功能模块。

步骤 2 – 使用 loadChildren

在主路由配置中,核心代码如下所示:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  { path: 'shop', loadChildren: () => import('./shop/shop.module').then(m => m.ShopModule) },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

自 Angular 8 起,loadChildren 接受一个函数,该函数利用动态导入(Dynamic Import)语法加载模块,仅在用户实际访问对应路由时才会发起请求。动态导入基于 Promise 机制,成功加载模块后即可调用其类。

步骤 3 – 在功能模块中设置路由配置

接下来,最后一步:配置功能模块自身的路由。

参考以下示例:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CartComponent } from './cart/cart.component';
import { CheckoutComponent } from './checkout/checkout.component';
import { ConfirmComponent } from './confirm/confirm.component';

const routes: Routes = [
  { path: '', component: CartComponent },
  { path: 'checkout', component: CheckoutComponent },
  { path: 'confirm', component: ConfirmComponent },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class ShopRoutingModule { }

最后,在功能模块中引入路由时,必须使用 RouterModule.forChild 方法,而非 forRoot

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ShopRoutingModule } from './shop-routing.module';
import { ShopComponent } from './shop.component';
import { CartComponent } from './cart/cart.component';
import { CheckoutComponent } from './checkout/checkout.component';
import { ConfirmComponent } from './confirm/confirm.component';

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

现在,你可以使用 routerLink 指令导航到 /shop/shop/checkout/shop/confirm 等路径。请注意,模块只会在首次访问这些路径时按需加载。

在终端中启动开发服务器:

ng serve

你会看到生成的打包文件,包括一个 main.js 和一个独立的懒加载文件 src_app_shop_shop_module_ts.js

初始块文件            | 名称         |      大小
vendor.js            | vendor       |   2.38 MB
polyfills.js         | polyfills    | 128.58 kB
main.js              | main         |  57.18 kB
runtime.js           | runtime      |  12.55 kB
styles.css           | styles       | 119 字节
                      | 初始总计     |   2.58 MB
延迟块文件           | 名称         |      大小
src_app_shop_shop_module_ts.js | -             |  10.62 kB

在浏览器中访问 localhost:4200,打开 DevTools 的网络面板进行验证:初始加载时不会出现懒加载块;当你导航到 /shop 时,src_app_shop_shop_module_ts.js 就会出现在网络请求中。恭喜,你的应用现已支持懒加载功能。

结论

本文完整介绍了在 Angular 应用中配置懒加载路由的整个流程,涵盖项目搭建、模块拆分以及动态加载实现,每个步骤都清晰明了。

接下来,你可以进一步学习如何测试包含依赖的组件、测试服务,以及如何使用模拟(Mock)、存根(Stub)和间谍(Spy)等测试技术。

更详细的官方文档也是很好的学习资源,其中包含许多关于懒加载的进阶指南。

来源:https://www.jb51.net/javascript/315867137.htm
上一篇Angular中Flex布局的使用详解与示例 下一篇Angular ng-container元素操作详解全面实用技巧从基础到进阶
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
HTML双英雄图精准居中与并排对齐实战指南
前端开发 · 2026-07-04

HTML双英雄图精准居中与并排对齐实战指南

本文详解如何使用CSS Flexbox将两个英雄图在页面中水平居中、等高对齐,并保持50px间距,解决justify-content align-items单独作用于子元素无效的问题。 想让两个视觉冲击力十足的英雄图在首页并排居中,是提升首屏吸引力的经典设计。但很多开发者都踩过同一个坑:直接在 `

Flexbox实现div水平垂直居中的方法
前端开发 · 2026-07-04

Flexbox实现div水平垂直居中的方法

使用 Flexbox 实现 div 的水平垂直居中,推荐在父容器上设置 display: flex,并配合 justify-content: center(控制主轴居中)与 align-items: center(控制交叉轴居中),同时确保父容器拥有明确高度,例如 min-height: 100vh

React循环中正确管理多个独立Modal实例的方法
前端开发 · 2026-07-04

React循环中正确管理多个独立Modal实例的方法

在 React 开发中,我们常常会遇到这样的场景:需要在一个列表循环里渲染多个弹窗(Modal)。如果处理不当,点击任何一个按钮,都会导致所有的弹窗同时打开或关闭,这显然不是我们想要的效果。问题的根源在于状态管理:当多个 Modal 实例共享同一份控制其显示隐藏的状态时,它们的行为就被捆绑在了一起。

鼠标滚动切换图片与7秒无操作自动轮播完整教程
前端开发 · 2026-07-04

鼠标滚动切换图片与7秒无操作自动轮播完整教程

本文介绍如何结合鼠标滚轮交互与定时器机制,实现图片在用户滚动时手动切换、7秒无操作后自动轮播的双重功能,并提供可复用、多实例支持的现代化 JavaScript 解决方案。 在网页开发中,图片轮播组件虽然常见,但许多实现方案在用户体验上仍存遗憾。例如,完全依赖用户滚动切换的轮播,当用户停止操作专注查看

输入新城市自动清除旧天气数据实现方法
前端开发 · 2026-07-04

输入新城市自动清除旧天气数据实现方法

本文详解如何借助 JavaScript 在用户切换查询城市时,自动清空先前展示的天气信息,避免新旧数据混杂叠加,从而优化单页应用的交互体验。 在基于 OpenWeather API 打造天气查询工具时,很多开发者都会遇到一个颇为棘手的小问题:用户查完一个城市后,紧接着输入另一个城市名称,页面上新旧天