前段时间面试了一位候选人,当我问到前端性能优化的常用手段时,候选人很笃定地说雪碧图,能减少页面请求数量,而且她经常在项目中使用 

但事实是,前端早就不用雪碧图了

这篇文章会对前端性能优化宝典「雅虎军规」中关于「减少 HTTP 请求」的部分进行解读,并从 HTTP 协议的层面说明一个问题:现代前端工程中为什么不需要过于关注 HTTP 请求数了?

雅虎军规有言:终端用户的等待时间中,有 80% 都耗在了前端上。而这些时间消耗中,大部分都用来加载页面所需的资源,比如:图片、视频、样式、脚本等。在这个问题上,终极的解决思路是「通过减少页面资源数来控制 HTTP 请求数」,而 HTTP 请求越少,呈现给用户的页面也就会越快。

毕竟,还记得这个听起来就很麻烦的过程吗 ????

但,总不能为了页面快速渲染,只把最简单的文字内容呈现给用户吧,就算咱们前端愿意,产品经理和设计师也是一百个不愿意。

伴随着这几年网络内容的爆炸式发展,在终端呈现更多丰富的内容是一个不可逆的发展趋势,所以这个时代的前端工程师要在兼顾页面内容丰富基础上,不断加速网页的响应速度。

接下来会介绍一些上古时代的、关于减少请求数的前端性能优化法则(「雅虎军规」是在 2006 年底提出的),以及这些法则是为何在现代前端工程被废弃的

文件合并

文件合并,顾名思义,是把多个文件合并成一个文件(JavaScript 或 CSS),这么做的目的自然是为了减少文件的数量,从而减少 HTTP 请求的数量。比如我们现在有一个页面,页面上引用了来自不同域名的多个 JS 和 CSS,那么初始化这个页面时,需要发起的 HTTP 请求数就是这些文件个数的总和。之后有了 grunt、gulp 等工具的诞生,开发者在构建时会把多个同类型的文件打包为一个大文件,这样只需要发起很少的请求数就能获得相同内容的文件(或者说是“文件集合”)。


雪碧图

雪碧图原名是 「CSS Sprites」,原意是「精灵」,但恰好和「雪碧」的英文名一样,所以在中国大家都称其为「雪碧图」。

雪碧图的原理也很简单,把页面上(或是整个网站)上要用到的小图片合并成一张大图片,通过 css 的 background-image 和 background-position 来使用对应的图片。


但,由于这个概念提出的年代比较早,还没有诸如 gulp、webpack 之类的自动化构建工具,前端工程师们为了提高页面加载的性能,通常都需要自己制作雪碧图,可谓非常痛苦。

和雪碧图相似,还有个方案,叫做「映射图」。本质还是把很多张图片拼在一起来减少 HTTP 请求的数量。和雪碧图不同的是,映射图提倡把页面的所有原质量图片拼在一起。但由于使用场景有限(一般只能用在连贯图片展示的场景),所以很快就被抛弃了。

Base64 图片

在 Yahoo 军规中,base64 图片称作「inline images」。Base64 图片的本质是通过对一张图片进行 base 64 编码,生成的字符串可以用来在 html、css 文件中代替图片地址。


但是和其他优化手段不同的是,base64 不一定真的就意味着「优化」:当进行 base64 编码时,得到的字符串往往非常长,会变相增加 html 或 css 的体积,所以在使用时需要做一下权衡。一般我们在 webpack 工程中,会指定 8kb 以下的图片转用 base64 图片的形式。

但是,早就没必要这么玩了

在现代前端工程中,其实不太有人会 care 「合并文件以减少 HTTP 请求数」这个优化手段了,或者说,随着 HTTP 协议的更新换代,它甚至都不配作为一个「性能优化手段了」。

还记得 TCP 连接三次握手和四次挥手的过程吗?没关系,忘了的话我再贴一遍图。


每一个 HTTP 请求在发送出去之前,都会经历一次 TCP 三次握手的过程,当数据传输完毕,又进行一次四次挥手的过程,是不是贼麻烦?


上面这张图,没有错,但是(我又要说但是了),这已经是将近 20 年之前的事情了。回顾一下 HTTP 协议的发展史我们发现,完整的 HTTP 协议(也就是 HTTP 1.0)诞生于 1996 年,过了三年后就升级为 HTTP 1.1,到了 2015 年,再次升级为 HTTP 2.0。其实到 2021 年的今天,HTTP 已经进入 3.0 时代了。

严格意义上来说,合并文件这种性能优化手段,在 HTTP 1.1 推出后,就应该受到质疑了。为什么呢?且看下面这张图:


HTTP 1.1 版本默认支持长连接(Connection:keep-alive)和流水线请求(Pipelining),也就是说,多个 HTTP 请求可以依次共享同一个 TCP 连接,大大减少了建立 TCP 连接时的消耗和延迟。

到了 2015 年,HTTP 2.0 横空出世,带着多路复用的光环来了,不仅解决了 HTTP 1.1 流水线请求会造成的请求阻塞的问题,更重要的是,多路并行,更快了


下图是在相同的网路状况下,HTTP 1.1 和 HTTP 2.0 的直观对比图。


