前端项目打包优化(解决首屏加载慢的问题),看一篇就够了!

项目技术栈

1.vue 2.6.10
2.vue/cli 4.5.15

初始构建大小

dist文件夹内容
初始build的结果如上图所示,整个dist文件夹大小是49.7MB,从文件上可以看到,app.js、0.js、2.js、3.js文件夹非常大,这种时候就要找找原因了

引入辅助工具

既然要分析这些比较大的文件里面都有些什么, 我们就引入一下分析包的工具,webpack-bundle-analyzer:

npm install --save-dev webpack-bundle-analyzer

接着在vue.config.js中要做一些配置

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
module.exports = {
	configureWebpack: (config) => {
		return {
			//...
			plugin: [
				new BundleAnalyzerPlugin({
		            analyzerPort: 8889, // 分析页面
		            openAnalyzer: false // 默认不打开分析模块页面
		        })
			]
			//...
		}
	}
}

配置好了,看看效果,执行一下编译打包的命令

npm run build

编译完成之后,打开浏览器,地址栏输入localhost:8889
打包文件分析

从上图就很明显看到哪些文件占的大。好了,接下来做一些针对性的解决方法吧。


优化一:cdn引入

首先让我很耿耿于怀的就是这个ercharts,确实用的多,打包之后也很占空间,所以我决定用cdn来引入:

public/index.html

<script crossorigin="anonymous" src="https://lib.baomitu.com/echarts/5.2.1/echarts.min.js"></script>

其它版本你们自己移步到链接: echarts

配置vue.config.js

module.exports = {
	chainWebpack: config => {
	    // ...
	    var externals = {
	      'echarts': 'echarts',
	    }
	    config.externals(externals)
	    config.plugins.delete("prefetch") //配置可以取消首屏渲染时对组件js文件的预加载, 实现真正的按需加载
	},
	//...
}

使用方法

import * as echarts from 'echarts'

哪个页面需要用到,就按照上面的引入就行,也可以在main.js全局引入,这样就可以直接使用echarts.init()等方法了

重新打包看效果

我忘记截图了,你们可以自己看看效果哈,就echarts.js部分就没了,我这边是缩小了6MB


优化二:按需引入

按需引入的话,其实是编码习惯来的,有些项目为了方便,就在main.js中全局引用样式框架等,最后有没有用到其实也不知道,打包的时候还一起打包了,所以导致打包之后体积很大,在main.js中全局引用element-ui的童鞋看过来:

安装插件

npm install babel-plugin-component -D

配置babel.config.js

module.exports = {
  presets: [
    '@vue/app'
  ],
  "plugins": [
    [
      "component",
      {
        "libraryName": "element-ui",
        "styleLibraryName": "theme-chalk"
      }
    ]
  ]
}

重新打包看效果

你们可以自己看看效果哈。


优化三:懒加载

经过前面两个步骤的优化之后我们会发现,虽然app.js是有变小,但是首屏加载整个app.js的时候,还是很慢,它还是很大,这种时候,我们应该去拆分它,使得每个页面只加载自己所需要的文件,就要用到懒加载啦!

先来看一段vue-router官网文字

当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效

那就来试试:

router.js

const router = createRouter({
  // ...
  routes: [{ path: '/users/:id', component: () => import('./views/UserDetails')}],
})

接着我在vue.config.js中加一些配置,你们可配可不配,我就是为了打包之后js文件放在文件夹内

module.exports = {
	configureWebpack: (config) => {
		return {
			//...
			output: {
	          // 防止打包js不在js文件夹下,生成新的js名称防止缓存
	          filename: `js/[name].[hash].js`
	        },
			plugin: [
				new BundleAnalyzerPlugin({
		            analyzerPort: 8889, // 分析页面
		            openAnalyzer: false // 默认不打开分析模块页面
		        })
			]
			//...
		}
	}
}

打包看效果
打包之后发现js文件变多了,但是基本上体积都很小,部署之后也会发现速度快了很多,因为首屏需要加载的内容也不多,然后你会发现打包出来的很多js文件命名是0,1,2,3,4这种,你不知道对应那个页面的,这种时候,我们可以引入chunkFilename

修改一下router.js

