美文网首页
解析浏览器打开网页过程

解析浏览器打开网页过程

作者: 小陈wx | 来源:发表于2022-05-17 14:46 被阅读0次

    浏览器是什么,浏览器是用户用来查看网页的软件程序,它是由多个进程构成,那么什么是进程?什么又是线程呢?

    进程与线程科学定义:

    • 进程 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)
    • 线程 线程是cpu是调度的最小单位 (线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)

    总的来说软件服务好比一座工厂,进程好比一个加工车间,而线程则是加工车间中的一条流水线,多条线程构成一个进程,多个进程构成一个软件服务,

    以chorme浏览器为例,他分为Browser主进程,GPU进程,第三方插件进程、浏览器渲染进程。其中我们前端开发
    人员最需要关注的是它的浏览器渲染进程,该进程主要由下列几个线程构成:

    1.JS引擎线程;2.GUI渲染线程;3.事件触发线程;4.定时器触发线程;5,异步请求线程;

    通常我们说JS是单线程运行的,是因为JS程序的可执行代码在JS引擎线程中执行,其中的异步任务会丢到其他的线程中执行,待拿到返回结果,再通知JS引擎线程运行其回调。需要注意的一点是GUI渲染进程和JS引擎互斥,一个运行另一个就需要挂起,他们中的一方要是运行的时间过长,则会引起程序的卡顿。

    64bf928efc59f98184b77df2b6c15eba.png

    打开网页的全过程:

    1.在地址栏中输入URL;
    2.对输入的URL进行DNS解析,获取目标服务器IP地址,优先浏览器DNS缓存查询>本地host文件查询,如没有则进行递归或迭代查询,本地区的域名服务器>根DNS域名服务器>顶级域名服务器>依次向下>>>;
    3.像目标IP发送http请求;
    4.建立tcp链接;
    5.接受返回数据,(http1.1长链接,默认不会断开tcp握手)
    6.浏览器渲染线程解析html文件,方向由上至下;
    7. 解析HTML文件标签对并渲染,具体规则如下:
    • 1.解析到DOM(文档对象模型 Document Object Model)标签,置入DOM树,HTML标签对以栈的形式解析,解析到标签头先入栈并构成一个DOM节点,解析到该标签尾,则需要判断当前栈顶是不是该标签头,是则认为解析完毕出栈。因为HTML标签是成对出现的且标签对之间无法穿插只能是包含关系,所以以这种形式解析dom节点的话,必然会将其子节点全部解析完成才开始进行其兄弟节点的解析;
    • 2.解析到CSS标签(link),首先将CSS文件下载完毕,然后进行解析生成CSSOM(层叠样式表对象模型 Cascading Style Sheets Object Model)CSSOM和DOM是完全独立的数据模型 ,因此它们是彼此分开解析的 。 但是它们都具有相似的树结构 ,并且具有相同的目的:为浏览器提供一种结构,以呈现和标识页面上的不同元素。注意下载和解析CSS文件都会阻止页面渲染,从而阻塞JS运行,这是因为DOM 和 CSSOM 要最终合并成为 render tree 用于页面渲染,其中一项未解析完毕则无法正常渲染,而页面渲染和JS代码运行互斥,所以也阻塞JS运行。
    • 3.合成render tree,利用以获得的DOM 和 CSSOM 合成render tree,其中包含完整的界面展示信息。
    • 4.生成Layout布局阶段,生成盒模型,确定各节点大小位置层级等;
    • 5.进行painting绘制阶段,将各节点绘制到界面上(类似片元着色器)
    • 6.解析到JS标签,将JS文件下载完毕然后执行,此过程阻塞DOM解析和CSS解析,因为JS代码种可能对DOM和样式有操作,避免引起冲突。
    注意上述解析规则并不是等待所有数据全部返回才开始解析,而是当它接收到可解析数据就会开始解析。


    CSS解析与JS代码执行都会阻塞渲染,他们阻塞关系如下:

    CSS阻塞渲染规律:

    1.CSS加载和解析不会阻塞DOM TREE构建,他们是两个并行的线程在处理;
    2.CSS加载和解析会阻塞RENDER TREE合成,因为CSSOM是构成渲染树的一部分;
    3.CSS加载和解析阻塞JS代码执行,因为JS代码与渲染互斥,可能有DOM操作或者样式操作上的冲突;

    JS阻塞渲染规律:

    1.JS加载和运行阻塞DOM TREE和RENDER TREE的构建;
    2.JS执行需等待CSSOM构建完成;
    3.上述2点可以理解为GUI线程与JS引擎线程互斥,在浏览器解析HTML文件并渲染的过程里,只有执行js代码交由JS主线程处理(异步任务除外),其他过程有GUI线程处理。

    总结:日常盗图


    51c3660d3f67948d4ec8279baad97d96.png

    相关文章

      网友评论

          本文标题:解析浏览器打开网页过程

          本文链接:https://www.haomeiwen.com/subject/qxbhurtx.html