SPA 首屏加载性能优化之 vue-cli3 拆包配置
前言#
现在已经是vue-cli3.x webpack4.x 的时代了,但是网上很多拆包配置还是一些比较低版本的。
本文主要是分享自己的拆包踩坑经验。
主要是用了webpack4 的 splitChunks 来进行拆包的配置以及在配置中的一些踩坑。
首屏加载的优化主要在于两个方面,一个是减小包的总体积,二是由于把依赖打包进去太大而要进行拆包处理,提高首屏的加载速度。#
一、减小包体积#
主要在于压缩和去掉无用的代码
压缩可以用webpack的一些插件,服务端gzip压缩
去掉无用代码有 生产环境去掉 console,去掉 .map 文件
适用插件:UglifyJsPlugin、TerserPlugin等
二、拆包#
1、分离第三方依赖包#
const Home= resolve =>{require(['./components/home/index.vue'],resolve)}
如果路由很多,都用这个的话,打包出来会有很多文件。
这时候,如果后端项目模板文件是写死引入的js和css的话就不太好办了,当然如果是前后端完全分离部署的环境或者是后端每次修改模板文件or动态引入所有js和css的话,是没什么问题的。
然而,我本次遇到的是前者,所以是希望基本上打包出来的文件名很少有变化才好。
(3)所以本次用的是webpack4 的 splitChunks , 注意 webpack 4 把 CommonsChunk 废弃,用splitChunks来取代。
默认配置: https://webpack.docschina.org/plugins/split-chunks-plugin/
- chunks: 表示哪些代码需要优化,有三个可选值:initial(初始块)、async(按需加载块)、all(全部块),默认为async
- minSize: 表示在压缩前的最小模块大小,默认为30000
- minChunks: 表示被引用次数,默认为1
- maxAsyncRequests: 按需加载时候最大的并行请求数,默认为5
- maxInitialRequests: 一个入口最大的并行请求数,默认为3
- automaticNameDelimiter: 命名连接符
- name: 拆分出来块的名字,默认由块名和hash值自动生成
- cacheGroups: 缓存组。缓存组的属性除上面所有属性外,还有test, priority, reuseExistingChunk
- test: 用于控制哪些模块被这个缓存组匹配到
- priority: 缓存组打包的先后优先级
- reuseExistingChunk: 如果当前代码块包含的模块已经有了,就不在产生一个新的代码块
在用它的时候,也遇到了一些配置问题,没有配置之前app.js 达2.3MB 之大,想要达到的效果是js拆成 4-5 个包,最好不要有超过1MB的包。
首先准备是把element-ui这个包拆出来,效果是拆出来了,但app.js还是有2MB,然后把echarts也拆出来之后,app.js还是有1.8MB,再增加配置,一直没有成功,只拆出来两个包。
最终的拆包配置,vue.config.js 中在 chainWebpack添加配置
// 拆包 config.optimization.splitChunks({ chunks: 'all', maxInitialRequests: Infinity, minSize: 300000, // 依赖包超过300000bit将被单独打包 automaticNameDelimiter:'-', cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name(module) { const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]; return `chunk.${packageName.replace('@', '')}`; }, priority:10 } } })
用这种就可以,设置minSize, 根据项目情况来,最终是大于它的依赖包就会被拆出来,这种的好处就在于,如果要自己去判断拆那个出来,有可能并不是很清楚哪些包比较大,哪些比较小,这种就会帮你判断,而且如果不是引入一些新的比较大的包,服务端的模板配置基本可以不怎么变。
参考:
https://juejin.im/post/5b99b9cd6fb9a05cff32007a
https://blog.csdn.net/weixin_34160277/article/details/86720033
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误