DNS查询
与服务器交互是先进行DNS查询,得到服务器的IP地址,浏览器会先查询自己的缓存,之后在查询本地HOSTS,如果依然没有,就会发送DNS服务器发送查询请求,一般会话费大约20ms ~ 120ms. 在这里可优化的策略就是预查询dns-prefetch
,节省这一部分的时间,当用到的时候直接可以拿到对应的IP
<link rel="dns-prefetch" href="https://cdn.bootcss.com">
复制代码
建立HTTP(TCP)连接
得到服务器IP地址之后,首先会进行TCP三次握手,之后在进行SSL握手(HTTPS),SSL握手时会向服务器端确认HTTP的版本
-
HTTP1.0
/HTTP1.1
时代优化- 减少HTTP请求。因为每一个HTTP请求都会发送一次完整的DNS查找,TCP握手,浏览器发送HTTP请求、服务器接收请求、服务器处理请求并返回响应和浏览器就收响应等过程。
keep-alive
。由于TCP的可靠性,每条独立的TCP都会进行3次握手,因此会将消耗大部分时间。所以为了解决这个问题在header中加入了Connection:Keep-Alive
,keep-alive的连接会保持一段时间不断开,后续的请求都会用这一条TCP,但是一个TCP在工作的时候只能处理一个HTTP请求,所以当多个请求时会造成队头阻塞。
-
HTTP2
时代-
多路复用。把每一个请求都当作一个流,那么多个请求就变成多个流,请求响应数据分成多个帧,不同流中的帧交错发给对方。
流的概念实现了一个TCP单连接上可以有多个请求,并且这些请求是并行的,能够解决多个请求造成的队头阻塞问题
-
首部压缩。如果两个请求首部相同,那么会省去这一部分,只需要传输不同的首部字段,进一步减少请求体积。
# nginx 配置http2 server { listen 443 ssl http2; server_name domain.com; } 复制代码
-
使用服务端渲染
以Vue的SSR和SPA为例
-
客户端渲染(SPA)
- 访问客户端渲染的网站
- 服务器返回一个包含引入资源的语句和
<div id="#app"></div>
的HTML文件 - 当必要的资源加载完毕之后执行
new Vue()
开始实例化并渲染页面
好处:
- 前后端分离
- 用户体验好
- 减轻服务端渲染压力
缺点:
- 不利于SEO搜索引擎优化
- 请求次数多,响应慢
- 首屏加载较慢
-
服务器端渲染(SSR)
- 访问服务端渲染的网站
- 服务器直接返回HTML页面,立即可以渲染页面
- 当必要资源加载完毕之后开始执行
new Vue()
开始实例化并接管页面
好处:
- 只需要一次请求
- 更好的SEO
缺点:
- 占用服务器资源
- 不利于前后端分离,开发效率较低
缓存
缓存的意义在于减少请求,更多的使用本地资源,给用户更好体验的同时,也减轻服务器压力。最佳实践是尽可能的使用强缓存,同时当文件更改的时候让客户端的缓存失效。
缓存分为两类:都是通过Headers来控制,强缓存的优先级大于协商缓存
- 强缓存
- 服务器通知浏览器一个缓存时间,在缓存时间内,浏览器请求直接使用缓存,而不是直接请求
- 强缓存根据请求头的
Expires
和Cache-Control
来控制
- 协商缓存
- 一般是在强缓存过期的时候,向服务器发送确认是否需要更新本地缓存,如果不需要更新则返回304,否则会返回整个文件
图片来源:前端缓存总结-HTTP缓存
静态资源使用CDN
CDN是一组分布在多个不同地理位置的Web服务器,服务器越近速度越快,当用户访问时,会从最近的CDN服务器拿,这样的好处是可以分散主服务器的压力,同时带来访问速度的提升和增强稳定性。
文件压缩
合理的文件资源压缩可以有效的减少传输体积,减少返回时间,提高用户体验。
得益于Webpack
和Node
的发展
HTML
的压缩:HtmlWebpackPlugin
CSS
的压缩:MiniCssExtractPlugin
HTML
的压缩:HtmlWebpackPlugin
在请求中使用Gzip
压缩,可以通过向HTTP
请求头中的Accept-Encoding
头中添加Gzip
标识开启这一功能,当然也需要nginx
配置开启
Nginx
开启方式可以参考juejin.cn/post/684490…
代码层
1. 将CSS放在文件头部,Javascript文件放到底部
所有放到head
中的CSS
和JS
都会阻塞渲染,但是CSS
不会阻塞DOM
解析
如果需要将JS
放在投资部, 则需要在script
标签中加上defer
属性就可以了,异步下载,延迟执行。
2. 图标
使用字体图标iconfont
代替图片链接
3. 图片优化
-
图片压缩
-
工具压缩
-
webpack
压缩工程化的项目可以在
webpack
里面配置image-webpack-loader
进行图片压缩
-
-
使用图片精灵
-
使用字体图图标库
-
使用
base64
格式 -
使用
css
替代图片 -
使用
CDN
图片 -
图片懒加载
-
响应式图片加载—–媒体查询
-
渐进式图片
-
使用
webp
格式图片,使用之前需要查看下浏览器是否支持