浏览器原理和实践——基于华为云conosle性能

掘金链接

1. Chrome 浏览器的进程机制

1.1 为什么选择chrome 浏览器?

  1. 因为 Chrome、微软的 Edge 以及国内的大部分主流浏览器,都是基于Chromium 二次开发而来
  2. Chrome 是 Google 的官方发行版,特性和 Chromium 基本一样,只存在一些产品层面差异
  3. Chrome 是目前世界上使用率最高的浏览器,所以 Chrome 最具代表性

1.2 Chrome 打开一个页面需要启动多少个进程?

  1. 网络进程 — 网络请求相关
  2. 浏览器进程 — 浏览器主进程(协调、主控)
  3. GPU 进程 — 3D绘制
  4. 渲染进程 — 页面渲染,脚本执行,事件处理(每个tab页面一个)如果打开的页面有运行插件的话,还需要再加上插件进程

image.png

2. 单进程浏览器时代

单进程浏览器 —— 浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JavaScript 运行环境、渲染引擎和页面等

缺陷和问题:

  • 不稳定 —— 插件不稳定易导致整个浏览器崩溃;复杂的 javascript 代码引起渲染引擎崩溃;
  • 不流畅 —— 各个模块运行在同一进程,意味着同一时刻只有一个模块可以执行;
  • 不安全 —— 插件可以使用 C/C++ 等代码编写,通过插件可以获取到操作系统的任意资源,当你在页面运行一个插件时也就意味着这个插件能完全操作你的电脑。如果是个恶意插件,那么它就可以释放病毒、窃取你的账号密码,引安全性问题
    典型场景:
    当你正在用浏览器打开多个页面时,突然某个页面崩溃了或者失去响应,随之而来的是整个浏览器的崩溃或者无响应,然后你发现你给老板写的邮件页面也随之消失了,这时你的心情会不会和页面一样崩溃呢?

3. 多进程浏览器时代 —— 早期

Chrome 的页面是运行在单独的渲染进程中的,同时页面里的插件也是运行在单独的插件进程之中,而进程之间是通过 IPC 机制进行通信(如图中虚线部分)。

缺陷和问题的解决:

  • 解决不稳定问题 —— 页面和插件进程独立,互不影响
  • 解决不流畅问题 —— 只对当前页面渲染阻塞;
  • 解决不安全问题 —— Chrome 把插件进程和渲染进程锁在沙箱里面, 这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限。

问题:当你从浏览器输入URL到页面呈现的过程中,到底发生了什么?

image.png

image.png

image.png

1. 浏览器渲染流程 —— DOM树构建

为什么构建DOM树?这是因为浏览器无法直接理解和使用 HTML,所以需要将 HTML 转换为浏览器能够理解的结构——DOM 树。构建 DOM 树的输入内容是一个非常简单的HTML 文件,然后经由 HTML 解析器解析,最终输出树状结构的 DOM。

image.png

2. 浏览器渲染流程 —— 样式计算

目的:计算DOM节点中的每个元素的具体样式

  1. 把 CSS 转换为浏览器能够理解的结
  2. 转换样式表中的属性值,使其标准化
  3. 计算出 DOM 树中每个节点的具体样式

3. 浏览器渲染流程 —— 布局阶段

布局:DOM 树和 DOM 树中元素的样式还不足以显示页面,我们还需知道 DOM 元素的几何位置信息。我们把这个计算过程叫做布局。

image.png

4. 浏览器渲染流程 —— 分层

分层:页面中的复杂效果如一些复杂的 3D 变换、页面滚动等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树。

image.png

5. 浏览器渲染流程 —— 生成图层绘制列表

绘制列表:

  1. 渲染引擎会把一个图层的绘制拆分成很多小的绘制指令,然后再把这些指令按照顺序组成一个待绘制列表
  2. 绘制列表中的指令其实让其执行一个简单的绘制操作,比如绘制粉色矩形或者黑色的线等

image.png

6. 浏览器渲染流程 —— 栅格化操作

栅格化操作:图层的绘制列表准备 → 主线程将绘制列表提交合成线程 → 合成线程将图层分为图块(tiles) →
栅格化 (将图块转换为位图) → GPU栅格化 (栅格化操作使用GPU,涉及到跨进程操作)

7. 浏览器渲染流程 —— 合成与渲染

合成与显示:所有图片栅格化 → 合成线程生成绘制图快命令(DrawQuad) → viz组件接受命令,将内容绘制在内存中 → 屏幕显示

问题:当你从初次进入产品页面,为什么会有 1-2 秒的白屏时间?

优化方向:

  1. 静态资源请求数量 —— 合并脚本,样式表
  2. 请求带宽 —— 移除重复脚本(tree shaking); 代码切割 (code spliting)
  3. 缓存利用 —— 添加Expires头,配置Etag
  4. 页面结构 —— 将样式表放在顶部,将脚本放在底部
  5. 代码层面 —— 执行脚本函数过程,页面阻塞;闭包导致内存泄漏等
    image.png
新内容: 更新咯,这回的主题就是“更新”。自动更新Chromium 只在启动引导器时检测Chromium更新情况,并不实时监控。 (当然也可以做成实时的,但我的老爷机不希望多个进程...) 如果你要用新的引导器,建议把老的“Config.ini”删掉 [Chromium] Latest=21165 Chromium版本,由于NSIS无法获取其它版本信息(或许是我不知道),所以只能自己设置或更新一下。 自动更新=1 更新开关。更新只针对Chromium,用Chrome推荐用旧版本。 更新间隔=100 更新版本间隔,默认100:如果你是21165,更新到21266时就会提醒你,大概也就是一天的更新量吧 如图,如果有更新。启动时,会提醒你。 点“是”后。会转入后台下载Chromium,中途不会有任何提示。直到下载完成。 下载完成后,会出现如上图的提示。点确定,便结束掉当前Chromium进程。更新完后,再自动打开Chromium。 支持参数传递,可以直接对引导器加参数,会传递给chrome.exe 跟以前我的"Chrome Portable.exe"一样,都是用NSIS编译的,只是将默认的命令行直观化了。望高手勿拍 把它随便放在哪,只要保证同目录下 或 同目录的子目录下有"chrome.exe"就行。 运行后,就会产生设置文件“Config.ini” 里面文本具体如下(0表示关闭,1表示开启) [Chromium] 语言=zh-CN 更改语言,只要和Locales文件夹下的语言文件名相同即可 隐身模式=0       开启chrome既是隐身模式 禁用Java=0 禁用网页上的Java程序 禁用Image=0   网页上没图片... 禁用Plugin=0         禁用插件,也不会提示你安装插件 禁用Extension=0   禁用扩展 禁用UserScript=0   禁用自己使用的脚本 禁用JavaScript=0   禁用网页上的JavaScript 代理服务器配置=  例如你用的无jie...等号后面加上127.0.0.1:9666即可 用户配置文件夹=Profile   用户配置文件夹名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值