如何将几百兆的包优化到几十兆----记一次vue项目的打包优化过程

打包优化

现象

前段时间开发的时候遇到客户反馈的一个问题

界面无法打开,显示白屏,控制台无报错

经过我们在开发环境,测试环境反复测试都没复现出客户的问题,然后我们又不停的在生产环境上找问题,也没复现出来

最后我们派了个同事到用户现场去,了解具体情况

原因

经过同事了解发现,客户的电脑带宽只有5M换算下来网速在400kb/s

心理立马万马奔腾 现在还有5M带宽,第一反应领导找客户沟通升级带宽

此路基本行不通,客户属于专网专线的带宽到客户那边分的每台电脑只有那么大的带宽了,不可能给每个人的电脑都去增加带宽,只能先保证几台重要的岗位增加带宽

经过领导们和客户的沟通,最终是,保证功能完好的情况下可以牺牲用户体验,

听到这话,心理又是万马奔腾

这,沟不沟通,不都一样么

现在只能硬着头皮弄了

先来看一下我们最初打包后的文件大小,因为项目中既有cesium.js的3D效果还有mapbox的2D效果的地图中间有用了turf
这个处理地理空间数据的工具类所以打包后项目非常大

打包后控制台输出文件大小

打包后项目包大小

居然116MB,怪不得打不开呢

在浏览器中查看请求文件大小

居然有个文件5M,🤯🤯🤯

打包后116M 这在5M带宽中 怪不得用户连界面都打不开呢!

开始优化

于是开始了漫长的优化之路

删除打包后的console内容

安装依赖

npm install uglifyjs-webpack-plugin -D

导入依赖

const UglifyJsPlugin = require("uglifyjs-webpack-plugin")

配置依赖


