浏览器架构演进
- 单进程架构:所有模块运行在同一个进程里,包含网络、插件、JavaScript运行环境等
- 2.多进程架构:主进程、网络进程、渲染进程、GPU进程、插件进程
3.面向服务架构:将原来的UI、数据库、文件、设备、网络等,作为一个独立的基础服务
进程描述 浏览器(主进程) 主要负责页面展示逻辑,用户交互,子进程管理;包括地址栏、书签、前进、后退、收藏夹等 GPU进程 负责UI绘制,包含整个浏览器全部UI 网络进程 网络服务进程,负责网络资源加载 标签页(渲染进程) 控制tab内的所有内容,将Html、Css和JavaScript转换为用户可交互的网页 插件进程 控制网站运行的插件,比如flash、ModHeader等 其他进程 如上图所示:适用程序Storage/Network/Audio Service 等 常见浏览器内核 内核 浏览器 补充说明 Trident IE4-11 JScript,Chakra 出生于1994年,IE8以前使用JScript引擎,IE9开始使用Chakra引擎 Gecko Firefox SpiderMonkey Gecko内核主要用在Firefox浏览器上,同时是一个跨平台的内核,支持在Windows、BSD、Linux、Mac oS ×中使用 Safari、Chrome. webkit JavaScriptCore 由Apple公司技术团队开发,并在2005年开源 Android浏览器 Google基于Webkit开发的内核 在Webkit的基础上加入多进程,沙箱等 Blink Chrome,Opera V8 技术,于2013年开源 2015年由微软发布,用于Edge浏览器上,由于性能较差,运行不稳定等 Edge Chakra 原因,2018年微软将Edge浏览器内核迁移到Chromium Trident+Web 国产浏览器QQ、360、搜 都有都有 早期银行系统都是在IE上进行开发,想要支持银行系统就切换到Trident内 kit(Blink) 狗、UC等 核,想要体验就切到Webkit内核 渲染进程-多线程架构 内部是多线程实现,主要负责页面渲染,脚本执行,事件处理,网络请求等
线程 功能 负责解析js脚本,运行js程序,每个渲染进程下面只有一个js引擎线 JS引擎 程。与GUI渲染线程互斥,如果js任务执行事件过长,会导致页面卡顿 负责渲染浏览器界面,解析html、css,构建dom树和render树、布 GUI渲染 局、绘制,和js引擎线程互斥,GUI更新会在js引擎空闲时立即执行 定时器所在线程,setTimeout、setInterval计时完毕后,将回调添 定时器触发 加到事件队列,等待js引擎执行 在XHR、Fetch等发起请求后新开一个网络线程请求,如果设置了回 网络线程 调函数,在状态变更时,将回调放入事件队列,等待js引擎执行 事件触发
由宿主环境提供,用于控制事件循环,不断地从事件队列里取出任务执行
JS引擎VS渲染引擎
1.解析执行JS
2. XML解析生成渲染树,显示在屏幕
3.桥接方式通信
渲染进程-多线程工作流程
1.网络线程负责加载网页资源2.JS引擎解析JS脚本并且执行
3. JS解析引擎空闲时,渲染线程立即工作
4.用户交互、定时器操作等产生回调函数
放入任务队列中
5.事件线程进行事件循环,将队列里的任
务取出交给JS引擎执行
Chrome运行原理-读取响应
1.网络线程接收到HTTP响应后,先检查
响应头的媒体类型(MIME Type)
2.如果响应主体是一个HTML文件,浏览
器将内容交给渲染进程处理
3.如果拿到的是其他类型文件,比如Zip、
exe等,则交给下载管理器处理
Chrome运行原理-寻找渲染进程 1.网络线程做完所有检查后,会告知主进 程数据已准备完毕,主进程确认后为这个站点寻找一个渲染进程 2.主进程通过lIPC消息告知渲染进程去处 理本次导航 3.渲染进程开始接收数据并告知主进程自 己已开始处理,导航结束,进入文档加载阶段
渲染进程-构建渲染树 1.构建DOM树,将HTML文本转化成 浏览器能够理解的结构 2.构建cSSOM树,浏览器同样不认识 css,需要将CSS代码转化为可理解的CSSOM 3.构建渲染树,渲染树是DOM树和 cSSOM树的结合
渲染进程-页面布局 1.根据渲染树计算每个节点的位置和 大小 2.在浏览器页面区域绘制元素边框 3.遍历渲染树,将元素以盒模型的形 式写入文档流
渲染进程-页面绘制 1.构建图层:为特定的节点生成专用图 层 2.绘制图层:一个图层分成很多绘制指 令,然后将这些指令按顺序组成一个绘制列表,交给合成线程 3.合成线程接收指令生成图块 4.栅格线程将图块进行栅格化 5.展示在屏幕上
前端性能performance 1.时间都花在哪 2.什么情况下卡顿
首屏优化 1.压缩、分包、删除无用代码 2.静态资源分离 3.JS脚本非阻塞加载 4.缓存策略 5. SSR 6.预置loading、骨架屏
渲染优化
- GPU加速 2.减少回流、重绘 3.离屏渲染 4.懒加载
为什么需要跨端 1.开发成本、效率 2.一致性体验 3.前端开发生态