浏览器工作流程

1. 浏览器内核:

        浏览器内核分为两部分:渲染引擎 JS引擎

        渲染引擎:获取网页的 html,css,图片等计算网页的显示方式,将其输出到显示器

        JS引擎:解析并执行js语言,实现网页的动态效果 

        不同的内核对网页编写语法的解释也有不同,进而导致同一个页面在不同内核的浏览器下显示出来的效果也会有所出入,这也是前端工程师需要让作品兼容各种浏览器的原因。

2. 浏览器架构:

 chromium浏览器的架构

    Chromium多进程架构:

        早期的web浏览器页面会因为行为不当、浏览器错误、浏览器插件错误引起整个浏览器或当前运行的选项卡关闭。因此将chromium应用程序放在相互隔离的独立的进程中:

        · 单个程序崩溃不会损害其他应用程序

        · 不影响操作系统完整性

        · 每个用户不能访问其他用户数据(内存保护、访问控制)

        我们打开Chrome 任务管理器,可以看到系统运行的进程

        浏览器进程(包含UI线程、网络线程、存储线程):控制应用程序的“Chrome”部分,包括地址栏、书签、回退和前进按钮。还处理web浏览器中不可见的特权部分,如网络请求和文件访问。

        GPU(图形处理器)进程:处理与其他进程隔离的GPU任务。因为GPU处理来自多个应用程序的请求并将它们绘制在同一个表面上,所以它被分成不同的过程。

        第三方插件进程:每个插件对应一个进程,当插件运行时创建

        浏览器渲染进程:默认每个标签页创建一个渲染引擎实例。

         V8代理解析:之所以不在浏览器进程中运行,是想减轻开发V8的危险。

        V8是Google的开源高性能JavaScript和WebAssembly引擎,用C++编写,它实现ECMAScript和WebAssembly,可独立运行或嵌入到任何C++应用程序中,如Chrome和Node.js。

3. 页面导航过程

    1 地址栏输入url

        选项卡外部的所有内容都由浏览器进程处理(包含UI线程、网络线程、存储线程等)。在地址栏输入url时,由浏览器进程的UI线程处理。

    2 处理输入

        当用户开始输入地址栏时,UI线程需判断是搜索查询还是URL

        查询:发送到搜索引擎

        URL:请求URL的网站

    3 开始导航


        这里需要了解两个概念:Web Worker 和 Service Worker        

        Web Worker:默默运行在后台的 JavaScript,独立于其他脚本,不影响页面的性能。

        Service Worker:在web worker的基础上增加了离线缓存的能力(大概是这意思,不仅仅只有离线缓存)


        用户点击进入时:

        若有注册设置的Service Worker时则从缓存中加载页面,无需请求网络

        若未设置Service Worker时:(这里涉及到http协议)

            1) UI线程启动网络调用以获取站点内容,选项卡加载转圈

            2) 网络线程通过DNS查找域名对应IP及建立http连接

            3) 网络线程接收处理301重定向头。网络线程与请求重定向的UI线程通信,启动另一个URL请求

    4 读取响应结果

            1) 确定文件MIME类型: 

                网络线程查看流的前几个字节,响应头中Content-Type头确定MIME数据类型

            2) 处理不同MIME文件:  

                响应文件是HTML,则将数据传递给渲染进程。如果为.zip或其他文件则将数据传递给下载管理器。

            3) 安全检查:恶意名单检查 和 跨域读取检查

    5 查找到渲染进程

        所有检查完成后,网络线程告知UI线程数据已准备就绪,UI线程找到渲染进程以继续渲染网页。

        由于网络请求可能需要几百毫秒才能得到响应,为加速此过程,在开始导航网络线程发送url请求时,已经主动进行查找、启动渲染进程,数据接收完成后,渲染进程已备用

    6 提交导航

        数据和渲染进程准备就绪后,浏览器进程和渲染进程进行通信,让渲染进程提交导航。渲染进程确认提交完成,导航完成。文档加载开始。(进程间通信:IPC)

            1)UI更新:地址栏更新、安全指示器、站点设置UI会反映新页面站点信息

            2)选项卡的会话历史记录更新(前进/后退),为便于关闭浏览器后恢复,历史记录到磁盘

    7 初始化load complete

        提交导航后,渲染进程将继续加载资源并呈现页面,一旦渲染进程“完成”(onload事件在所有帧上触发执行完成后)渲染,它就告诉浏览器进程加载完毕。

        浏览器进程的UI线程就会停止选项卡的加载转圈。

4.页面渲染过程

        渲染进程负责选项卡内发生的所有事情。在渲染器进程中又分为如下几个线程:

            1)主线程:处理发送给用户的大部分代码。

            2)工作线程:处理WebWorker或ServiceWorker (应该是处理js代码)

            3)排版线程

            4)栅格线程

    1 解析

        1)构建DOM:上面读取的响应结果如果是html数据,主线程开始解析文本串(HTML),使之成为一个DOM

        2)子资源加载:主线程可以逐个请求CSS,JS,图片等外部资源(预加载扫描器提速)

        3)JavaScript阻塞解析:遇到<script>时,暂停HTML解析,加载解析执行JS代码。因为JS可能会改变Html的结构导致重新排版

    2 确定加载资源方式

        在<script>加async或defer属性,浏览器异步加载和运行JS,不阻止解析。

            1) async:指示浏览器尽可能异步加载脚本,默认同步加载脚本(async=false)

            2) defer:指示脚本要在解析文档之后但在触发DOMContentLoaded之前执行。

    3 样式计算

        主线程解析CSS并确定每个DOM节点的计算样式,再根据CSS选择器将哪种样式应用于哪个元素。

    4 布局

        主线程遍历DOM并计算样式,并创建布局树(layout tree, 包含坐标和边界框大小等信息)

    5 绘制

        知道元素的大小,形状和位置,还需要知道绘制的顺序

        主线程遍历布局树以创建绘制记录,绘制记录是绘画过程的一个注释。

    6 合成

        浏览器知道文档的结构,每个元素的样式,页面的几何形状和绘制顺序,需将信息转换为屏幕上的像素,称为光栅化。

        用户滚动页面,则移动光栅框架,并通过更多光栅填充缺失的部分

        合成是一种将页面的各个部分分层,分别栅格化,并在合成器线程的单独线程中合成为页面的技术。如果发生滚动,图层已经被栅格化需要合成一个新帧。通过移动图层和合成新帧,可以以相同的方式实现动画。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容