vue-13(延迟加载路由)

news2025/6/4 23:32:29

用于性能优化的延迟加载路由

延迟加载路由是优化 Vue.js 应用程序性能的关键技术,尤其是那些具有大量路由的应用程序。通过仅在实际需要时加载路由组件,您可以显著减少应用程序的初始加载时间,从而获得更好的用户体验。这对于网络连接速度较慢或处理能力有限的设备的用户尤其重要。

了解延迟加载

延迟加载,也称为代码拆分,是一种将应用程序的代码拆分为更小的块并按需加载它们的技术。在 Vue Router 的上下文中,这意味着与特定路由关联的组件仅在用户导航到这些路由时才会加载。

为什么选择延迟加载路由?

  • 减少初始加载时间: 主要优点是初始加载时间更快。浏览器不会预先下载整个应用程序,而是只下载初始视图所需的代码。
  • 改进的性能: 通过减少启动时需要解析和执行的 JavaScript 数量,延迟加载可以提高应用程序的整体性能,尤其是在功能较弱的设备上。
  • 更好的用户体验: 更快的加载应用程序提供更流畅、响应速度更快的用户体验,从而提高用户参与度和满意度。
  • 带宽优化: 用户只需下载他们需要的代码,从而减少带宽消耗,这对于移动用户尤其重要。

Vue Router 中的延迟加载是如何工作的

Vue Router 利用 Webpack 的代码拆分功能(或其他打包器中的类似功能,如 Parcel 或 Rollup)来实现延迟加载。你不是直接导入路由的组件,而是使用返回 promise 的函数。此 promise 在需要时与组件一起 resolve。然后,Webpack 会为该组件创建一个单独的 chunk,该 chunk 在访问路由时异步加载。

在 Vue Router 中实现延迟加载

Vue Router 中惰性加载路由的核心涉及使用动态导入。让我们看看如何实现这一点。

使用动态导入

动态导入是一项 JavaScript 功能,允许您异步加载模块。在 Vue Router 中,你可以在路由配置的 component 选项中使用动态导入。

import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import('../views/Home.vue') // Lazy-loaded
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue') // Lazy-loaded
  },
  {
    path: '/users/:id',
    name: 'User',
    component: () => import('../views/User.vue') // Lazy-loaded with dynamic segments
  }
];

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

export default router;

在此示例中,Home.vueAbout.vueUser.vue 组件仅在用户导航到各自的路由时加载。import() 函数返回一个 Promise,该 Promise 与组件一起解析。Webpack 会自动为这些组件创建单独的 chunk。

命名导入

如果需要从模块导入特定的命名导出,可以使用以下语法:

{
  path: '/admin',
  name: 'Admin',
  component: () => import('../views/Admin.vue').then(module => module.AdminComponent)
}

在这里,我们从 Admin.vue 导入 AdminComponent。当您的组件不是默认导出时,这非常有用。

将组件分组为 Chunks

Webpack 允许您将组件分组到命名的块中。这对于将相关组件逻辑分组在一起非常有用。您可以在动态导入中使用魔术注释来实现这一点:

{
  path: '/dashboard',
  name: 'Dashboard',
  component: () => import(/* webpackChunkName: "dashboard" */ '../views/Dashboard.vue')
},
{
  path: '/settings',
  name: 'Settings',
  component: () => import(/* webpackChunkName: "dashboard" */ '../views/Settings.vue')
}

在这种情况下,Dashboard.vueSettings.vue 都将包含在一个名为 “dashboard” 的 chunk 中。如果用户经常在这两个路由之间导航,这可能是有益的,因为它避免了为每个路由下载单独的块。

处理加载和错误状态

当路由是延迟加载的时,下载组件时可能会有延迟。最好在此期间显示加载指示器。你可以使用 Vue 中的异步组件来实现这一点。

<template>
  <component :is="AsyncComponent" />
</template>

<script>
import { defineAsyncComponent } from 'vue';

export default {
  components: {
    AsyncComponent: defineAsyncComponent({
      loader: () => import('../components/MyComponent.vue'),
      loadingComponent: {
        template: '<div>Loading...</div>'
      },
      errorComponent: {
        template: '<div>Failed to load component</div>'
      },
      delay: 200, // Display loading component after 200ms
      timeout: 3000 //  Abort loading after 3000ms and display the error component
    })
  }
};
</script>

在这里,defineAsyncComponent 允许你定义一个异步加载的组件。您可以指定在组件加载时显示 loadingComponent ,并在组件加载失败时显示 errorComponentdelay 选项允许您避免在非常快速的加载时加载组件闪烁,而 timeout 选项允许您处理组件加载时间过长的情况。

实际示例和演示

