Vue-路由懒加载与组件懒加载

前言

在构建大型单页应用(SPA)时,JavaScript 包体积(Bundle Size)往往会随着业务增长而膨胀,导致首屏加载缓慢、白屏时间长。懒加载(Lazy Loading) 是解决这一问题的核心方案。其本质是将代码分割成多个小的 chunk,仅在需要时才从服务器下载。

一、 路由懒加载:按需拆分页面

  1. 为什么需要路由懒加载?

如果不使用懒加载,所有路由对应的组件都会被打包进同一个 app.js 中。用户访问首页时,浏览器不得不下载整个应用的逻辑,造成严重的性能浪费。

  1. 实现方式:ES import()

利用动态导入语法,打包工具(如 Vite 或 Webpack)会自动进行 代码分割(Code Splitting)

复制代码
// router/index.ts
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';

// 静态导入:会随着主包一起加载,适合首页
import Home from '@/views/Home.vue';

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // 动态导入:只有访问 /about 路径时,浏览器才会请求该组件对应的 JS 文件
    component: () => import('@/views/About.vue')
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

二、 组件懒加载:细粒度控制

有些组件(如弹窗、复杂的图表、第三方重型库)并不需要在页面初次渲染时立即存在。

  1. Vue 3 的 defineAsyncComponent

在 Vue 3 中,异步组件必须使用 defineAsyncComponent 进行显式声明。

示例

复制代码
 <template>
  <div>
    <h1>主页面</h1>
    <button @click="showChart = true">加载并显示报表</button>
    
    <AsyncChart v-if="showChart" />
  </div>
</template>

<script setup lang="ts">
import { ref, defineAsyncComponent } from 'vue';

const showChart = ref<boolean>(false);

// 显式定义异步组件
const AsyncChart = defineAsyncComponent(() =>
  import('@/components/BigChart.vue')
);

// 高级配置(可选):带加载状态
const AsyncComponentWithConfig = defineAsyncComponent({
  loader: () => import('./components/MyComponent.vue'),
  loadingComponent: LoadingComponent, // 加载过程中显示的组件
  errorComponent: ErrorComponent,     // 加载失败时显示的组件
  delay: 200,                         // 展示加载组件前的延迟时间
  timeout: 3000                       // 超时时间
});
</script>
  1. Vue 2 中直接使用import函数声明异步组件

    export default {
    components: {
    // 定义一个异步组件
    'MyLazyComponent': () => import('./components/MyLazyComponent.vue')
    }
    }


三、 底层原理与分包策略

  1. 打包工具的配合

当你使用 import() 时:

  • Vite/Rollup :会自动将该组件及其依赖提取到一个独立的 .js 文件中。

  • Webpack :会生成一个 chunk,你可以通过"魔法注释"自定义 chunk 的名称:

    const About = () => import(/* webpackChunkName: "about-group" */ './About.vue')


四、 总结

  1. 首屏优化:建议首页(Home)使用静态导入,而其他非核心路径、非首屏展示的弹窗/插件全部使用懒加载。
  2. 用户体验 :使用异步组件时,建议配合 loadingComponent,避免加载过程中组件区域出现突兀的空白 。

原文: https://juejin.cn/post/76016061

相关推荐
2601_958352907 分钟前
双麦 DSP 音频模块实战:一文梳理 A-68 在全行业场景的声学解决方案与落地要点
前端·嵌入式硬件·音视频·语音识别·降噪消回音·音频处理模块
智码看视界24 分钟前
老梁聊全栈:JavaScript 原型链深入探索对象继承的奥秘
前端·javascript·ecmascript
智码看视界25 分钟前
老梁聊全栈系列 JavaScript语言本质:从原型链到异步编程的深度解析
开发语言·javascript·全栈·javascript核心
布朗克16839 分钟前
39 Spring Boot Web实战
前端·spring boot·后端·实战
纽格立科技1 小时前
DRM 发射端链路图(上)
前端·人工智能·车载系统·信息与通信·传媒
一 乐1 小时前
幼儿园管理系统|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·幼儿园管理系统
云水一下1 小时前
Vue.js从零到精通系列(七):高级特性实战——Teleport、异步组件、自定义指令与TypeScript深度结合
前端·vue.js·typescript
qq4356947011 小时前
Vue05
前端·vue.js
qq_422152571 小时前
PDF 解密工具怎么选?2026 年文档密码移除方案与注意事项
java·前端·pdf
YHHLAI1 小时前
前端工程化调用 AI 多模态生图模型:Qwen Image Demo 实战
前端·人工智能