综上所述,在现代前端工程里,没有必要做这种「合并文件以减少 HTTP 请求」的“优化”,相反的,现在的前端应用都很大,反而需要用到「分包加载」和「懒加载」等手段,减少每个静态文件的实际体积,这样才能获得更快的下载速度以及在浏览器端获得更快的解析速度。

⭐原创精品,推荐阅读⭐

(点击图片即可阅读)

点击下方卡片关注后星标????,不错过每一篇文章

从 HTTP 协议求解:为什么我们越来越不需要雪碧图了?相关推荐

  1. 黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

    文/黑猫学长 1 作者想说 笔者本人从事于存储芯片行业多年,对eMMC/UFS/SD等芯片有深入研究,协议尤甚.而今看来,UFS协议在整个存储产品中(包括U盘.SPI.SD卡,NM卡.emmc.SSD ...

  2. 2021年中国同城配送行业发展势头良好,越来越受资本家的青睐[图]

    一.同城配送基本定义 物流配送发展到现在,已基本形成比较完整的体系,一般分为三个层级:第一层级是国际国内长途物流快运,主要运送工具是飞机.火车.轮船等:第二层级是干线配送,主要通过重卡长途运送:第三层 ...

  3. 大厂面试TCP协议经典十五连问!22张图让你彻底弄明白

    前言 TCP协议是大厂面试必问的知识点.整理了15道非常经典的TCP面试题,希望大家都找到理想的offer呀 1. 讲下TCP三次握手流程 开始客户端和服务器都处于CLOSED状态,然后服务端开始监听 ...

  4. stereo matching的能量函数最小值求解——alpha expansion 和alpha-beta swap算法(图割)

    alpha expansion以及alpha-beta swap介绍 写在前面的话 α \alpha α-expansion 和 α − β \alpha-\beta α−βswap的算法流程 生成带 ...

  5. 2020年中国中药饮片行业发展现状分析,需求不断增长,发挥着越来越重要的作用「图」

    一.中药饮片行业概况 中药饮片是中药材经过按中医药理论.中药炮制方法,经过加工炮制后的,可直接用于中医临床的中药.中药配方颗粒借助了现代科学技术与手段,采用规模化生产方式,提升了产品质量标准的同时,使 ...

  6. MATLAB怎么解方程解,怎么用MATLAB求解微分方程组并画出解函数图?

    !using["XSLSF"];                //使用命名空间XSLSF //数组xArray存放x的值:ti为当前有效值的个数:tmax为ti对应的时间:tmi ...

  7. 前端性能优化学习 07 图片优化

    图片优化 前端大部分的工作都围绕在 JavaScript 和 CSS 上,考虑如何更快地下载文件,如何提供给用户复杂而优雅的交互,如何高效合理地应用有限的处理和传输资源等,这些是用户感知的全部吗? 当 ...

  8. Vue+网络协议+Webpack高频面试题

    文章目录 Vue vue的优点是什么? vue生命周期(重要) created和mounted的区别(重点) 什么是 MVVM? 双向数据绑定原理(重点) vue自定义指令 vue自定义组件 Vue组 ...

  9. 回归 HTTP 协议本质:前端还能做哪些性能优化?

    上篇文章聊到:在 HTTP 2.0 时代以后,不需要额外担心由于 TCP 连接数带来的前端性能问题,因此我们不再需要雪碧图等优化手段了.于是前端工程师在 HTTP 协议这层能做的性能优化似乎只有「尽可 ...

最新文章

  1. mysql用户的创建和授权_MySQL用户创建和授权
  2. apache禁止访问html,apache 限制目录访问
  3. setTimeout 第一个参数类型
  4. 动态规划6个题目总结比较
  5. php urledcode_用JavaScript实现PHP的urldecode函数
  6. shell 面试题 (一) 待续
  7. 没想到Sharding-Jdbc竟然这么牛逼!一键实现读写分离、分库分表~
  8. [CareerCup] 12.6 Test an ATM 测试一个自动取款机
  9. 百度云 java私塾_JAVA私塾-百度云
  10. 三十三、Fluent边界条件湍流参数设置详解
  11. 百度文库资料下载总结技巧
  12. bpsk调制matlab,MATLAB仿真-BPSK调制.doc
  13. AOSP 隐藏 su
  14. 每个客户看待期货开户公司的角度不一样
  15. 软工网络15个人阅读作业1-评分发布
  16. 云原生背景下的运维价值思考与实践
  17. ONF开源白皮书:SDN解决方案案例——校园SDN
  18. Redis简介(01)历史与发展
  19. 软件体系结构--《Software.architecture.perspectives.on.an.emerging.discipline》
  20. 【千锋】网络安全学习笔记(三)

热门文章

  1. php amazon 获取评论,现在!亚马逊评价怎么来?如何获得评论?
  2. 微星z370安装linux系统,微星 Z370 GAMING PRO CARBON如何用u盘装系统win7
  3. win10更新导致共享打印机0709问题
  4. php://filter协议的另一个姿势
  5. Excel办公(两张表数据匹配)
  6. 类C语言--栈与队列习题--假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。
  7. 使用Threejs自己画一个河南省地图(超简单)
  8. 学习到底是如何学会的?
  9. 互联网金融协会获批成立
  10. 莱姆智慧城市新愿景 用匠人精神助飞智能电网