vue项目打包优化,提高首屏加载速度

一、背景

最近开发完一个vue项目,上线时发现首屏加载时间很长,通过分析首屏加载时浏览器加载的资源,发现是因为打包时,对node_modules文件夹下面的第三方依赖打包很集中,导致压缩的js很大,加载时间变长。

二、解决办法

1、路由懒加载分组

一开始路由就已经采用懒加载的方式,只不过没有采取懒加载分组的方式。懒加载分组模式如下:

{
        path: 'Script',
        name: 'Script',
        component: () => import(/* webpackChunkName: "check-script" */'@/views/script/Script'),
        meta: { title: '巡检脚本', roles: ['User'] }
      },
      {
        path: 'AddScript',
        name: 'AddScript',
        component: () => import(/* webpackChunkName: "check-addscript" */'@/views/script/AddScript'),
        meta: { title: '修改脚本', roles: ['User'] },
        hidden: true
      },
      {
        path: 'CheckObj',
        name: 'CheckObj',
        component: () => import(/* webpackChunkName: "check-obj" */'@/views/object/CheckObj'),
        meta: { title: '巡检对象', roles: ['User'] }
      },

注意:懒加载分组时,不宜将过多的组件分到同一个组,组尽量做到最小,这样在压缩打包时保证文件不过于庞大。打包之后,会根据分组名称,生成类似下面的压缩文件。
在这里插入图片描述

2、使用js压缩插件和配置splitChunks

在vue.config.js中配置

const UglifyJsWebpackPlugin = require('uglifyjs-webpack-plugin')
chainWebpack(config) {
    config.plugins.delete('preload') // TODO: need test
    config.plugins.delete('prefetch') // TODO: need test

    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    // set preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()

    config
    // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === 'development',
        config => config.devtool('cheap-source-map')
      )

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin')
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
            // `runtime` must same as runtimeChunk name. default is `runtime`
              inline: /runtime\..*\.js$/
            }])
            .end()

          /** gzip 压缩 */
          // config
          //   .plugin('compressionPlugin')
          //   .use(CompressionPlugin)
          //   .tap(() => [
          //     {
          //       test: /\.js$|\.html$|\.css/, // 匹配文件名
          //       threshold: 10240, // 超过10k进行压缩
          //       deleteOriginalAssets: false, // 是否删除源文件
          //       minRatio: 0.8
          //     }
          //   ])
          /** 去掉console.log debugger sourceMap*/
          config.optimization.minimizer([
            new UglifyJsWebpackPlugin({
              /** 这个 sourceMap注释掉,默认就是置为false.(写为false 也是可以的)。
               * 反之设为true 是生效的。
               * 故在官方的配置(productionSourceMap: false)就可以注释掉了*/
              sourceMap: false,
              uglifyOptions: {
                warnings: false,
                compress: {
                  drop_console: true,
                  drop_debugger: true
                }
              }
            })
          ])
          config.optimization.splitChunks({
            chunks: 'all',
            minSize: 30000, // 字节 引入的文件大于30kb才进行分割
            minChunks: 1, // 模块至少使用次数
            maxAsyncRequests: 5, // 同时加载的模块数量最多是5个,只分割出同时引入的前5个文件
            maxInitialRequests: 3, // 首页加载的时候引入的文件最多3个
            automaticNameDelimiter: '~', // 缓存组和生成文件名称之间的连接符
            name: true, // 缓存组里面的filename生效,覆盖默认命名
            cacheGroups: {
              libs: {
                name: 'chunk-libs',
                test: /[\\/]node_modules[\\/]/,
                priority: -10,
                chunks: 'initial'
              },
              elementUI: {
                name: 'chunk-elementUI', // split elementUI into a single package
                priority: -5, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
              },
              avue: {
                name: 'chunk-avue', // split elementUI into a single package
                priority: -5, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                test: /[\\/]node_modules[\\/]_?@smallwei(.*)/ // in order to adapt to cnpm
              },
              commons: {
                name: 'chunk-commons',
                test: resolve('src/components'), // can customize your rules
                minChunks: 2, //  minimum common number
                priority: 10,
                reuseExistingChunk: true
              }
            }
          })
          config.optimization.runtimeChunk({
            name: 'manifest'
          })
        }
      )
  }

没有使用Gzip的原因是需要后台配合,目前的优化已经足够项目使用,如果以后项目迭代,引用的资源更加庞大的话,会尝试这个方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过页面性能测试概念+页面加载过程+页面性能指标+页面性能测试工具的学习,可以学到如下内容:①WEB网站页面性能的指标(白屏时间、首屏加载完成时间、FP、FCP、DCL、CLS、FPS等);②WEB网站页面性能测试策略;③WEB网站页面加载过程(前端基础语言:HTML+CSS+JavaScript,DOM、CSSOM、渲染树、布局、绘制);④WEB网站页面性能测试工具的实际操作和功能介绍(开发者工具:控制台、网络、性能、Lighthouse、FPS渲染统计等);⑤WEB网站页面性能测试报告编写。⑥WEB网站页面性能测试步骤和实际操作。课程内容:第一章:课程简介1、课程介绍2、课程大纲第二章:页面性能测试1、页面性能测试概念2、页面性能测试专业术语3、页面性能测试策略第三章:页面加载过程1、HTML概念,HTML5实例,HTML5文档2、CSS概念,CSS实例,CSS文档3、JavaScript概念,JavaScript脚本实例和作用4、DOM和CSSOM理解5、HTML5渲染引擎理解6、HTML5页面内容渲染的过程,HTML渲染树第四章:页面性能测试工具1、页面性能测试具体工具2、Chrome开发者工具介绍第五章:页面性能测试工具-控制台:window.performance1、控制台:window.performance介绍2、window.performance.timing执行结果加载字段理解3、window.performance.timing执行结果属性对应页面阶段理解4、window.performance页面性能参数计算5、window.performance页面性能关键指标计算第六章:页面性能测试工具-网络面板1、Chrome-开发者工具-网络面板介绍2、Chrome-开发者工具-网络-瀑布流指标第七章:页面性能测试工具-性能面板1、Chrome-开发者工具-性能面板-使用方法2、Chrome-开发者工具-性能面板介绍3、Chrome-开发者工具-性能面板-控制按钮区域4、Chrome-开发者工具-性能面板-Overview区域5、Chrome-开发者工具-性能面板-火焰图区域6、Chrome-开发者工具-性能面板-内存图区域7、Chrome-开发者工具-性能面板-统计汇总区域8、Chrome-开发者工具-性能面板-统计汇总区域-摘要内容9、Chrome-开发者工具-性能面板-统计汇总区域-事件时长、调用、发生顺序第八章:页面性能测试工具-FPS监控1、Chrome-开发者工具-FPS监控-FPS介绍、FPS视觉效果、FPS查看方法第九章:页面性能测试-Lighthouse面板1、Chrome-开发者工具-Lighthouse介绍、操作方法、运行的生命周期2、Chrome-开发者工具-Lighthouse报告指标分析3、Chrome-开发者工具-Lighthouse的报告优化建议第十章:页面性能测试工具-Performance insights面板1、Chrome-开发者工具-Performance insights操作方法2、Chrome-开发者工具-Performance insights分析报告第十一章:网速调研1、全国网速的调研和本机网速测试第十二章:页面性能测试总结1、页面性能测试指标采集方式2、页面性能测试报告3、页面性能测试-操作步骤​

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值