在输入URL后,前端浏览器的工作流程

news2024/11/15 20:01:15

这是一个经久不衰的面试题,整理一下。

浏览器

浏览器是一个多进程的架构。

主进程:主要适用于界面的显示,用户的交互,子进程管理。

渲染进程:将HTML,css,JS转换成页面,V8引擎以及排版用的Blink引擎都是在渲染进程中。

GPU进程:绘制UI界面。

网络进程:负责网络资源的加载。

插件进程等......进程之间的通信是通过ipc来通信。


主进程中:在输入一个网址后,开始处理输入信息,开始导航,进入网络进程浏览器访问的应该是IP地址,那么首先会输入的域名转换为ip 地址。

 DNS域名解析:

有很多网页都跟着.com .cn等,因为都隶属于这些域名来管理,而这些.com 是由.来进行划分和管理的,最后都是由根统一管理的,但也没有必要写.root来表示,以下就是域名结构树。

04225fd8f771448190909b27176f96a6.png

 这个根是由一群服务器组成的,称为根域名服务器,在它的下面,包括.com .cn等,称为顶级域名服务器,它们会管理各自的域名服务器,比如bilibili,QQ等,它们称作权威域名服务器,然后管理各自的主机。

所以在输入网址后,浏览器先查看缓存中是否含有对应的ip 记录,同时查看主机本地文件里是否有文件记录,如果有记录那么就不用解析了,如果没有,浏览器进行域名解析,向DNS服务器发送请求,需要调用解析器,通过域名获取ip地址。

请求和响应

通过DNS解析以后,获取到了相应的站点,会通过safeBrowsing来检查站点是否是恶意站点,如果是则展示为恶意站点,会阻止访问。

计算机网络模型有7层的osi模型,还有5层以及TCP/IP的4层的模型,浏览器通过http协议发送请求,那么首先在应用层利用DNS服务器解析域名,获得ip地址,通过http或者https封装,包括请求头等信息。

接下来数据来到传输层:再次将上层内容封装,封装为TCP/UDP报文;

网络层:再次进行封装为IP报文;

数据链路层:将IP报文进行分组形成帧;

物理层:帧封装成0/1信号,就是bit单位,再进行传输;

然后就是网线传输

到了服务端其实就是一套逆行:bit->帧->IP报文,之后服务器再进行响应,流程与发送请求类似。

到了浏览器,获取到了返回的数据,则开始渲染页面。

一切准备就绪后,网络进程会告知UI进程,UI进程会开启一个渲染器进程来渲染页面,浏览器进程通过IPC管道将数据传递给渲染器进程。

渲染进程

一般请求获取到的数据都是HTML文件,相当于网页的框架结构,不过一开始获取到的是字节形式的HTML文件,通过解析转化得到字符代码,然后再到tokens符号标签,最后变为节点对象,讲这些节点对象连在一起形成文本对象模型,也就是dom,dom就是浏览器自己的语言,每个节点对象项连,形成父子关系。

与此同时css样式会以link标签的形式引入,在渲染HTML文件的过程中,遇到link标签,会向服务器请求css文件,具体解析与HTML相同,最后节点会结合为css对象模型,也就是cssom,dom和cssom都已经有了,基本也就完成了,两者结合就是渲染树,渲染树的任务就是匹配dom和cssom的节点,并且捕获可见内容。

