VUE2老项目性能优化

286 阅读1分钟

原因

以前的老项目屎山代码堆一块了,最近实在无法忍受了, 加载一个页面需要十几秒 , 客户还能坚持用着 实在是很佩服

第一次解决

排查原因发现,加载某一个chunk-xx.js 贼大,查看js文件才发现是 里面有太多不属于该页面的代码了,查看了一下路由,静态路由的是按需加载,但是动态路由是使用require形式加载的

改动点1: 动态路由按需加载

但是有个问题就是: 如果配置的菜单有很多,打包的时候 一个菜单会被分成一个chunk文件这样打包的速度就是变的很慢。但是能很有效的解决 你打开的页面对应就是你那个页面的chunk文件的代码

if (process.env.NODE_ENV === 'development') {
    return (resolve) => require([`@/views/${view}`], resolve)
  } else {
    // 使用 import 实现生产环境的路由懒加载
    return () => import(`@/views/${view}`)
  }

第二次解决

虽然单个页面加载变快了,但是首页进去还是很慢呢,排查原因发现首页加载资源的时候这个 chunk-lib.js 依赖包的文件太大了5MB左右, 这就需要用到第二招

打包压缩文件

1. // 下载  "compression-webpack-plugin": "^5.0.2",
2. 在 vue.config.js 里面配置
configureWebpack: {
 plugins: [
            // 这个插件能看打包进度
            new progressBarPlugin({
                format: 'build[:bar]' + ':percent' + '(:elapsed seconds)',
                clear: false
            }),
            // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
            new CompressionPlugin({
                cache: false,                   // 不启用文件缓存
                test: /\.(js|css|html)?$/i,     // 压缩文件格式
                filename: '[path].gz[query]',   // 压缩后的文件名
                algorithm: 'gzip',              // 使用gzip压缩
                minRatio: 0.8                   // 压缩率小于1才会压缩
            })       
          ]
}

结果

1705721437810.png

每一个文件后面都会再加一个 .gz的 已经压缩后的文件

同时也需要让后台给nignx做一下对应的配置这个不做多余解释

验证 是否生效

1705721651110.png

第三次解决

压缩完文件其实首页的加载速度有了显著的提升,但是 如果压缩完的chunk-lib.js依旧很大怎么办! 将依赖包单独进行分割处理

也有缺点: 还是不建议用,因为分的太细,初次加载可能就一次就有几十个请求,浏览器的并发限制是6个,所以几十个请求同时发出会造成堵塞,搞不好还会弄巧成拙,这里只是提供一种思路,具体还是看情况而定

configureWebpack: {


 optimization: {
            runtimeChunk: 'single',
            splitChunks: {
                chunks: 'async',
                minChunks: 2,
                maxAsyncRequests: 4, // 按需加载的最大并行数
                maxInitialRequests: 4, // 入口点的最大并行请求数
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/,
                        priority: -10,
                        enforce: true,
                        name(module) {
                            var packageName = null
                            if (module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)) {
                                packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                                console.log('压缩', `npm.${packageName.replace('@', '')}`);
                                return packageName ? `npm.${packageName.replace('@', '')}` : ''
                            }
                         }
                     }
                  }
          
              }
         }

}