前端性能优化(二)| 小册免费学

简介: 上一节介绍了网页加载过程中可优化的点,这一节我来说一下网络部分的优化。

f13e9bd95fe23936db9792df8bb05a4.png

上一节介绍了网页加载过程中可优化的点,这一节我来说一下网络部分的优化。

网络部分包括了以下几个过程:

  • DNS查询
  • 建立TCP连接
  • 发送HTTP请求

这几点中DNS和TCP方面我们其实是无从下手的,所以我们只能咋HTTP上动刀子了。HTTP是一个往返的过程,浏览器发送请求和接收响应。


请求


在请求层面,上一节我们也说到了请求环节的优化,那就是减少HTTP请求,因为网络请求是整个过程中最不确定的因素,它受环境的影响最为直观。那么具体该从哪些方面减少,比如:

  • 每一个图片、样式……加载都会发送HTTP请求,所以可以将图片转为base64,现在前端开发一般都是使用打包工具来进行的工程化开发,打包工具一般会提供图片转base64的插件;合并小图标到css sprites (CSS精灵图)等,将小图标放置到一个文件,只需要一次加载,然后从这一张图片的位置去裁切,但是不要盲目合并导致文件过大,那样同样可能会影响体验
  • 过多的样式文件和脚本文件也会增加HTTP的压力,所以适当的将脚本和样式进行合并,但是不要盲目合并,盲目合并导致文件过大同样会影响加载速度
  • 少用location.reload()来刷新页面,每重新加载一次都会重新去请求资源


响应


在响应方面可以做的优化其实很简单,减小响应资源的体积——使用gzip压缩,启用gzip压缩也很简单,只需要在请求头中加入accept-encoding:gzipHTTP 压缩就是以缩小体积为目的,对 HTTP 内容进行重新编码的过程

gzip可以帮我们压缩大约70%体积,但是他并不是万能的,他也是有代价的,开启gzip需要浪费服务器的计算资源,服务器的 CPU 性能不是无限的,如果存在大量的压缩需求,服务器也扛不住的,这时候就会得不偿失


HTTP缓存


HTTP缓存是一个减少加载时间的最有效地方法,HTTP缓存有强缓存和协商缓存两种形式。

强缓存使用Expires 和 Cache-Control 两个字段来控制,当请求再次发出时,浏览器会根据其中的 expires 和 cache-control 判断目标资源是否“命中”强缓存,若命中则直接从缓存中获取资源,不会再与服务端发生通信。

来看一个使用了强缓存的响应,可以看到它使用了cache-control,最大有效时间31536000,换算过来借接近一年,也就是说在未来一年中都不需要再去请求这个资源

1682513872(1).png

协商缓存顾名思义就是浏览器和服务器共同协商的结果,当请求资源的时候浏览器会询问服务器资源是否过期,如果过期就重新加载资源,如果没有过期就直接使用缓存资源,协商缓存常用的字段有ETag/If-None-Match、Last-Modified/If-Modified-Since等

使用协商缓存之后HTTP状态码会变为304

1682513899(1).png

关于强缓存和协商缓存可以看我之前的这篇文章


内容分发网络CDN


现在CDN已经是一种很廉价的资源了,各大云服务商都提供了自己的CDN服务,价格也很便宜,CDN通过判断用户的地理位置来选择请求距离最近的一台服务器,来减少资源传输的距离,从而减少响应的时间

CDN的核心在于缓存和回源,CDN服务器会缓存根服务器的资源文件;回源是CDN服务器去向根服务器请求资源的过程,一般发生在资源缓存过期。

静态资源加载速度始终是前端性能的一个非常关键的指标,因为静态资源的请求量一般比较大,而且体积较大,放置到CDN上可以减轻应用服务器的压力,应用服务器就可以专心处理业务而不用分心来响应静态资源。一般放置在CDN上的都是些静态文件,比如图片、样式文件等


懒加载


懒加载可以将不重要的图片文件在需要时加载,优先将网页的整体框架加载出来,当用户需要浏览图片时再去请求。此外可以在用户等待页面加载的过程中使用骨架屏来优化用户的体验,比如掘金的文章详情页就使用了骨架屏

1682513920(1).png


相关文章
|
1月前
|
缓存 搜索推荐 前端开发
《VitePress 简易速速上手小册》第6章 性能优化与 SEO(2024 最新版)
《VitePress 简易速速上手小册》第6章 性能优化与 SEO(2024 最新版)
89 1
|
1月前
|
缓存 前端开发 搜索推荐
博客有点丑,魔改优化来一波🛠️
博客有点丑,魔改优化来一波🛠️
76 1
|
7月前
|
安全 调度 C语言
《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了
《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了
72 0
|
前端开发 API
canvas深入浅出(三)| 小册免费学
所有的内容都是手动绘制还是有点麻烦,好在canvas支持导入图片,createPattern(image, type),该方法接受两个参数。Image 可以是一个 Image 对象的引用,或者另一个 canvas 对象。Type 必须是下面的字符串值之一:repeat,repeat-x,repeat-y 和 no-repeat。
76 0
canvas深入浅出(三)| 小册免费学
|
前端开发 API
canvas深入浅出(二)| 小册免费学
上一节最后我们说了一个绘制曲线的API——arc(那个API并不是专门用来绘制圆形,只是使用曲线可以绘制圆形),他还有一个兄弟——arcTo(x1, y1, x2, y2, r),根据当前描点与给定的控制点1连接的直线,和控制点1与控制点2连接的直线,作为使用指定半径的圆的切线,画出两条切线之间的弧线路径
68 0
canvas深入浅出(二)| 小册免费学
彻底搞懂微信小游戏中的分享功能
作为一个游戏,分享功能是必不可少的,尤其是对于一个微信小游戏来说,其最大的优势就是可以借助微信方便的进行分享。 在微信小游戏制作工具中,与分享有关的积木块并不多,一共就 5 块。
255 0
|
JavaScript 前端开发 Go
前端性能优化(四)| 小册免费学
前面介绍多个前端性能优化的点,现在我们来说一下性能优化的最后一关——页面渲染 浏览器渲染的过程我们之前也稍微提过,这里再说一下解析 HTML 文件,构建 DOM 树,同时浏览器主进程负责下载 CSS 文件
83 0
|
域名解析 缓存 网络协议
前端性能优化(一)| 小册免费学
移动互联网时代,用户对于网页的打开速度要求越来越高。首屏作为直面用户的第一屏,其重要性不言而喻。优化用户体验更是我们前端开发非常需要 focus 的东西之一。
66 0
|
存储 Web App开发 缓存
前端性能优化(三)| 小册免费学
上一讲我们说到了HTTP缓存,这一讲的缓存并不单单指HTTP缓存
78 0
|
XML 前端开发 JavaScript
canvas深入浅出(一)| 小册免费学
canvas是为了解决页面只能显示静态图片而出现的一种可以使用JavaScript绘制的HTML标签,它可以接受两个参数width和height(原来有三个,还有一个moz-opaque控制透明度,已经废弃了)
66 0