在渲染树构造完成之后,页面也是不能被马上渲染的,还需要获取渲染树的结构,节点位置和大小来进行布局,是根据盒子模型来进行,每个元素都用一个盒子来表示,然后这些盒子在页面上进行排列和嵌套,生成layout-tree,在布局以后,浏览器就可以安排页面的绘制了,为了保证展示正确的层级,渲染进程的主线程会遍历layout-tree,创建一个绘制记录表,该表记录了绘制的顺序(z-index),然后渲染进程的主线程将数据传递给合成器线程,合成器线程将每个图层栅格化,由于一层可能像页面的整个长度一样大,因此合成器线程会将他们切分为很多图块,然后将每个图块发送给栅格化线程,栅格化线程栅格化每个图块,并将他们存储在GPU内存中,当栅格化完成后,合成器线程将收集称为"draw quads"的图块信息,信息中记录了图块在内存的位置,以及在页面需要绘制的位置,根据这些信息,合成器线程生成了一个合成器帧,通过IPC进程传递给浏览器进程,接着浏览器进程将合成器帧传入GPU,然后GPU渲染展示到屏幕上,当滚动滚轮,都会生成一个新的合成器帧,新的帧再传给GPU,再次渲染到屏幕上,这样就以像素的形式绘制在页面,页面就呈现出来了,当我们改变一个元素的尺寸位置属性时,会重新进行样式计算,布局绘制以及后面的流程,这种行为叫做重排(回流),如果改变了元素的颜色,不会重新触发布局,但还是会触发样式计算和绘制,这个就是重绘

但是在实际情况中,我们还会遇到script标签,还会向服务器请求js文件,如果先返回并解析完成js文件是会发生堵塞的,所以必须等到Cssom构建完成后才执行js文件,而且js可以改变css样式。cssom构建就是渲染中一个重要的阻塞原因,其实dom也会,但是dom可以部分解析,cssom不可以。cssom的构建和js文件的请求和解析是可以同时进行的,等cssom结束构建后,就可以执行js文件。

js会阻塞HTML的解析,因为js既可以操作dom,又可以操作cssom,如果不等js下载解析执行完以后再构建dom,页面有些内容会可能会出现了又消失,所以不管是行内js代码还是外部js代码,都会让HTML的解析停止下来,虽然dom可以部分解析,但对于网页来说,就相当于阻塞了第一次的渲染,js执行完之前,页面什么都没有,执行完以后就都正常了,形成渲染树,进行布局,绘制等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redisson 随笔 0-入门

0. 虽说时运不佳,仍欲提桶跑路 分布式锁的常见实现方案 常用锁的用例 runoob Lua教程 对于分布式锁的实现方案,本文如标题所言,简单梳理了redisson的实现方案 redisson 也是基于redis的多个命令组合来实现的,为保证执行多个命…

