首页 > 其他分享 >Vue3 路由优化,使页面初次渲染效率翻倍

Vue3 路由优化,使页面初次渲染效率翻倍

时间:2023-08-08 09:33:26浏览次数:38  
标签:const item addRoute Vue3 routes router 路由 页面

3996 条路由?

addRoute函数用了大约1s才执行完毕。通过观察,发现居然有3996条路由记录。

可是项目并没有这么多的页面啊~

重复路由

let routes: Array<RouteRecordRaw> = [
  {
    path: '/promotion/ticket-list-jegotrip',
    component: () =>
      import(
        /* webpackChunkName: "promotion/ticket-list-jegotrip" */ './pages/ticket-list-jegotrip/index.vue'
      ),
  },
]

const routerFiles = import.meta.globEager('./**/routes.ts')
Object.keys(routerFiles).forEach((key) => {
  routes = [...routes, ...routerFiles[key].default]
  routes.forEach((item) => {
    router.addRoute(item)
  })
})

仔细看,这里的router.addRoute会重复添加路由,由于大部分路由没有填写name,使得addRoute的时候不会自动去重。

修复这个问题倒也简单:

routes.forEach((item) => router.addRoute(item))

const routesFiles = import.meta.globEager('./**/routes.ts')
Object.keys(routesFiles).forEach((key) => {
  const moduleRoutes = routesFiles[key].default || []
  moduleRoutes.forEach((item) => {
    router.addRoute(item)
  })
})

如果真有上千条路由怎么优化呢?

答案还是addRoute。只不过我们不在初始化阶段就添加全部路由,而是在需要的时候添加,就是beforeEach中添加:

const routesFiles = import.meta.globEager('./**/routes.ts')
const allRoutes = Object.keys(routesFiles)
  .map((key) => routesFiles[key].default || [])
  .flat(Infinity)

router.beforeEach((to, from, next) => {
  const { path } = router.resolve(to)

  if (hasAddRoute(path)) return next()

  const matchedRoute = allRoutes.find(i => i.path === path)
  if (!matchedRoute) throw `${path} 不存在`

  router.addRoute(matchedRoute)
  // https://router.vuejs.org/zh/guide/advanced/dynamic-routing.html
  return to.fullPath
})

这里还有一些优化点:

  1. 如何使 hasAddRoute 的效率更高,比如做到时间复杂度为O(1)?
  2. 打开一个页面后,能否预测下一个页面的路由进而提前添加,减少页面跳转时延?
  3. 能否减少路由(allRoutes)生成时间?

等咱们项目真增长到这个程度再说吧,哈哈哈哈~

标签:const,item,addRoute,Vue3,routes,router,路由,页面
From: https://www.cnblogs.com/fayin/p/17613314.html

相关文章

  • vue3 'alex' is defined but never used
    解决方法在package.json中的rules下加入"no-unused-vars":"off"即可......
  • You are using the runtime-only build of Vue where the template compiler is not a
    使用vue-cli搭建的项目,页面自定义带template内容的组件无法渲染,控制台报错,页面不展示组件内容,代码如下:<template><divclass="hello">my-component:<my-component></my-component></div></template><script>importVuefrom"vue"......
  • Vue学习笔记:路由开发 Part 03
    在Part1中提到了router-link。本文档使用一个标签栏来演示其功能在之前的例子中引入一个新的组件TabBartabbar.vue<template><divclass="tabbar"><ul><li><router-linkto="/center"active-class="tabbar-active">Cent......
  • spring cloud gateway 配置动态路由
    在mysql建表存储路由信息DROPTABLEIFEXISTS`route`;CREATETABLE`route`(`id`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNOTNULL,`uri`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNULLDEFAULTNULL,`predicates`......
  • OpenWrt 关闭网口指示灯(适用各种路由器)
    手头有一个小米路由器4A(百兆版),网上能搜索到的方法只能关闭路由器的电源指示灯(左边),不能关闭网口指示灯(右边)。有说“黑色胶布贴住灯”的,也有说“带眼罩”的。经过多方查找,找到了关闭网口指示灯的方法。适用于各种路由器。注:需要openwrt系统打开路由器SSH在系统——管理权中新......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台隐藏平台web页面不被访问的操作步骤
    LntonGBS国标视频云服务通过支持国标GB28181协议,实现了设备接入、实时监控直播、录像、语音对讲、云存储、告警、级联等功能。同时,它还支持将接入的视频流以多种格式(包括RTSP、RTMP、FLV、HLS、WebRTC)进行全终端、全平台分发,实现了无插件播放在Web浏览器、手机浏览器、微信端、PC客......
  • Django-4.2博客开发教程:数据库操作-页面动态展示数据库中的数据(十)
    1、数据准备工作首先增加2篇文章用于展示数据。 我用的mysql数据库,使用pycharm的DBBrowser进行数据查询。双击blog库下面对应的文章表,则显示当前数据。 2、查询数据并动态展示models.py里的类就是一个模板,在views.py引入并实例化。即将值查询出来并赋值到一个对象,在页......
  • 页面加载事件
        ......
  • 页面静态化的方法 伪静态
    1.页面静态化--在静态页面还是会有一部分内容会发送变动,可以使用ajax动态加载这些需要变动的数据----1.真静态   ----1)使用ob缓存获取页面输出的内容,进行静态页面生成         缓存区:ob缓存区=》程序缓存区=》浏览器缓存区         ob_start()  开启......
  • 视频融合平台视频汇聚平台LiteCVR页面tab切换细节优化教程分享
    LiteCVR视频融合平台采用云边端协同架构,为网络摄像头、网络存储设备、智能终端、无人机、车载设备、移动执法仪、视频监控平台等提供了一体化的视频接入、分发、存储和处理能力。该平台支持海量视频的轻量化接入与汇聚管理,并利用大数据分析进行决策和判断。经过测试我们发现,在LiteC......