猫史档案馆


【疯癫】浏览器渲染原理

用户:AlanTuringAlanTuring查看:1 回复:4 评论:1 创建时间:2020-09-20T18:10:41


在浏览器地址栏中输入网址,到看到整个页面,中间都发生了哪些事情?

主要分为3个阶段。

1.HTTP请求阶段

2.HTTP相应阶段

3.浏览器渲染阶段

 

扫盲部分

 

进程(Process):打开一个程序就相当于开启了一个进程。

线程(Thread):在一个程序中,同时要做好多事情,就是线程。

【注解】:进程与线程。比方说AB二人各开了一个饭店,饭店A和饭店B。这叫做开启了一个进程。假设只有一个服务员,只能同时干一件事,这叫单线程,多聘几个服务员,可以同时干多个事,叫做多线程。

栈内存(Stack):栈内存用来提供环境,用来执行代码。

有些进程不只干一件事,要同时干许多事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”成为线程。

 

渲染原理

 

两个端:客户端(浏览器)和服务器端(web服务器)。

在客户端输入网址后,浏览器会帮我们向服务器发送一个请求。这里面只是发一个请求,叫做Request请求阶段。(细学要学会DNS解析、T喵协议的三次握手和四次挥手、HTTP和HTTPS的区别。)

服务器接受请求后,向客户端返回网站的源代码,这个阶段被称为Response响应阶段。(细学要学会HTTP状态码、304缓存、HTTP报文。)

拿到代码后,浏览器在内存条中开辟出一块栈内存,用来给代码的执行提供环境。

【注解】:浏览器不能直接处理代码,比方说人类生存需要地球,需要一个环境,浏览器在栈上开辟的内存,就是环境。

但是只有环境不行,还学要有人去执行。所以,浏览器同时分配一个主线程去一行行地解析和执行代码。

代码进栈执行(一般情况下,第一行代码都是<!DOCTYPE html>),执行完代码出栈。第二行代码再进栈,再执行,再出栈。第三行代码……

如果遇到link代码(如<link href="style.css">)就会有两种情况(一般都是第二种情况):

1.线程去服务器加载资源文件。

2.开辟新进程去加载资源文件,主线程继续执行。

【注解】:比如A是解析代码的人,去服务器加载资源文件时,就不能继续解析剩余代码了。这时候A可以找他的朋友去帮忙。

浏览器会开辟一段新的内存空间。叫做TASK QUEUE任务队列。用来记载去请喵文件的线程(如任务1:请求style.css;任务2:请求JavaScript.js。)。

将所有代码解析完之后,css代码可能已经加载完了,也可能没加载完,那么,第一次渲染,只把页面中的H喵L标签,DOM结构渲染完了。

 

=》第一次自上而下走完,只生成DOM树,这是第一个环节,叫做DOM树渲染(因为只渲染了DOM树)。

然后浏览器会去TASK QUEUE任务队列中查看哪个任务完成了,将这个任务拿回来执行。这个机制叫做Event Loop事件循环。

 

【注解】事件循环就是DOM不断地让主任务队列去任务队列执行代码,直到任务队列全部执行完毕。

事件循环分为微任务和宏任务,微任务优先于宏任务执行,这里不做细讲。

 

=》CSS处理完成生成CSSOM。

 

=》然后浏览器会把DOM树和CSSOM结合在一起,生成Render Tree渲染树。

 

最后将渲染树(像素)发送给喵U,显示在页面上。

在这中间,还有两个小过程,见“最后总结”。

 

最后总结

 

1.解析H喵L,生成DOM树,解析CSS,生成CSSOM树。

2.将DOM树和CSSOM树结合,生成渲染树(Render Tree)。

3.回流(Layout):根据生成的渲染树,计算它们在设备视口(viewport)内的确切位置和大小,这个计算的阶段就是回流。

4.重绘(Painting):根据渲染树以及回流得到的几何信息,得到节点的绝对像素。

5.Display:将像素(渲染树)发送给喵U,再显示在浏览器页面上。


回复

上一页1 页 / 共 1下一页
zzy2357zzy2357

👍

点赞0


评论


code工作室code工作室

T喵=tcp

点赞0


评论


DioSand_5006DioSand_5006

d'd

点赞0


评论


kittenteakittentea

emotion_编程猫_点赞

点赞0


评论