项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍 项目总结 1.按下空格键小鸟上升,不按小鸟下落 2.搭建小鸟需要穿过的管道 3.管道自动左移和创建 4.小鸟撞到管道游戏结束 知识储备 1.C语言 2.数据结构-链表 3.Ncurses库 4.信号机制 二、Ncurses库介绍 Ncurses是最早的System V Release 4.0 (…

F. Editorial for Two(二分答案+反悔贪心)

F. Editorial for Two(二分答案反悔贪心) F. Editorial for Two 1、问题 给定一个 n n n和 k k k,以及一个长度为 n n n数组。现在从 n n n个数中,挑出 k k k个数,称作个子序列。然后将这个子序列分成两部分&#x…

干翻Mybatis源码系列之第八篇:Mybatis二级缓存的创建和存储

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…

C++之---树/数据结构

一、树 什么是树? 1.1 树(Tree)是n(n>0)个结点的有限集。n0时称为空树。在任意一棵非空树中: (1) 有且仅有一个特定的称为根(Root)的结点; &am…

CodeForces..最新行动.[中等].[遍历].[判断]

题目描述: 题目解读: "最近操作"字段会显示最近操作的n个文件。 最初有编号文件1,2,... n在"最近操作"字段,还有其他无限多个文件不在。 当某个文件pi发生操作时: 如果它位于“最近…

小红书账号矩阵优化软件

小红书账号矩阵优化软件 大家有关注过品牌在⼩红书上的打法有哪些吗? #品牌营销#小红书运营#爆文拆解#品牌投放#爆品打造 我们如果确定了我们要去做小红书,那我到底该怎么去做?现在小红书对我们目前这些品牌来说,你们是作为把它…

Allegro16.6详细教程(二)

R.3-D Viewer 3-D Viewer,可以直接在allegro中看到board file的3-D顯示效果。3-D Viewer對於PCB Editor Products,只有環境變數中的OpenGL顯示功能開啟後才有效,而對於APD/SiP是無效的。 2.3-D viewer是在一個獨立的視窗中打開的。3-D environment環境支援多種顯示內容的過…

Spring Cloud Alibaba - Nacos源码分析(二)

目录 一、Nacos服务端服务注册 1、服务端调用接口 2、服务注册 instanceServiceV2.registerInstance EphemeralClientOperationServiceImpl.registerInstance ServiceManager clientManager Client实例AbstractClient ClientOperationEvent.ClientRegisterServiceEven…

2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛圆满举行!

2023年5月27-28日,由腾扬广告、Channel[V]、盛娱星汇联合主办的2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛在广州番禺天河城正式打响,自广州赛区赛事启动以来,汇集了近五千名音乐人参与其中,历经2个多月、超40场…

【数据库复习】第七章 数据库设计

数据库设计的过程(六个阶段) ⒈需求分析阶段 准确了解与分析用户需求(包括数据与处理) 最困难、最耗费时间的一步 ⒉概念结构设计阶段 整个数据库设计的关键 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型 ⒊…

基于微信小程序蛋糕店商城管理系统的设计与实现

1:后端采用技术 SpringBoot 、Mybatis、Mybatis-plus、Redis、阿里云短信息服务、Hutool 邮箱服务、WebSocket通讯服务、OSS对象存储服务、支付宝沙箱服务,接口简单限流、简单定时任务。。。。。。 2:前端采用技术 Vue2、Vue2-uploader组件、…

[图表]pyecharts模块-日历图

[图表]pyecharts模块-日历图 先来看代码: import random import datetimeimport pyecharts.options as opts from pyecharts.charts import Calendarbegin datetime.date(2017, 1, 1) end datetime.date(2017, 12, 31) data [[str(begin datetime.timedelta(d…

Leetcode 110-平衡二叉树

1. 递归法求解 递归三部曲: 确定递归函数的参数及其返回值确定终止条件确定单层递归逻辑 深度:从上往下 高度:从下往上 1.1 根据深度求解 构建求二叉树节点深度的函数(后序遍历)递归求该树是否是平衡二叉树&#…

国产化麒麟linux系统开发编译常见问题汇总

团队自研股票软件关注威信龚总号:QStockView,下载 1 问题处理 1.1 Unknown module in QT:QJsonDocument 缺少QJsonDocument 解决方法: Pro文件中加上 QTcore; 播放器库问题 1.2 代码中汉字乱码需要设置文件编码格式 原因分析&…

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline? 答案2023-06-03: Redis客户端执行一条命令通常包括以下四个阶段: 1.发送命令:客户端将要执行的命令发送到Redis服务器。 2.命令排队&#…

内网安全:Cobalt Strike 工具 渗透多层内网主机.(正向 || 反向)

内网安全:Cobalt Strike 工具 渗透多层内网主机. Cobalt Strike 是一款以 metasploit 为基础的 GUI 的框架式渗透工具,又被业界人称为 CS。拥有多种协议主机上线方式,集成了端口转发,服务扫描,自动化溢出,…

Docker容器化Java程序

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Docker容器化Java程序 Docker:用于创建和管理容器的开源平台 Java运行环境:Java是一个跨平台的编程语言,因此在CentOS系统中需要安…

一个帮助写autoprefixer配置的网站

前端需要用到postcss的工具,用到一个插件叫autoprefixer,这个插件能够给css属性加上前缀,进行一些兼容的工作。 如何安装之类的问题在csdn上搜一下都能找到(注意,vite是包含postcss的,不用在项目中安装pos…

[图表]pyecharts模块-柱状图2

[图表]pyecharts模块-柱状图2 先来看代码&#xff1a; from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Fakerx Faker.dogs Faker.animal xlen len(x) y [] for idx, item in enumerate(x):if idx < xlen / 2:y…