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
SPA 首屏加载性能优化之 vue-cli3 拆包配置的更多相关文章
- Vue SPA 首屏加载优化实践
写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...
- Vue优化首屏加载
背景: 使用vue + iview搭建的一个后台管理系统,路由已经用了懒加载,加载登陆页面,居然还是需要18S左右,刚到一个新公司,项目经理很委婉的说,看看能不能优化了一下.然后就开始了网上一大堆'v ...
- vue项目首屏加载优化实战
问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...
- react 首屏加载优化
react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...
- vuejs学习之 项目打包之后的首屏加载优化
vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...
- Vue项目优化首屏加载速度
Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢 一.路由的懒加载 路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件. 结合 ...
- CSS加载性能优化
将首屏页面要用到的CSS文件,放在页面头部加载,其他模块的CSS可以使用异步加载:loadCSS 和 Preload. 关于preload,推进2篇文章给大家看下: 1.通过rel="pre ...
- React 16 加载性能优化指南
关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...
- H5 缓存机制浅析 移动端 Web 加载性能优化
腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...
随机推荐
- Map 集合按字母排序方法
@Testpublic void testMapSort() { Map<String, String> map = new HashMap<>(); map.put(&quo ...
- jquery跨js文件调用函数示例
var common_func; (function() { common_func = { load_hot_data: function(AreaCode) { var hot_html = &q ...
- 1、C#多线程基础理论
系统为应用程序分配所需的内存以及其他资源,内存和资源的物理分离叫做进程. 进程是以线程为单位竞争CPU,那么什么是线程呢? 线程可看成一个可执行的指令单元,他使用进程中的数据,包含若干条指令,进程 ...
- 阿里巴巴 Java 开发手册 (八) 注释规约
1. [强制]类.类属性.类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用 //xxx 方式. 说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Ja ...
- selenium中的元素操作之三大切换(二)
一.窗口切换 使用方法: 1.获取到打开的所有的窗口,句柄handles all_handles = driver.window_handles print(all_handles) 2.获取当前的窗 ...
- flask与flask-script的使用
flask与flask-script的使用 一.安装 pip install Flask-Script 二.简单的使用 # manage.py from flask_script import Man ...
- 2019 斗鱼java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.斗鱼等公司offer,岗位是Java后端开发,因为发展原因最终选择去了斗鱼,入职一年时间了,之前面试了很多家公 ...
- 【转载】sqlserver中小数类型float和deciaml类型比较
在sqlserver数据库中,float类型和double类型都可以用来表示小数类型,float类型是一种近似数值的小数类型,而decimal类型则是精确数值的小数类型.如果需要在sqlserver数 ...
- ES6 新增集合----- Set 和Map
Sets 和数组一样,都是一些有序值的的集合,但是Sets 和数组又有所不同,首先Sets 集合中不能存有相同的值,如果你向Sets 添加重复的值,它会忽略掉, 其次Sets 集合的作用也有所不同,它 ...
- springboot多环境下maven打包
前言: 最近在项目中使用springboot时发现,采用在pom中定义不同的profile,并且maven打包时 采用-P参数并不能替换我application.properties文件中指定占位符的 ...