const router = createRouter({
  // ...
  routes: [{ path: '/users/:id', component: () => import(/* webpackChunkName: "UserDetails" */'./views/UserDetails')}],
})

修改一下vue.config.js

output: {
	filename: `js/[name].[hash].js`,
	chunkFilename: `js/[name].[hash].js`
},          

重新打包看效果

打包之后js文件命名就不是0,1,2…这种了,并且你会发现,同一个命名文件的页面,会打包到同一个js文件里面,看自己需求做哈,还有chunkname是可以动态设置的,有些项目的路由是遍历出来的,需要动态命名chunkname,有兴趣自己查一下哈


优化四:压缩文件

优化进行到这里,其实页面加载速度已经快了很多了,总体的文件还是比较大的,所以我们再搞一个压缩插件,引入compression-webpack-plugin

npm install compression-webpack-plugin -D

修改vue.config.js

const CompressionWebpackPlugin = require('compression-webpack-plugin')
module.exports = {
	configureWebpack: (config) => {
		return {
			//...
			new CompressionWebpackPlugin({
	            filename: '[path].gz[query]',
	            algorithm: 'gzip',
	            // test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
	            test: /\.js$|\.css$/,
	            threshold: 10240, // 只有大小大于该值的资源会被处理,当前配置为对于超过1k的数据进行处理,不足1k的可能会越压缩越大
	            minRatio: 0.99, // 只有压缩率小于这个值的资源才会被处理
	            deleteOriginalAssets: true // 删除原文件
	         }),
			output: {
	            // 防止打包js不在js文件夹下,生成新的js名称防止缓存
	            filename: `js/[name].[hash].js`,
	            chunkFilename: `js/[name].[hash].js`
	        },
			plugin: [
				new BundleAnalyzerPlugin({
		            analyzerPort: 8889, // 分析页面
		            openAnalyzer: false // 默认不打开分析模块页面
		        })
			]
			//...
		}
	}
}

重新打包看效果
js和css压缩之后体积更小了
压缩文件后
压缩文件后2.0


总结

—加载速度慢原因分析—

1.懒加载只使用在部分路由上,导致没有用懒加载的部分全部打包之后塞在app.js文件中,首屏加载时app.js加载完使用的时长较长;

2.页面引用了很多其实没有实际用到的插件,导致打包之后插件的体积较大;

3.echarts和vue-echarts的重复引用;

4.没有按需引用插件,像elementui直接在main.js中use,但是没有做打包过滤没有用到的样式处理;

【优化前】1分15秒 49.7MB

【优化后】3.5秒 10.7MB

注意:优化体积大小变化不大,但是因为使用懒加载,不会存在像之前那种单个包十几个M的问题.

有问题的地方,请大家不吝指教!

学习webpack是为了掌握前端代码打包工具的使用。随着前端工程化的发展,webpack已经成为了前端开发中最常用的打包工具之一。学习webpack可以帮助我们对项目的模块化管理、代码压缩与优化、资源加载等方面进行更加灵活和高效的处理。 这篇文章主要介绍了webpack的基础知识和使用方法。首先,它解释了webpack的基本概念,如入口和口文件、loader和plugin等。然后,它详细介绍了如何配置webpack的各个参数和插件,包括如何使用Babel处理ES6语法,如何使用Less或Sass处理CSS,如何使用图片压缩插件等。 接着,文章讲解了webpack打包原理和优化技巧。它介绍了webpack的模块化加载机制,以及如何使用Code Splitting和Dynamic Import等功能来提高页面加载速度。同时,它还提到了如何使用webpack进行代码分割和缓存优化,以及如何使用Tree Shaking和代码压缩插件来减小项目的体积。 最后,文章介绍了webpack的常见问题解决方法。它列举了一些常见的错误和警告信息,并提供了相应的解决方案。此外,它还提供了一些常用的webpack插件和工具的推荐,帮助我们更好地进行前端开发。 总的来说,这篇文章提供了一个很好的入门教程,可以帮助我们快速掌握webpack的基本概念和使用方法。但是,要想在实际项目中灵活应用webpack,还需要深入学习官方文档和相关资料,并结合实际项目进行实践。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值