new UglifyJsPlugin({uglifyOptions: {output: {comments: false},compress: {warnings: false,drop_console: true,pure_funcs: ["console.log"] // 移除console}},sourceMap: false,parallel: true
})
打包后发现这一步杯水车薪,基本上没有左右

压缩成gzip

安装依赖

npm install compression-webpack-plugin -D

导入依赖

const CompressionWebpackPlugin = require('compression-webpack-plugin')

使用依赖

    config.plugins.push(new CompressionWebpackPlugin({algorithm: 'gzip', // 压缩算法threshold: 10240,// 只处理大于 10KB 的文件minRatio: 0.6,// 只有压缩率小于 0.6 的文件才会被处理deleteOriginalAssets: false, // 压缩后删除原始资源文件}))

于是马上部署了上去,然后在浏览器一看,

晴天霹雳,居然打不开

最后通过一顿查找发现需要在nginx上加一个配置

gzip_static on; #开启静态资源压缩

打包后部署上去发现效果显著

5MB的文件立马变成了1.3MB

但此时打包非常慢,基本需要一两个小时才能打出一个包,这就需要一台电脑专门打包了,但公司的电脑基本上都是一人一台,没有多余的电脑,那怎么办呢?
还有没有别的办法呢?

这是恰巧这是看到
有说nginx nginx也可以开启压缩于是试了一下

gzip 				on; #开启Gzip
gzip_buffers 		12 8k; #number:指定Nginx服务器需要向服务器申请的缓存空间的个敿size:指定每个缓存空间的大 ?
gzip_comp_level 	4; #压缩级别 ?9,数字越大压缩的越好,时间也越长
gzip_http_version 	1.1; #对使用http?   ?.0 ?1的请求进行压 ?
gzip_min_length 	1k; #不压缩临界值,大于1K的才压缩,一般不用改
gzip_types 			text/plain application/x-javascript application/javascript text/css application/xml image/jpeg image/gif image/png image/jpg; #进行压缩的文件类 ?
gzip_vary 			on; #用于设置是否在使用gzip功能时发送带朿vary:Accept-Encoding" 头域的响应头部,该头域的主要功能时要告诉客户端数据已经在服务器进行了压缩,默认设置为off

一看效果基本一致,果断使用

使用上面nginx配置的时候要注意在最开头的http中配置了就会给所有项目开启压缩

提取公共依赖

通过在网上不停的找,最后又找到了一个方法提取公共依赖的方案

通过下面的这个分析工具我们可以很清楚的看出来哪些插件被多次使用并多次打包到文件中

此时就能分析出那些包需要提取成公共依赖

安装依赖

npm install webpack-bundle-analyzer

导入依赖

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

使用依赖

new BundleAnalyzerPlugin()

提取公共依赖

   config.optimization.runtimeChunk(false).splitChunks({chunks: "async",minSize: 0,cacheGroups: {mapbox: {name: "chunk-mapbox",priority: 100,test: /(mapbox-gl(.*))/},echarts: {name: "chunk-echarts",priority: 80,test: /(echarts(.*))/},pdfjs: {name: "chunk-pdfjs",priority: 20,test: /(pdfjs-dist(.*))/},antDesignVue: {//把antDesignVue从chunk-vendors.js提取出来。当然我们也可以把mixins,vue.min.js等等也按照类似配置提取出来name: 'chunk-ant-design-vue',test: /[\\/]node_modules[\\/]ant-design-vue[\\/]/,chunks: 'initial',priority: 110,reuseExistingChunk: true,enforce: true},vendor: {name: "vendor",test: /[\\/]node_modules[\\/]/,chunks: "all",priority: 10}}});

通过一次次分析,
最终提取了mapbox-glechartspdfjs-distant-design-vue然后将剩余的包打到vendor文件中

打包分析图-提取公共依赖前

打包分析图-提取公共依赖后

打包后控制台输出文件大小

打包后项目包大小

在浏览器中查看请求文件大小

这个优化并不能优化我们首屏打开的速度,
但是他能很好的优化我们切换路由的时候页面打开的速度,

因为我们在开发的时候就已经通过路由分包了,
各个组件有都是按需引入,
这就会造成打包的时候有些组件被重复打包到各个分包中去

这个提取公共包,
只能按照自己的项目一点一点的去,
提取打包反复的看,
不然就可能造成,
本来一个很小的文件,
提取后会造成源文件体积变大(我在这个过程中就遇到了)

至此本次优化全部完成

总结

本次优化最终实现将项目包的大小由116MB降到了21.6MB,优化率达到了80%以上,
可以说是一次非常成功的优化了,
让一个大型项目能在只有5MB带宽的网络中能顺利使用起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3249172.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

正点原子imx6uSD卡复制files文件到u盘rootfs的root内失败

进入rootfs的home目录 再进入root,一般是要输入密码的,更改权限,设置全部可以读写,删除原有的文件。再把files文件夹复制过来就行 后面找不带分区,哎。相当于内存卡就是启动u盘,进入了linux系统&#xff0c…

彻底解决idea的编解码问题

一、打开idea,找到Setting,点击File Encoding编解码设置,将以下标红的三个部分全部设置为UTF-8.同理如果你的项目使用的是GBK或者其他编码格式,那么也设置为统一。 二、点击Java Compiler设置补齐-encoding utf-8参数 三、如果你的项目使用到了tomcat,那么需要配置下tomca…

挖矿宝藏之硬盘分区

目录 一、硬盘分区的相关知识 二、主分区、活动分区、扩展分区、逻辑盘和盘符 三、硬盘分区原因 1.减少硬盘空间的浪费 2.便于文件的分类管理 3.有利于病毒的防治 四、硬盘分区的原则 1.方便性 2.实用性 3.安全性 五、利用Diskpart进行分区 1.命令行工具Diskpart …

谷歌浏览器自动填充密码时,el-input样式错乱

使用到谷歌浏览器的记忆功能,选择的内容为浏览器保存的内容时 会导致element-plus的el-input样式改变 只需要增加一个css样式,就可以解决问题 :deep .el-input__inner {box-shadow: 0 0 0 1000px #fff inset; }修改后

Chapter13 深度和法线纹理——Shader入门精要学习笔记

Chapter13 深度和法线纹理 一、深度和法线纹理的原理和获取1.背后的原理①深度纹理②法线纹理 2.如何获取3.查看深度和法线纹理 二、再谈运动模糊1.速度映射2.MotionBlurWithDepthTexture.cs3.MotionBlurShader 三、全局雾效 —— 屏幕后处理1.重建世界坐标interpolatedRay的求…

电脑压缩软件有哪些?整理了6个常用的,总有一款满足你的需求 !

对于长期需要借助电脑来办公的小伙伴来说,电脑压缩软件是不可获取的办公软件之一。电脑压缩软件具有多种重要作用,它们在日常的计算机使用、文件管理、网络传输和存储中扮演着不可或缺的角色。 下是电脑压缩软件的主要作用: 1、减少文件大小…

【C++】C++ 学生信息管理系统(源码+面向对象)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

C语言 ——— 在控制台上打印动态变化的菱形

目录 代码要求 代码实现 代码要求 输入 整数line &#xff0c;菱形的上半部分的长度就为line&#xff08;动态变化的菱形&#xff09; 菱形由 "*" 号构成 代码实现 #include<stdio.h> int main() {// 上半长int line 0;scanf("%d", &line)…

图解HTTP有感

目录 1、网络请求流程 2、HTTP报文结构 2.1、请求报文首部和响应报文首部 2.2、HTTP的首部字段有以下几种类型 3、HTTP的请求方式 4、响应状态码 5、HTTP安全 6、HTTP对用户身份的认证 7、全双工通信Websocket 7.1、什么是Websocket? 7.2、Websocket的主要特点&…

Linux系统及常用指令

目录 1、什么是Linux系统 2、为什么要用Linux系统 3、Linux系统的种类 4、如何安装Linux系统 5、常见的适配器种类 6、学习第一个Linux指令 7、安装ssh客户端软件 8、Linux系统的目录结构 9、Linux的常用命令 9.1 目录切换命令 9.2 查看目录下的内容 9.3 查看当前…

开源防病毒工具--ClamAV

产品文档&#xff1a;简介 - ClamAV 文档 开源地址&#xff1a;Cisco-Talos/clamav&#xff1a;ClamAV - 文档在这里&#xff1a;https://docs.clamav.net (github.com) 一、引言 ClamAV&#xff08;Clam AntiVirus&#xff09;是一个开源的防病毒工具&#xff0c;广泛应用…

MAVSKD-Java开源库mavsdk_server库macOS平台编译

1.下载源码 2.使用IDEA打开,进行mavsdk_server目录,使用gradle进行编译 3.开始编译时会自动下载依赖 4.下载完成后,会自动编译 5.编译成功 6.成功生成AAR文件

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP &#xff08; Trivial File Transfer Protocol &#xff09;即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

vivado FFT IP Core

文章目录 前言FFT IP 接口介绍接口简介tdata 格式说明 其他细节关于计算精度及缩放系数计算溢出架构选择数据顺序实时/非实时模式数据输入输出时序关于配置信息的应用时间节点 FFT IP 例化介绍控制代码实现 & 测试参考文献 前言 由于计算资源受限&#xff0c;准备将上位机 …

机器学习第四十八周周报 IAGNN

文章目录 week48 IAGNN摘要Abstract0. 前言1. 题目2. Abstract3. 网络结构3.1 问题定义3.2 IAGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.4 实验结果 5. 结论6.代码复现小结参考文献 week48 IAGNN 摘要 本周阅读了题为Interaction-Aware Graph Neural Networks…

<Qt> 信号和槽

目录 一、信号和槽概述 二、信号和槽的使用​​​​​​ &#xff08;一&#xff09;connect函数 &#xff08;二&#xff09;实现一个点击按钮关闭窗口的功能 &#xff08;三&#xff09;再谈connect 三、自定义槽函数 四、自定义信号 五、带参数的信号和槽 六、信号…

【从零开始实现stm32无刷电机FOC】【实践】【6/7 CMSIS-DSP】

目录 导入CMSIS-DSP库使用CMSIS-DSP 点击查看本文开源的完整FOC工程 CMSIS-DSP库是ARM开源的、对ARM处理器优化的数学库&#xff0c;本文使用了其提供的三角函数、反park变换函数、park变换函数、clarke变换函数、PID控制器。 CMSIS-DSP原始代码仓库是https://github.com/ARM-s…

双领域TOP10优秀安全企业!通付盾入选《嘶吼2024网络安全产业图谱》六大分类14项细分领域

7月16日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》&#xff08;以下简称“图谱”&#xff09;&#xff0c;通过市场调研、数据精析、文献研究及政策参考等多方面的综合分析&#xff0c;全面展示网络安全产业的构成及其重要组成部分&#xff0c;探索网…

MongoDB教程(九):java集成mongoDB

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、环境准…

网安小贴士(19)入侵检测技术原理与应用

前言 入侵检测技术&#xff08;Intrusion Detection System, 简称IDS&#xff09;是一种用于监测和防止计算机网络中的恶意活动的安全系统。它通过收集系统状态信息、特征提取、建立模型、入侵检测以及反馈更新等步骤&#xff0c;及时检测网络和系统中可能遭受攻击的迹象并发出…