前端页面性能优化技巧

391 阅读3分钟

如何判断一个请求的快慢?

我们主要借助浏览器开发者工具来判断:

  1. Request sent:这个是指请求发出的耗时,如果 request body 内容比较多,则这个可能会有点慢。
  2. Waiting:这个是指浏览器等待目标地址返回内容的耗时,前端侧无法进行优化,需要服务端同学协助排查。
  3. Content Download:下载 response 的耗时,如果 response 比较大,则可能会比较慢。 image.png

如何分析网站性能?

我们主要利用浏览器的 Performance 功能,这里有一个小技巧:我们可以先把 body 删除掉,然后点击再点击录制,等页面渲染完后, 就停止录制。这个图可以看出调用栈,即从上面,一直到下面,执行完毕后,再继续右边的函数,直到整个过程完毕。

image.png image.png

如何查看哪些元素有重新渲染?

可以使用 Rendering 里面的 Paint flashing 功能。

image.png

如何查看网站 fps?

可以使用 Rendering 里面的 Frame Rendering Stats 功能。

image.png

网站优化,具体要优化什么?

一般来说,我们都说这个网站的用户体验怎么怎么样,那用户体验是无法量化的,我们可以关注几个比较重要的节点来看一个网站的性能好不好:

  • 有内容出现时
  • DOM ready 事件发生 ---- 这个指标可以在浏览器的 Network 中找到具体的数值,比较好观测。
  • 页面可交互时

如何优化 DNS?

假设我们的页面要用 <script src="https://www.a.com/1.js" /> 这个 js 文件,当我们发起一个 www.a.com 的时候,我们就得经过一个域名转 ip 的 dns 查询,那么我们可以在 head 标签中加入 <link rel="dns-prefetch" href="https://www.a.com"> 表示 DNS预解析

如何复用 HTTP 连接?

通常我们发送 HTTP 请求是这样的:打开 TCP 连接 - 请求 - 响应 - 关闭 TCP 连接。如果又要发一个请求,则又是重复一遍,那在这个过程中,多次开关 TCP 连接是有点浪费的,我们可以使用 Connection: keep-alive 请求头来让服务器在这次请求完毕后,不关闭 tcp 连接,那服务器也需要配合地在响应头中加入这个响应头。那两个请求之间间隔多少,才算可以被复用呢?可以通过另外一个请求头 KeepAlive 来进行设置。(只有同域名才可以复用连接

如果 Connection ID 是一样的,则表示这些 HTTP 请求复用了连接。 image.png

HTTP/1 和 HTTP/2 的报文有什么区别?

1 的报文是基于字符串的,2 的报文是基于二进制的,所以 1 的报文是人类可读的,但是 2 的报文是无法直接看出来信息的。另外 HTTP/2 规定, 所有的请求头都应该是小写。

由于报文格式的变化,HTTP/2 在连接复用的情况下要比 HTTP/1 更好,请求报文中有特殊的标记,所以在一个连接中,可以同时发起多个请求,且将每个响应反应到对应的请求回去。

什么是 CDN?

假设我们是中国的用户,我们想要访问美国服务器的资源,由于地理距离的关系,每次访问都比较耗时,那如果美国服务器把它的资源复制一份,放到中国北京,那中国的用户就可以直接访问北京的这份资源,同理,如果北京仍然距用户比较远,那么就可以再复制放到其他地方,这种内容分发网络,就是 CDN。

虽然不同位置的用户访问的是同一个 url,但在 DNS 解析域名到 IP 的时候,可以返回不同的 IP,所以 CDN 的 url 就可以根据用户的位置,返回就近的服务器 IP。

什么是图片懒加载?

通常是先写这样的图片标签 <img src="placeholder.png" data-src="real.png" />,然后再监听 scroll 事件,找到当前页面中的 img 标签,然后通过 New Image(),监听 onload 方法,再把 img 标签的 src 替换上去,就可以了。