让我们创建一个简单的 Vue 应用程序,其中包含三个路由:Home、About 和 Contact。我们将延迟加载 About 和 Contact 组件,以演示延迟加载的好处。

  1. 项目设置:(假设你已经安装了 Vue CLI)

    vue create lazy-loading-example
    cd lazy-loading-example
    vue add router
    
  2. 创建组件:

    src/views 目录下创建 Home.vueAbout.vueContact.vue

    首页 view:

    <template>
      <h1>Home</h1>
    </template>
    

    关于 vue:

    <template>
      <h1>About</h1>
    </template>
    

    联系 vue:

    <template>
      <h1>Contact</h1>
    </template>
    
  3. 配置路由器:

    修改 src/router/index.js 以延迟加载 AboutContact 组件。

    import { createRouter, createWebHistory } from 'vue-router';
    import Home from '../views/Home.vue';
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component: Home
      },
      {
        path: '/about',
        name: 'About',
        component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
      },
      {
        path: '/contact',
        name: 'Contact',
        component: () => import(/* webpackChunkName: "contact" */ '../views/Contact.vue')
      }
    ];
    
    const router = createRouter({
      history: createWebHistory(),
      routes
    });
    
    export default router;
    
  4. 修改 App.vue

    App.vue 添加导航链接。

    <template>
      <nav>
        <router-link to="/">Home</router-link> |
        <router-link to="/about">About</router-link> |
        <router-link to="/contact">Contact</router-link>
      </nav>
      <router-view/>
    </template>
    
  5. 运行应用程序:

    npm run serve
    

    打开浏览器的开发人员工具(“网络”选项卡),并在路由之间导航时观察网络请求。你会注意到 About.vueContact.vue 只有在你导航到它们各自的路由时才会加载。

练习:添加加载指示器

修改上面的示例,以便在加载 AboutContact 组件时显示加载指示器。使用前面描述的 defineAsyncComponent 方法。

  1. 创建 LoadingComponent.vue

    <template>
      <div>Loading...</div>
    </template>
    
  2. 修改 src/router/index.js

    import { createRouter, createWebHistory } from 'vue-router';
    import Home from '../views/Home.vue';
    import { defineAsyncComponent } from 'vue';
    import LoadingComponent from '../components/LoadingComponent.vue';
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component: Home
      },
      {
        path: '/about',
        name: 'About',
        component: defineAsyncComponent({
          loader: () => import(/* webpackChunkName: "about" */ '../views/About.vue'),
          loadingComponent: LoadingComponent,
          delay: 200
        })
      },
      {
        path: '/contact',
        name: 'Contact',
        component: defineAsyncComponent({
          loader: () => import(/* webpackChunkName: "contact" */ '../views/Contact.vue'),
          loadingComponent: LoadingComponent,
          delay: 200
        })
      }
    ];
    
    const router = createRouter({
      history: createWebHistory(),
      routes
    });
    
    export default router;
    

现在,当您导航到 About 或 Contact 路由时,您应该会看到 “Loading…”指示器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress通过简码插入bilibili视频

发布于&#xff1a;Eucalyptus-Blog 一、前言 B站是国内非常受欢迎的视频分享平台&#xff0c;上面不仅内容丰富&#xff0c;而且很多视频制作精良、趣味十足。很多人&#xff0c;比如我&#xff0c;就喜欢将B站的视频通过 iframe 嵌入到自己的网页中&#xff0c;但这段代码又…

ZLG ZCANPro,ECU刷新,bug分享

文章目录 摘要 📋问题的起因bug分享 ✨思考&反思 🤔摘要 📋 ZCANPro想必大家都不陌生,买ZLG的CAN卡,必须要用的上位机软件。在汽车行业中,有ECU软件升级的需求,通常都通过UDS协议实现程序的更新,满足UDS升级的上位机要么自己开发,要么用CANoe或者VFlash,最近…

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…

掌握HttpClient技术:从基础到实战(Apache)

目录 前言 一、Apache HttpClient简介 二、HttpClient基础使用 1. 添加依赖 2. 创建HttpClient实例 3. 发送GET请求 4. 发送POST请求 三、HttpClient高级配置与实战案例 1. 连接池优化 2. 超时与重试配置 3. 文件上传&#xff08;Multipart&#xff09; 总结 前言 …

sql知识梳理(超全,超详细,自用)

目录 通识 查询的基本语法 数据库&#xff08;database&#xff09;操作 表&#xff08;table&#xff09;的操作 表中列的操作 索引操作 表中行的操作 insert into语句 update语句 删除语句 select语句 表与表之间的关系 连接查询 子查询 视图 数据备份与还原 …

[ Qt ] | QPushButton常见用法

目录 绑定键盘快捷键 前面已经说了很多用法了&#xff0c;下面主要说说绑定键盘&#xff0c;设置Icon图片。 绑定键盘快捷键 实现四个按钮&#xff0c;可以使用wsad来控制另一个按钮的上下左右的移动。 #include "widget.h" #include "ui_widget.h"Wid…

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具&#xff0c;可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用&#xff1a;用户界面简洁明了&#xff0c;操作方便&#xff0c;…

【机器学习基础】机器学习入门核心:数学基础与Python科学计算库

