单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒

需求背景

  1. 从第三方采购的vue2 + ElementUI实现的云管平台,乙方说2011年左右就开始有这个项目了(那时候有Vue了吗,思考.jpg)。十几年的项目,我何德何能可以担此责任。里面的代码经过多人多年迭代可以用惨不忍睹来形容,吐槽归吐槽,混口饭吃,多烂的代码都得啃下去。
  2. 有一天领导找到我,问我怎么回事,打开页面需要十几秒时间也太慢了,后台管理系统不要求首屏加载时间都没有这么慢,这个对外的系统超过1秒打开时间,都会流失很多客户,不优化好年终自己看着办吧。
  3. 什么?影响年终?好的领导,我马上抽时间解决(🐂🐴)。

如何看优化是否做到位?

1. Lighthouse谷歌插件,从首页打开速度分析页面的性能,并给出指标和打分。

  • 如何使用Lighthouse?
  • F12打开控制台 - Lighthouse
  • 如下图所示选择,然后点击Anlyze page load就可以了
  • 这里只关注性能所以只勾选了Performance指标,其他可访问性、SEO有需求一同检测的自行勾选上。
    image.png

2. webpack-bundle-analyzer插件,分析代码打包大小的工具。

  • 如何使用webpack-bundle-analyzer?
  • npm install --save-dev webpack-bundle-analyzer安装依赖
// webpack.config.js配置文件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;  
  
module.exports = {  
  // ... 其他配置 ...  
  plugins: [  
    new BundleAnalyzerPlugin()  
  ]  
};
  • 这样在打包的时候会生成一个静态网站查看各个模块占用的存储空间大小
    image.png

优化成果(有图有真相) 🔥

LightHouse性能指标解释:
FCP:衡量的是打开网页后,浏览器渲染第一段 DOM 内容所用的时间
LCP:用于测量视口中最大的内容元素何时渲染到屏幕上。这粗略地估算出网页主要内容何时对用户可见。
因为要优化的页面没有像官网那样有轮播图占据大量显示位置的元素,所以我主要关注FCP,FCP解决LCP也会相应变快

1. 优化前首页加载速度(FCP 15.8s)

image.png

2. 优化前体积(打包后大小80.5M)

Stat: 源代码阶段
Parsed: 经过webpack打包后的大小
Gzipped: 经过Gzip压缩过后的大小,实际浏览器接收的大小,需要服务器开启Gzip压缩
这里的大小主要关注chunk-vendors.js和app.js。其他都跟首页加载关系不大。下面的首屏代码大小是这两个js代码大小之和。
chunk-vendors是引用的第三方库如element-ui、echarts、vue等等打包后的代码。app.js是项目的代码。
总大小首屏代码大小
Stat76.5M21.1M
Parsed80.5M24.2M
Gzipped13.5M5.9M
  • 这里只放Gzipped的大小,全部都放图太多了。
    image.png

3. 优化后体积(三倍左右的代码体积减少,打包后大小减少64M!)

总大小首屏代码大小
Stat30.2M15.2M
Parsed16.6M6.2M
Gzipped4.3M1.9M

image.png

4. 优化后首页加载速度(FCP快了13.6秒!)

image.png

  • 看到这有人说,虽然是快了13.6秒,但是还是要2.2s,还是不能秒开,你的年终还是不保啊。
  • 上面Lighthouse是不会用到缓存去检测性能的,为了有效他每次检测都相当于首次全部加载,打包后的css、js静态文件都是可缓存的。用户第二次打开时,是可以做到秒开。(年终有啦-.-)
    image.png

怎么优化 ✏️

1. 静态文件缓存(js,css等),图片和SVG进行压缩或者替换。

  • 这一点在优化官网的时候很有用!大多数官网代码都十分精简,首屏加载慢大多都是因为轮播图没压缩,文件太大请求慢导致的,用压缩工具压缩一下,或者让UI换个不失真占用空间小的即可解决问题。
  • 在用webpack-bundle-analyzer查看包大小的时候,发现一个SVG竟然有1.5M!你敢信?而且SVG不会经过打包有大小变化,就是即使经过Webpack打包,Gzip压缩,他也会占用1.5M的的大小,优化前也才5.9M,所以1.5M占比很大需要优化。
  • 最后改为使用静态图片引用,而且不是首页需要用到的SVG,所以首页代码大大减少
  • 从下图可以看到支付宝相关的SVG都比较大,最后都被我用阿里的iconfont用更小的svg替换了,减少了2.5M左右的大小!
    image.png

