a++浏览器_走进浏览器内部—剖析浏览器是如何工作的(上)

13cc3ead065c26c249e764dc2cd807ad.png

最近工作需要一直在和浏览器打交道。每天都为如何解决那些浏览器间的兼容性而困扰。时间长了自然而然对浏览器也产生了感情。准备学习学习,自己写个浏览器。为此开始学习了 Rust,一门用于写底层,但看上去又像高级语言的语言。希望 Rust 能有美好的明天,我也跟着受益。

想了想,要写浏览器,首先应该了解一下浏览器内部机制。今天先放下代码,带大家一起走进浏览器,看看浏览器是如何将网页呈现给您的。

34095fbbe9d1eb1d21edfccfed91a86e.png

绑定:使用系统级别的 API,将内存中位图绘制到指定窗口(标签对应的网页视图)上。

渲染:解析 html 和 css 生成渲染树,将合并后,将渲染树绘制到屏幕上呈现给用户。

平台:兼容(适配)到不同的操作系统

javascript VM :以后单讲,准备写个demo

f974d79c75a205a5d4185f5f559f964b.png

首先将 HTML 和 CSS 解析为一定的数据结构(渲染对象),然后再将渲染对象按一定规则(就是将 style 树 合并到 dom 树上)形成渲染树,接下来对生成渲染树各个节点进行布局(也就是按 dom 节点的位置信息进行排版),最后读取渲染树,绘制成图片放到屏幕上。

HTML 的解析

80e8185e309745350e58802704b05069.png

首先浏览器是以超强纠错形式来解析 html,即便 html 有错误,浏览器也相对智能地将 html 进行解析,所以说对 html 的解析不是一般简单解析工作,html 解析要相对复杂。在解析过程是可以被 js 或其他原因所中断的。例如网络不畅通,link 和 style 标签加载,相对高级的浏览器为提高效率,提供一定进程进行预解析,也可以加载图这样耗时的工作可以另一个进程中完成

9302138069b9d065e4e8e1cfc120f299.png

Parser 和 Tokenizer 其实只是把无意义的字符流变得有某种意义而已。Parse 这个词其实可以用在很多的地方,比如说只要你能在一个字符流中标识出所有的字符 a,你就在做 Tokenize 和 Parse。你可以看得出,Parse 和 Tokenize 有多难实际是针对编程的人的目的来说的。

一般解析完了这种形式

html|-----head-----body|--- p. wat|        #text---- div---- span---- #textHTMLHtmlElement|-----HTMLHeadElement-----HTMLBodyElement|--- HTMLParagraphElement|      ----Text        ---- HTMLDivElement                ---- HTMLSpanElement                      ---- Text

下面例子只为说明浏览器解析 html 时的纠错能力,html 中错误显而易见,我就不一一指出了。

dc3462e3875f9375b8b80e4d4fdecd33.png
08f7aec2ffdab909ad55f8d01578e49b.png
e165a34a5d80a93b1cedbc33f0c35cbd.png

javascript 是可以介入 html 解析过程中,如下图。

d2f9bd5d170b6d803a3ccef0201d41eb.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值