从URL输入到页面渲染发生了什么(包含性能优化)
用户输入URL地址,回车的时候触发
URI解析
erDiagram
URI ||--o{ URL : son
URI }|..|{ URN-ADDRESS : son
URI:统一资源标识符
- URI可以是URL或者URN developer.mozilla.org/zh-CN/docs/…
- URL或者URN不一定是URI
- URL是URI的一种,标识了Web资源,指定操作or获取的方式,还包含了访问协议和位置,developer.mozilla.org/zh-CN/docs/…
- URN是URI的一种,标明了特定的名字标识资源,不包括访问方式, developer.mozilla.org/zh-CN/docs/…
这边给大家举一下例子,比如说 你要看书,于是你去某某图书馆找书,这个图书馆就是URL(包含你怎么去的),URN就类似图书馆的位置 + 书籍ISBN码(不包含怎么去的)
虚构一个URI:
aoteman.io/posts/hello…
http:定义访问方式
- HTTP默认端口 80
- HTTPS 默认端口号 443
- 可以在NetWork-General-Remote Address中查看
aoteman.io/posts/hello.html
定义访问资源路径
#intro
资源
其中各部分所属情况如下
- URL: aoteman.io/posts/hello…
- URN: aoteman.io/posts/hello.html#intro
DNS解析
找到服务器IP, 如果之前解析过,本地可能有缓存
- 递归查询: 用户向本地DNS服务器请求,本地服务器请求域服务器,域服务器向一级请求,一直请求下去,得到结果后,本地服务器告知你
- 迭代查询: 本地服务器像根服务器请求,给出下一级地址,在由本地服务器请求,一直得到结果后,本地服务器告知你
DNS优化:
- 尽量减少DNS请求
- DNS预获取(link rel="dns-prefetch" href="")
- 第三方加速
缓存检查
缓存分为: 强缓存 > 协商缓存
先检查强缓存,
- 有,且未失效,走强缓存
- 如果没有 或者 失效
在检测协商缓存
- 有 则走缓存
- 无 获取最新数据
缓存位置:内存缓存 硬盘缓存
- 内存缓存:浏览器关闭就失效
- 硬盘缓存:直接存进计算机中
例如打开百度用的就是硬盘缓存,匹配对应的缓存,有的话使用,没有的话发起请求;
假如: 文件更新了怎么办?
- 修改版本号 verson
- 可以在存入的时候,放进一个时间戳,如果文件有变动在更新一个时间戳
接下来是说下强缓存: Expires / Cache-control
根据第一次请求资源返回的响应头决定
- Expires:缓存过期时间
- Cache-control:max-age=time,时间内请求,读取缓存信息
- Cache-control > Expries
协商缓存:Last-Modified / ETag
在强缓存失效后,浏览器携带标识发请求,服务器决定是否用缓存,使用协商缓存返回304,之后读取本地缓存
-
Last-Modified: 包含源头服务器认定的资源做出修改的日期及时间,精度比ETag低
-
ETag:资源的特定版本的标识符
TCP(通道)
三次握手,为了双方进行连接
核心思想:既要保证数据可靠传输,又要提高传输效率
-
seq:序号,发起方发起数据时的标记
-
ack:确认序号
-
ACK:确认序号有效
-
RST:重置连接
-
SYN:发起一个连接
-
FIN:释放连接
why?两次 或者 四次?
例如:你和你女朋友对话
1.男:你在吗?
2.女朋友心里想:在(实际上没回复你)
这时候你也接收不到你女朋友说的话
四次的话
1.男:你在吗?
2.女朋友心里想:嗯嗯,行,并确认回复你,嗯嗯,在
3.男:OK,你在吗
4.女朋友:SB,不在!
数据传输
TCP 四次挥手(既时应答机制)
可以设置 connection: keep-alive 设置长连接不进行四次挥手,到页面关闭
-
客户端发起请求
-
服务器收到请求,并回复客户端,已经收到,在准备数据
-
服务器发送数据给客户端,你还有没有要传的
-
客户端:没有了,已经收到数据,可以关闭了
页面渲染
-
浏览器开始解析目标HTML文件,执行流的顺序为自上而下。
-
HTML解析器将HTML结构转换为基础的DOM(文档对象模型),构建DOM树完成后,触发DomContendLoaded事件。
-
CSS解析器将CSS解析为CSSOM(层叠样式表对象模型),一棵仅含有样式信息的树。
-
CSSOM和DOM开始合并构成渲染树,每个节点开始包含具体的样式信息。
-
计算渲染树中个各个节点的位置信息,即布局阶段。
-
将布局后的渲染树显示到界面上。
HTTP1.0,1.1,2.0区别
HTTP1.0和HTTP1.1区别
- 缓存处理: HTTP1.0主要使用Last-Modified,Expires做缓存,HTTP1.1支持:ETag,Catche-Control
- HTTP1.1支持断点续传,返回码206
- HTTP1.1新增了很多错误响应码,如404请求资源和当前状态冲突,410表示永久删除某资源
- HTTP1.1默认开启长连接(如果某个请求超时,后面会被阻塞)
HTTP2.0和HTTP1.x区别
- 多路复用!!!最主要
- 服务器推送(需要主动开启,比如请求index.html,会主动返回包含的css js)
- 健壮性更高
- 二进制格式
性能优化
1.利用缓存
对静态资源实现强缓存和协商缓存
2.DNS优化
分服务器部署,增加HTTP并发性
3.TCP优化
开启长连接
4.数据传输
减少传输体积
内容压缩
服务端开启GZIP压缩(一般压缩60%)
数据量大分批次请求
减少HTTP请求次数
资源文件合并处理
字体图标
雪碧图 CSS-Sprit
图片base64
少用 !important
5.CDN
6.HTTP2.0
7.减少白屏时间
loading
骨架屏
图片懒加载
8.js如果没有操作DOM,可以+上sync or defer
9.css不阻塞渲染 media="print"
10.减少DOM回流
欢迎各路大神斧正