2. 删掉无用路由、引用的库(实际未使用),然后启用树摇

  • 删掉无用路由很有用!加上树摇,可以去掉很多代码。正常来说公司自研的项目,每一个路由都是必要。但是这是第三方经过多人多年迭代的项目,很多路由都是没用的。
  • 还有一些库,在main.js文件里注册了Vue的全局组件,但是搜索整个项目根本没有用到,而且这个库还挺大的。又可以减少一些代码。
  • 这里有个奇葩的点是,webpack@4.46.0的版本必须要指定mode: 'production’才会启用树摇!否则打包大小基本和源代码大小一样,参考上面优化前源代码76.5M,打包后80.5M代码还多了一点!(也有可能树摇开启成功了,只是启用了production其他优化减少了体积,有没有大佬指导一下!)

3. 除了首页组件以外,其他组件改为异步组件,异步加载。同一个路由的组件打包到一个js上。减少首屏加载时请求数太多。

import Home from '@views/Home.vue'
const router = [
    // 首页不要异步,才用导入的方式打包到app.js,优先加载
    {
        path: '/home',
        component: Home
    },
    // 其他组件异步加载,多个小组件可以打包到一起,减少请求数,代码分离要恰到好处
    {
        path: '/xx',
        component: () => import(/* webpackChunkName: "xx" */ '@/views/xx.vue')
    }
],

4. 异步加载首页不需要用到的js和css文件。

  • 项目的index.html总有一些奇奇怪怪的js和css引入如下所示,会阻塞页面的解析,我们在前端首页解析完后(DOMContentLoaded事件)加载它们。
<link
  rel="stylesheet"
  href="./luckysheet/plugins/css/pluginsCss.css" />
<link
  rel="stylesheet"
  href="./luckysheet/plugins/plugins.css" />
<link
  rel="stylesheet"
  href="./luckysheet/css/luckysheet.css" />
<link
  rel="stylesheet"
  href="./luckysheet/assets/iconfont/iconfont.css" />

<script src="./luckysheet/plugins/js/plugin.js"></script>
<script src="./luckysheet/luckysheet.umd.js"></script>
  • 比如这样
<script>
      document.addEventListener('DOMContentLoaded', () => {
        ;['./luckysheet/plugins/js/plugin.js', './luckysheet/luckysheet.umd.js'].forEach((item) => {
          const script = document.createElement('script')
          script.defer = true
          script.src = item
          document.body.appendChild(script)
        })
        ;[
          './luckysheet/plugins/css/pluginsCss.css',
          './luckysheet/plugins/plugins.css',
          './luckysheet/css/luckysheet.css',
          './luckysheet/assets/iconfont/iconfont.css'
        ].forEach((item) => {
          const link = document.createElement('link')
          link.rel = 'stylesheet'
          link.type = 'text/css'
          link.href = item
          document.head.appendChild(link)
        })
      })
    </script>

5. 此外还有服务端开启http2、开启Gzip压缩,笔者优化之前已经开启所以没有对比,就不再赘述,实际上提升也非常大。

6. 最后效果

  • 大小、请求数、加载时间都大大减少
  • 注意优化后的时间chunk-vendors.js和app.js加载一共耗时1.59s,不是1.11+1.59,chunk-vendors的下载解析会阻塞app.js的下载解析,所以一共1.59s。
  • 前:

image.png

  • 后:

image.png

最后 🚁

Happy ending!年终保住了!(也可能没保住🐶)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试题:Java中int符号数字的位运算与操作 + 原码、反码、补码之间如何进行转换

题目来源 阿里-淘天-技术1面 问题 -1和4做位运算与操作&#xff0c;结果是多少&#xff1f; 答案 正确答案 4 通过Java代码验证如下&#xff1a; 我的回答 -5&#xff0c;但是-5是错误的答案。 面试的时候&#xff0c;面试官没有告诉我对错。 为什么&#xff1f; 到底…

[生活][杂项] 上班党的注意事项

前言 目前是上班已经接近两年了&#xff0c;目前的状态是&#xff0c;一个人租了一个单间在上班。对于这种情况有以下几点需要注意。 钥匙问题&#xff0c;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff…

CSS:filter(滤镜)属性

用途 可以用于img标签&#xff0c;div标签等 图像&#xff0c;背景&#xff0c;边框的调整 常用属性 1. 灰度 grayscale()&#xff0c;默认是0&#xff0c;100%就是黑白 2. blux 给图像设置高斯模糊的程度&#xff0c;radius值设定高斯模糊的程序&#xff0c;表示像素点…

2024年Q1季度冰箱行业线上市场销售数据分析

Q1季度冰箱线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;冰箱累计销量约410万件&#xff0c;环比下降11%&#xff0c;同比下降21%&#xff1b;累计销售额约98亿元&#xff0c;环比下降31%&#xff0…

python爬虫(Selenium案列)第二十四

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

详细分析Python的继承和多态(附Demo)

目录 前言1. 继承2. 多态 前言 入行多年&#xff0c;对于知识点还会混淆&#xff0c;此处主要做一个详细区分 继承&#xff08;Inheritance&#xff09;: 面向对象编程中的一个重要概念&#xff0c;允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff…

工作流JBPM操作API启动实例查询任务

