vue-cli+router实现异步组件配合路由进行性能优化

4875次阅读 189人点赞 作者: WuBin 发布时间: 2023-08-21 16:30:37
扫码到手机查看

配置属性对打包资源进行静态分析

一般优化分为首屏优化与交互优化,而交互优化主要方式就是缩短js动画效果的执行时间,首屏优化就是减少首屏的请求静态资源的体积等。如果是静态路由打包后,会在首屏加载所有的路由组件和页面,会极大的增加app.js的打包体积,而我们平常在首屏时候是不需要加载首屏以外的其他组件的,所以我们应该使用异步按需加载的方式。

首先在vue.config.js文件中,配置如下:

module.exports = {
  css: {},
  devServer: {},
  // 重点:静态打包资源分析
  configureWebpack: (config) => {
    // process.env.npm_config_report 
    // 只有在执行run build的时候为true 这时候就可以使用这个插件来分析js打包资源
    if (process.env.npm_config_report) {
      const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
      config.plugins.push(new BundleAnalyzerPlugin())
    }
  },
  // 生产环境不开SourceMap,一旦开启别人会看到源码
  productionSourceMap: false,
  publicPath: process.env.NODE_ENV === 'production' ? '' : '/'
}

process.env.npm_config_report:只有执行npm run build的时候,会为true。

这时候就可以对打包资源的js进行分析。

然后用浏览器 访问127.0.0.1:8888即可在网页中查看各个静态资源的分析。

将静态同步路由改为异步路由

平常的路由我会这么写(以下为一个项目中静态路由的完整示例):

// 静态引用会在首屏加载时候载入全部组件
import { createRouter, createWebHashHistory } from 'vue-router'
import Recommend from '@/views/recommend'
import Singer from '@/views/singer'
import TopList from '@/views/top-list'
import Search from '@/views/search'
import SingerDetail from '@/views/singer-detail'
import Album from '@/views/album'
import TopDetail from '@/views/top-detail'
import UserCenter from '@/views/user-center'

// 路由配置
const routes = [
  // 配置当访问根路径/的时候,跳转到/recommend的路径 渲染Recommend组件
  {
    path: '/',
    redirect: '/recommend'
  },
  {
    path: '/recommend',
    component: Recommend,
    children: [
      {
        path: ':id',
        component: Album
      }
    ]
  },
  {
    path: '/singer',
    component: Singer,
    // 指定子路由 每个对象都是子路由配置
    children: [
      {
        // 动态参数每个singer传递的Id是不同的
        path: ':id',
        component: SingerDetail
      }
    ]
  },
  {
    path: '/top-list',
    component: TopList,
    children: [
      {
        path: ':id',
        component: TopDetail
      }
    ]
  },
  {
    path: '/search',
    component: Search,
    // 将歌手组件定义为search的二级路由
    children: [
      {
        path: ':id',
        component: SingerDetail
      }
    ]
  },
  {
    path: '/user',
    components: {
     user: UserCenter
    }
  }
]

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

export default router

这个路由的缺点就是在首屏的时候,会加载全部的组件,导致首屏加载缓慢。如果要对首屏加载进行优化,那么就要使用动态的异步路由:只有在点击tag触发请求的时候才去获取组件对应的Js。

所以,我们使用import()函数,将组件的请求改为异步方法。
// 这种写法是同步组件 首屏就要加载 import Recommend from '@/views/recommend'
// 异步组件配合路由进行性能优化这样打包后的app.js就不会很大,下面这种写法是将同步组件变为异步组件 只有触发时候才按需加载const Recommend = () => import('@/views/recommend')
const Singer = () => import('@/views/singer')
const TopList = () => import('@/views/top-list')
const Search = () => import('@/views/search')
const SingerDetail = () => import('@/views/singer-detail')
const Album = () => import('@/views/album')
const TopDetail = () => import('@/views/top-detail')
const UserCenter = () => import('@/views/user-center')

这时候,我们运行项目,如下图:

这时,我们发现,当我们切换组件的时候,F12会查看到每当请求不同的组件的时候,才回去请求对应的js(组件)。

当然,默认名称是0.js,1.js,那么有没有办法让js名称友好一些?

为请求的组件js加一个名字

webpackChunkName为请求的组件js加一个名字,如果不加,默认是1.js, 0.js等。如果加了 那么在请求的时候就是recommend.js,F12在网络-js那部分看,这样就可以一眼就看出这是recommend组件对应的js。

具体的语法格式为:

/* webpackChunkName:"指定的名称" */
需要注意的是:/*【空格】webpack..:“xxx"【空格】*/,如果不这样写,就会有语法错误的提示。

真实使用例:

const Recommend = () => import('@/views/recommend'/* webpackChunkName:"recommend" */)

为recommend组件请求时候,指定的js名称为recommend.js。

更改后最终效果如下:

/*
* webpackChunkName为请求的组件js加一个名字,如果不加,默认是1.js, 0.js等到
* 如果加了 那么在请求的时候就是recommend.js
* F12在网络-js那部分看,这样就可以一眼就看出这是recommend组件对应的js
* */
const Recommend = () => import('@/views/recommend'/* webpackChunkName:"recommend" */)
const Singer = () => import('@/views/singer'/* webpackChunkName:"singer" */)
const TopList = () => import('@/views/top-list'/* webpackChunkName:"top-list" */)
const Search = () => import('@/views/search'/* webpackChunkName:"search" */)
const SingerDetail = () => import('@/views/singer-detail'/* webpackChunkName:"singer-detail" */)
const Album = () => import('@/views/album'/* webpackChunkName:"album" */)
const TopDetail = () => import('@/views/top-detail'/* webpackChunkName:"top-detail" */)
const UserCenter = () => import('@/views/user-center'/* webpackChunkName:"user-center" */)

然后当我们在运行项目的时候,就可以在控制台看到:

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:vue-router,webpackChunkName,import,异步组件
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9094次阅读 588人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3843次阅读 286人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14071次阅读 914人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12908次阅读 442人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11469次阅读 920人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15588次阅读 1244人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14795次阅读 1205人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    28950次阅读 2273人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    24982次阅读 1925人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录