机器学习入门核心&#xff1a;数学基础与Python科学计算库 一、核心数学基础回顾1. 函数与导数2. Taylor公式3. 概率论基础4. 统计量5. 重要定理6. 最大似然估计&#xff08;MLE&#xff09;7. 线性代数 二、Python科学计算库精要1. NumPy&#xff1a;数值计算核心2. SciPy&…

上交具身机器人的视觉运动导航!HTSCN:融合空间记忆与语义推理认知的导航策略

作者&#xff1a;Qiming Liu 1 ^{1} 1, Guangzhan Wang 2 ^{2} 2, Zhe Liu 3 , 4 ^{3,4} 3,4 and Hesheng Wang 1 , 3 , 5 , 6 ^{1,3,5,6} 1,3,5,6单位&#xff1a; 1 ^{1} 1上海交通大学自动化系&#xff0c; 2 ^{2} 2上海交通大学软件学院&#xff0c; 3 ^{3} 3上海交通大学教…

【C++并发编程01】初识C++并发编程

1、并发是什么 并发是指两个或更多独立的活动同时发生&#xff0c;现实生活中常见的并发场景如边吃饭边看手机。 1.1、计算机中的并发&#xff1a; 计算机领域的并发是指在单个系统里同时执行多个独立的任务&#xff0c;而非顺序的进行一些活动。 我们在电脑上能够边听音乐边和…

Mysql库的操作和表的操作

Mysql库和表的操作 库的操作1.查看数据库列表2.创建数据库3.使用数据库4.查看当前在那个数据库中5.显示数据库的创建语句6.修改数据库7.删除数据库8.备份和恢复数据库9.查看数据的连接情况(简单来说就是查看有多少人使用你的数据库) 表的操作1.创建表2.查看表结构3.修改表本身(…

LangChain-结合GLM+SQL+函数调用实现数据库查询(三)

针对 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)-CSDN博客 进一步简化 通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。 整个流程如下: 用户提问 → AI 生成 SQ…

抖音商城抓包 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包展示 总结 1.出于安全考虑,本章未…

性能优化 - 案例篇:数据一致性

文章目录 Pre引言1. 分布式缓存概念2. Redis 与 Memcached 区别概览3. Spring Boot 中使用 Redis3.1 引入依赖与常用客户端3.2 RedisTemplate 的基本用法3.3 Spring Cache 注解式缓存 4. 秒杀业务简介及挑战5. Lua 脚本实现原子库存扣减5.1 准备阶段&#xff1a;数据预加载5.2 …

Spring框架学习day6--事务管理

Spring事务管理 Spring事务管理是在AOP的基础上&#xff0c;当我们的方法完全执行成功后&#xff0c;再提交事务&#xff0c;如果方法中有异常&#xff0c;就不提交事务 Spring中的事务管理有两种方式&#xff1a; ​ 1.编程式事务 ​ 需要我们在业务代码中手动提交 ​ 2.声明式…

免费酒店管理系统+餐饮系统+小程序点餐——仙盟创梦IDE

酒店系统主屏幕 房间管理 酒店管理系统的房间管理&#xff0c;可实现对酒店所有房间的实时掌控。它能清晰显示房间状态&#xff0c;如已预订、已入住、空闲等&#xff0c;便于高效安排入住与退房&#xff0c;合理分配资源&#xff0c;提升服务效率&#xff0c;保障酒店运营有条…

Git企业级项目管理实战

目录 1. 准备工作 2. 添加成员 2.1 添加企业成员 2.2 添加项目成员 2.3 添加仓库开发人员 3. 开发场景 - 基于git flow模型的实践 3.1 新需求加入 3.2 修复测试环境 Bug 3.3 修改预发布环境Bug 3.4 修改正式环境 Bug 3.5 紧急修复正式环境 Bug 4. 拓展阅读 4.1 其…

【实例】事业单位学习平台自动化操作

目录 一、创作背景: 二、实现逻辑: 三、代码分析【Deepseek分析】: 1) 主要功能 2)核心组件 2.1 GUI界面 (AutomationApp类) 2.2 浏览器自动化 2.3 平台特定处理 3) 关键技术 4)代码亮点 5)总结 四、运行截图: 五、程序代码: 特别声明:***本代码仅限编程学…

4.8.3 利用SparkSQL统计每日新增用户

在本次实战中&#xff0c;我们的任务是利用Spark SQL统计每日新增用户数。首先&#xff0c;我们准备了用户访问历史数据&#xff0c;并将其上传至HDFS。然后&#xff0c;通过Spark的交互式编程环境&#xff0c;我们读取了用户文件并将其转换为结构化的DataFrame。接着&#xff…

YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)

目录 一、研究背景​ 二. 核心创新点​ ​2.1 避免高MAC操作​ ​2.2 DSDM-LFIM主干网络​ 2.3 P2小目标检测分支​ ​3. 代码复现指南​ 环境配置 关键修改点 ​4. 实验结果对比​ 4.1 VisDrone数据集性能 4.2 边缘设备部署 4.3 检测效果可视化 ​5. 应用场景​ …