文章目录 8.5 启动实例8.5.1 按照key启动(不加参数)8.5.2 按照key启动(加入参数)8.5.3 启动流程实例的说明 8.6 查询任务8.6.1 查询所有未办理任务8.6.2 查询个人未办理任务8.6.3 查询个人的待办组任务 8.5 启动实例 8.5.1 按照key启动(不加参数) Test // 启动 -- 简单的启…

2024华中杯B题完整思路代码论文解析

2024华中杯B题思路论文汇总 https://www.yuque.com/u42168770/qv6z0d/xpkf6ax8udqq9lt2?singleDoc# 本文针对电子地图服务商利用车辆轨迹数据估计城市路口信号灯周期的问题,提出了一系列数学模型和算法。通过分析车辆行驶轨迹与信号灯的关联性,在不同的约束条件下,实现了对路…

谷歌量化白皮书—PTQ原理

本篇笔记摘抄的原文链接 量化方法 量化粒度 量化模拟 激活层的量化 量化硬件原理 量化范围的设置方法 基于BN的激活层量化范围设置 普通卷积 VS 深度可分离卷积 跨层均衡化 ReLU6比ReLU有什么优势 吸收高偏差、偏差校正、自适应取整 标准PTQ流程 量化模型精度的诊断和性能…

综合大实验

题目&#xff1a; 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#xff0c;其…

LeetCode in Python 1338. Reduce Array Size to The Half (数组大小减半)

数组大小减半思路简单&#xff0c;主要是熟悉python中collections.Counter的用法&#xff0c;采用贪心策略即可。 示例&#xff1a; 图1 数组大小减半输入输出示例 代码&#xff1a; class Solution:def minSetSize(self, arr):count Counter(arr)n, ans 0, 0for i, valu…

【ESP32 手机配网教程】

【ESP32 手机配网教程】 1. 前言2. 先决条件2.1 环境配置2.2 所需零件3.3 硬件连接步骤 3. Web热点手动配网3.1. 准备工作3.2. 编译上传程序3.3. 进行手动配网 4. BLE无线配网4.1. 准备工作**4.2. 编译上传程序4.3. 使用手机APP进行无线配网 5. 总结 1. 前言 欢迎使用ESP32进行…

JVM虚拟机(十一)CPU飙高的排查方案与思路

目录 一、排查方案与思路二、总结 一、排查方案与思路 1.一般我们查看 CPU 的使用情况&#xff0c;可以使用 TOP 命令&#xff1a; top执行结果如下所示&#xff0c;这里就可以按照 CPU 使用率进行排序。 2.通过 top 命令查看后&#xff0c;可以查看是哪一个 Java 进程占用 C…

JS中的变量和数据类型及用户输入详解

源码 variate.html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…

详细分析Mysql常用函数(附Demo)

目录 前言1. 聚合函数2. 字符串函数3. 日期函数4. 条件函数5. 数值函数6. 类型转换函数 前言 由于实战中经常运用&#xff0c;索性来一个总结文 创建一个名为 employees 的表&#xff0c;包含以下字段&#xff1a; employee_id&#xff1a;员工ID&#xff0c;整数类型 first…

Redis几种常见的应用方式

1.登录认证 redis最常见的应用就是&#xff0c;登录认证把。再首次登录返回给前端token&#xff0c;把用户名和登录状态缓存到redis一段时间&#xff0c;每次其他请求进来过滤器那这token解析出来的用户名或其他关键的key值&#xff0c;再redis里面查询缓存&#xff0c;有则直…

驱动云创建保存自己的环境

驱动云创建保存自己的环境 制作镜像方法一方法二报错 上一篇link介绍了如何在驱动云上部署llama2以及驱动云在训练大模型的方便之处。也说到了可以直接使用驱动云现有的环境&#xff0c;免得自己配置环境。 但是有的时候免不了自己想要安装一些包。 驱动云的环境是这样的&…

华为手机p70即将上市,国内手机市场或迎来新局面?

4月15日&#xff0c;华为官宣手机品牌全新升级&#xff0c;p系列品牌升级为Pura。华为P70系列手机预计将于2024年第一季度末发布&#xff0c;而网友也纷纷表示期待p70在拍照、性能上的全新突破。 网友们对华为P70系列的热情高涨&#xff0c;也印证了国内高端手机市场的潜力巨大…

遥感图像分割 | 基于一种类似UNet的Transformer算法实现遥感城市场景图像的语义分割_适用于卫星图像+航空图像+无人机图像

项目应用场景 面向遥感城市场景图像语义分割场景&#xff0c;项目采用类似 UNet 的 Transformer 深度学习算法来实现&#xff0c;项目适用于卫星图像、航空图像、无人机图像等。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装依赖 conda create -n airs python3.8…

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测(Matlab实现)

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09; 目录 【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 差异创意搜索算法&…
最新文章