企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 3. 那些年,克服延迟之道 再困难的问题也有解决的方案,但这些方案却良莠不齐。 ## 3.1. Spriting Spriting是一种将很多较小的图片合并成一张大图,再用JavaScript或者CSS将小图重新“切割”出来的技术。 网站可以用该技术来提速:在HTTP 1.1里,下载一张大图比下载100张小图快得多。 ![](https://box.kancloud.cn/2015-08-09_55c75bc173aaf.png) 但是当某些页面只需要显示其中几张小图时,这种方案的缺点就凸显出来了:它必须将整张大图都从cache里取出,而不能将最频繁使用的那些图片保留在cache里。 ## 3.2. 内联(Inlining) 内联是另外一种防止发送很多小图请求的技巧,它将图片的原始数据嵌入在CSS文件里面的URL里。而这种方案的优缺点跟Spriting很类似。 ~~~ .icon1 { background: url(data:image/png;base64,<data>) no-repeat; } .icon2 { background: url(data:image/png;base64,<data>) no-repeat; } ~~~ ## 3.3. 拼接(Concatenation) 大型网站往往会包含大量的JavaScript文件。一些前端工具能帮助开发人员将这些文件合并为一个大的文件,从而让浏览器能通过一个请求下载完,而不是发无数请求来分别下载那些小的JavaScript。但如果某页面只需要其中一小部分代码,它也必须下载完整的那份。而一个小小的文件改动也会造成大量数据的重载。 这种手段也给开发者造成了很大的不便。 ## 3.4 分片(Sharding) 最后一个我要说的性能优化技术叫做分片。顾名思义,分片就是把你的服务分散在尽可能多的主机上。这种方案乍一听比较奇怪,但是实际上在它背后却有非常深刻的道理! 最初的HTTP 1.1规范提到一个客户端最多只能对同一主机建立两个TCP连接。因此,为了不和规范冲突,一些聪明的网站使用了新的主机名。这样的话,用户就能和网站建立更多的连接,从而降低载入时间。 后来,两个连接的限制被取消了,现在的客户端可以轻松地和每个主机建立6-8个连接。但连接的上限却是依然存在的,所以网站依然会用这种技术来提升连接的数量。随着资源个数的提升(上面章节的图例),网站需要更多的连接来保证HTTP协议的效率,从而提升载入速度。在现今的网站上,使用50甚至100个连接来打开一个页面并不罕见。[httparchive.org](http://httparchive.org)的最新记录显示,在Top 30万个URL中平均使用38(!)个TCP连接来显示页面。并且这个数字仍然在缓慢的增长。 另外一个将图片或者其他资源分发到不同主机的理由是可以不使用cookies,毕竟现今cookies的大小已经非常可观了。无cookies的图片服务器意味着更小的HTTP请求和更好的性能! 下面的图片展示了访问一个瑞典著名网站的时候的数据包,请注意这些请求是如何被分发到不同主机的。 ![](https://box.kancloud.cn/2015-08-09_55c75bc18a3e9.png)