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

news2024/11/15 7:55:56

打包优化

现象

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

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

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

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

原因

经过同事了解发现,客户的电脑带宽只有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://www.coloradmin.cn/o/1939761.html

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

相关文章

一文带你读懂MLIR论文,理解MLIR设计准则.

论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation MLIR:针对特定领域计算扩展编译器基础设施 文章目录 论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation1. 论文下载2. TVM关于MLIR的讨论3. 论文正文0. 摘要…

5个人人都应该学会的电脑小技巧

今天分享几个电脑常用的快捷键,可以让你的工作事半功倍,建议收藏! 不想被突然来的人看到正在浏览的网站,用CtrlW或者AltF4可以关闭当前页面,另外如果你正在看小电影也可以用这个办法关闭。 2. 同事或大Boos走了之后想…

Anthropic的Claude安卓版能否赢得用户青睐?

Anthropic的Claude安卓版能否赢得用户青睐? 前言 Anthropic 就在7月18日,这家以"可控AI"著称的初创公司再次出手,推出了Claude的Android版本应用。这款APP不仅支持实时语言翻译,更传承了Anthropic一贯的隐私保护政策。C…

腾讯云COS托管静态网站,以及如何解决访问出现了下载网页的情况

腾讯云对象存储(Cloud Object Storage,简称COS),与其他云厂商所提供的云对象存储都是面向非结构化数据,只是每个云厂商的叫法有别于他家,或许是更能彰显厂商的品牌吧! 但不管云厂商怎么给云对象…

错误:PHP:Deprecated: Required parameter $xxx follows optional parameter $yyy

前言 略 错误 Deprecated: Required parameter $xxx follows optional parameter $yyy 解决办法 设置 error_reporting E_ALL & ~E_DEPRECATED & ~E_STRICT 参考 https://blog.csdn.net/lxw1844912514/article/details/100028023

MATLAB学习日志DAY13

13.矩阵索引(1) 13.1 下标 上图! A 的行 i 和列 j 中的元素通过 A(i,j) 表示。 例如,A(4,2) 表示第四行和第二列中的数字。 在幻方矩阵中, A(4,2) 为 15。 A(1,4) A(2,4) A(3,4) A(4,4) 用来计算 A 第四列中的…

【PG】PostgreSQL高可用之repmgr事件通知

目录 描述 结合脚本 占位符 repmgr命令 生成的事件: repmgrd 生成的事件(流复制模式): 描述 每次repmgr或repmgrd执行重大事件时,都会将该事件的记录连同时间戳、失败或成功的标识以及进一步的详细信息&#xff08…

黑马商城启动流程(微服务拆分项目)

1.虚拟机ssh(docker中布置了 mysql nacos seata(分布式事务)三个容器在同一个网络hm-net中) 2.idea(启动所有的微服务项目 ) 3.nginx 在cmd上启动 4.navicat 连接数据库 5.登录前端页面 http://localho…

Stable Diffusion AI入门介绍

Stable Diffusion模型 在上一篇的文章中我们介绍了,AIGC的相关知识以及AI绘画的历史——AIGC是什么,与AI绘画有什么关系,一篇文章带你了解AI绘画的前世今生。 我们知道了Stable Diffusion是一种潜在扩散模型,由慕尼黑大学的Comp…

将github上的项目导入到vscode并创建虚拟环境

1、将github上的项目导入到vscode 直接从github上下载到本地&#xff0c;用vscode打开&#xff08;Open file&#xff09; 2、创建虚拟环境 python -m venv <name> <name>\Scripts\activate ps: 1、退出虚拟环境 deactivate 2、如果运行python -m venv <…

【数据结构】详解堆

一、堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵 完全二叉树的 数组对象。 堆是非线性数据结构&#xff0c;相当于一维数组&#xff0c;有两个直接后继。 如果有一个关键码的集合K { k₀&#xff0c;k₁&#xff0c;k₂ &#xff0…

统信UOS

统信UOS 如何检测是否为适配的cpu 打开国产系统或linux系统的终端&#xff0c; 输入&#xff1a; uname -m 如&#xff1a; 软件安装 把下载的压缩包解压到当前目录 如果您确认电脑cpu为ARM64架构CPU:【飞腾、鲲鹏、海思麒麟、瑞芯微】&#xff0c; 请双击com.agicall.ub-ph…

JVM--双亲委派模型

1.双亲委派模型 定义&#xff1a; 站在Java虚拟机的角度来看&#xff0c;只存在两种不同的类加载器&#xff1a;一种是启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff0c;这个类加载器使用C语言实现&#xff0c;是虚拟机自身的一部分&#xff1b;另外一种…

【C++】一、Visual Studio 2017使用教程:内存窗口、预处理文件、obj文件,调试优化

文章目录 概述编译期&#xff08;Compile&#xff09;查看预处理后的文件查看obj文件开启编译器调试优化 链接期&#xff08;Linking&#xff09;报错信息概述自定义入口点 调试内存窗口值转16进制查看查看汇编代码 注意 概述 记录一下Cherno的vs配置下载地址 https://thecher…

Kubernetes集群安装步骤

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、安装要求 在开始之前&#xff0c;部署Kubernetes集群集群需要满足以下几个条件&#xff1a; 一台多多台机器&#xff0c;操作系统CentOS.x-86_x…

分布式锁、Lua脚本、redisson、运行lua脚本优化代码

20240721 一、分布式锁1. 什么是分布式锁2. 分布式锁的实现3. 基于redis的分布式锁4 总结 二、对于lua脚本可以保证事务&#xff0c;要么成功要么失败。1. 在redis中调用lua脚本 三、Redisson1 步骤2. Redisson的总结3. 几种分布式锁的区别 三、优化我们的秒杀1. 我们在创建优惠…

Mybatis-Plus代码生成器配置方法

Mybatis-Plus网址&#xff1a;https://baomidou.com/pages/779a6e/#%E4%BD%BF%E7%94%A8 第一步&#xff1a;引入依赖 <!-- 代码生成器 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId>…

IFIX6.5变量创建进阶-标签组用法

IFIX6.5变量创建进阶-标签组用法 普通变量创建 https://blog.csdn.net/hmxm6/article/details/140507111 OPC数据连接 项目介绍和应用场景 在实际项目中可能有好几个相同标签变量属于一类的 比如现在有三台风机&#xff0c;都有启动停止风量的三个数据 数据库里面需要创…

EI成稿丨明年上检索

基于xxxx嵌入式系统的无线传感网络路由优化算法研究基于网络安全xxxx全球互联网经济发展趋势分析基于深度学习的大数据xxxxx基于全IP物联网网络xxxxx安全管理中的优化研究xxxxx农业可持续发展评价及升级路径研究xxxxx分层轮廓数字化转型风险评估与防范策略基于Kano模型与xxxxx公…

防火墙--内容安全

目录 概述 IAE引擎流程 DPI深度包检测 基于特征字的检测技术 基于应用网关的检测技术 基于行为模式的检测技术 DFI深度流检测 基于数据流进行识别检测的技术 DPI和DFI对比 IDS&#xff08;入侵检测&#xff09; IPS&#xff08;入侵防御&#xff09; 优势 入侵检测…