问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Vue项目性能优化实操,从50分到80分

发布网友 发布时间:2024-09-10 12:41

我来回答

1个回答

热心网友 时间:2024-09-29 10:10

分析性能

在进行具体的优化之前,我们需要借助工具,分析一下性能。以下操作推荐在浏览器无痕模式下进行,可以多测几次,取一个平均值,避免网络波动带来较大的误差!

chrometoolsnetwork查看请求信息

lighthouse收集网页性能指标

webpack-bundle-analyzer查看打包模块依赖关系和包体大小

vue-cli3是内置了webpack-bundle-analyzer插件,我们可以直接通过"build:report":"vue-cli-servicebuild--report"命令生成report.html文件进行查看。

打包体积优化

从上图中可以看出,打包出来比较大的模块主要是moment,xlsx,quill,ant-designicon,针对这些插件都可以做出优化。

移除moment的所有本地文件constwebpack=require('webpack');module.exports={plugins:[//忽略moment.js的所有本地文件newwebpack.IgnorePlugin(/^\.\/locale$/,/moment$/),],};antdesignvue的icon按需加载

antdesignvue提供的icon很多,打包出来有500+kb,其实很多我们都用不上,需要对其进行按需加载处理。

//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';//vue.config.jsmodule.exports={chainWebpack:(config)=>{config.resolve.alias.set('@$',resolve('src')).set('@ant-design/icons/lib/dist$',resolve('src/plugins/antdIcons.js'));}}

按需加载,会导致一些内部组件使用的icon丢失,也需要手动给它导入一下。

三方库配置CDN链接//vue.config.jsconstassetsCDN={//webpackbuildexternalsexternals:{vue:'Vue','vue-router':'VueRouter',vuex:'Vuex',axios:'axios',xlsx:'XLSX',quill:'Quill'},js:['//cdn.xxx.com/vue@2.6.0.min.js','//cdn.xxx.com/vue-router@3.5.3.min.js','//cdn.xxx.com/vuex@3.1.1.min.js','//cdn.xxx.com/axios@0.19.2.min.js','//cdn.xxx.com/xlsx.core.min.js','//cdn.xxx.com/quill_v1.3.6.min.js']};module.exports={configureWebpack:{//打包时遇到这些externals,就不把它们打进去externals:isProd?assetsCDN.externals:{}},chainWebpack:(config)=>{if(isProd){//把cdn的地址添加到index.html页面中config.plugin('html').tap(args=>{args[0].cdn=assetsCDN;returnargs;});}}}

externals是key-value的形式,key是package.json中安装的包名,value是包真实注册或者说暴露的全局变量的值,比如vue-router的value是VueRouter,打开vue-router的源码,格式化可以看到如下,注册的值是VueRouter,其他的插件类似。

xlsx的处理

在用xlsx做前端导出excel功能时,网上大部分代码中都是用script-loader去加载xlsx的:

require('script-loader!xlsx/dist/xlsx.core.min');....

这样做并不能实现externals的功能,最后打包出来还是会引入一个xlsx.core.min.js文件,其实最新的xlsx已经支持import方式引入了:

importXLSXfrom'xlsx'

cdn地址有条件的情况下,最好用公司内部的,预防第三方cdn失效,导致线上崩溃,不能使用。

图片压缩yarnaddimage-webpack-loader-Dconfig.module.rule('images').use('image-webpack-loader').loader('image-webpack-loader').options({bypassOnDebug:true}).end();

其实我更喜欢在拿到图片的时候,就用第三方工具压缩一下,还可以比较好的保证图片的清晰度。使用插件压缩,还会增加打包时间,看取舍吧。

推荐一个在线图片压缩,最高压缩可达80%,比插件的效果好。

打包时间优化speed-measure-webpack-plugin打包时间分析yarnaddspeed-measure-webpack-plugin-D//vue.config.jsconstSpeedMeasurePlugin=require("speed-measure-webpack-plugin");constsmp=newSpeedMeasurePlugin();module.exports={configureWebpack:smp.wrap({plugins:[newMyPlugin(),newMyOtherPlugin()],});}

运行打包命令的时候就可以看到每个loader和plugin执行耗时:?

speed-measure-webpack-plugin,会大大加大打包的时间,所以部署上线的时候最好是注释掉。

Happypack多进程打包//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';0//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';1HardSourceWebpackPlugin打包缓存//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';2//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';3

第一次打包时间没什么提升,但是第二次开始提升效果就很明显了。在node_modules/.cache中可以看到它的缓存文件。

首屏加载优化分析覆盖率,进行拆包splitChunks

ChromeDevTools?有一组平行的选项卡,被隐藏在主窗口之下。这个组合被称为?Drawer。当你在?DevTools?(任何选项卡)中时,按?[esc]?来显示它,再次按?[esc]?隐藏它:

通过上图我们可以看出chunk-vendors.js文件的未使用字节数(UnusedBytes)达到了97%,这表示首页加载的大部分js都是用不着的。

经过上面的优化,我们可以打包看一下包体分析:chunk-venders很大,它包含了大量的依赖库,ant-design-vue,vxe-table,moment等,我们可以通过splitChunks将这些第三方库进行抽离独立打包。

//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';4

name:打包的chunks的名字

test:匹配到的模块奖杯打进这个缓存组

chunks:代码块类型必须三选一:“initial”(初始化)|“all”(默认就是all)|“async”(动态加载)默认Webpack4只会对按需加载的代码做分割。如果我们需要配置初始加载的代码也加入到代码分割中,可以设置为‘all’

priority:缓存组打包的先后优先级,数值大的优先

minSize:默认是30000)形成一个新代码块最小的体积

minChunks:(默认是1)在分割之前,这个代码块最小应该被引用的次数

maxInitialRequests:(默认是3)一个入口最大的并行请求数

maxAsyncRequests:(默认是5)按需加载时候最大的并行请求数

reuseExistingChunk:如果当前的chunk已被从split出来,那么将会直接复用这个chunk而不是重新创建一个

enforce:告诉webpack忽略splitChunks.minSize,splitChunks.minChunks,splitChunks.maxAsyncRequestsandsplitChunks.maxInitialRequests,总是为这个缓存组创建chunks

开启gzip

在nginx下开启gzip有两种方式:

gzipon调用服务器cpu动态打包

gzip_staticon?使用前端已经打包好的gzip文件更快

可以看一下[nginx官方文档配置]。(http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static)

我们使用前端打好gzip文件,因为调用服务器cpu动态打包,耗时间也耗性能,部署的时候前端打包好,就省时省力了。

//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';5//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';6其他代码优化

取公共组件,公共代码(Mixins,Utils)

异步加载组件

//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';7

路由懒加载

//antIcons.js//outLineexport{defaultasCopyOutline}from'@ant-design/icons/lib/outline/CopyOutline';export{defaultasCloseCircleOutline}from'@ant-design/icons/lib/outline/CloseCircleOutline';export{defaultasWarningOutline}from'@ant-design/icons/lib/outline/WarningOutline';//fillexport{defaultasExclamationCircleFill}from'@ant-design/icons/lib/fill/ExclamationCircleFill';export{defaultasCloseCircleFill}from'@ant-design/icons/lib/fill/CloseCircleFill';export{defaultasCheckCircleFill}from'@ant-design/icons/lib/fill/CheckCircleFill';8

主要作用是将路由对应的组件打包成一个个的js代码块,只有在这个路由被访问到的时候,才加载对应的组件,否则不加载!

最后

看一下优化的效果:

原文:https://juejin.cn/post/7101560677688410125
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
LG棒棒糖GD580这么看书 lg gd580怎么用moto看小说 各种海鲜馅饺子大全 海鲜水饺都有什么馅儿的 用网上交易系统进行股票操作资金安全吗,我是在中信建投开的户 北京瀚正化妆学校包就业吗 通江车检在哪里,可以摩托车年审不? 摩托车年审在通江县哪里啊 我是四川省通江县人、我是摩托车驾驶证,以快到期,请问我在江苏无锡... 通江县哪里可以托运摩托车 vue编程中加载优化策略有哪些? Excel统计函数——加权平均 中秋节应该给领导送点什么水果好呢? 如何在excel中计算数据的加权平均 外阴长疙瘩又疼又痒怎么回事 外阴瘙痒有小红疙瘩是怎么回事 十岁小女孩外阴痒是怎么回事 外阴长红疙瘩还痒怎么办 外阴长小疙瘩怎么回事 维佳夹心奶油的制作配方 西红柿鸡蛋怎么炒?先炒鸡蛋还是先炒西红柿 成都市哪一片地区治安比较好、房租又不太贵、而且交通方便的? 请问一下在成都哪里的房租要便宜一点,我想要搬房子了。 心率失眠是什么意思? 最近失眠会影响心率吗 失眠会不会引起心率过速 cad怎么计算周长和面积? 生姜烤干对营养价值有哪些影响? 西葫芦鸡蛋饺子的做法(西葫芦鸡蛋饺子馅怎么调) 商场男装品牌有哪些 项目上线之前的具体优化策略 餐饮logo设计有什么表现形式 王者荣耀买什么近战英雄最值! 流水如何在王者荣耀哪个英雄 三鹤六堡茶三鹤六堡茶 为什么微信老是提示该微信号使用外挂, 我在玩微信,提示我使用非法软件,怎么回事。 新人写手一般去哪些网站发布文章比较好呢? 纸杯小蛋糕操 作: 眩晕的预防和生活调养 经常头晕的原因有哪些 这些告诉你答案 时常头晕是什么原因 阴谋论的背后,才是阴谋 清华驻村博士生的思考:警惕“泛清真化”背后的阴谋 乌龟被我用开水烫伤了,半死不活的,怎么办啊。就是这只龟,这是原来照... 王耀南在聂荣臻指挥下参与的战役中有哪些突出贡献? 刘德华暗战中走在大街上的图片 乌鲁木齐县监察局内设机构 透视眼镜效果图 我是乌鲁木齐应届毕业生,请问档案和户籍放到南湖好还是自治区团委,都...