读书笔记——WebKit技术内幕 资源加载和网络栈

使用网络栈来下载网页和网页中的资源是渲染引擎工作过程的第一步。HTML支持的资源主要包括以下类型:HTML页面包括各式各样的HTML元素;JavaScript代码可以内嵌在HTML文件中,也可以单独的文件存在;CSS样式资源,CSS代码除了可以内嵌在HTML文件之外,还可以以单独文件形式存在;各种编码格式的图片资源,包括png、jpeg等,当然还有一些特殊的图片资源。例如SVG中所需的图片资源;用于绘制SVG的2D矢量图形表示;支持CSS Shader文件;多媒体资源及支持音视频的字幕文件(TextTrack);CSS支持自定义字体,CSS3引入的自定义字体文件;使用XSLT语言编写的XSLT代码文件。

WebKit资源加载机制

上面这些资源在WebKit中均有不同的类来表示它们,它们的公共基类是CachedResource。资源的缓存机制是提高资源使用效率。它的基本思想是建立一个资源的缓存池,当WebKit需要请求资源的时候,先从资源池中查找是否存在相应的资源。如果有,WebKit则取出以便使用;如果没有,WebKit创建一个新的CachedResource子类的对象,并发送真正的请求给服务器,WebKit收到资源后将其设置到该资源类的对象中去,以便于缓存后下次使用。这里的缓存指的是内存缓存,而不同于后面在网络栈部分的磁盘缓存。WebKit从资源池中查找资源的关键字是URL,因为标记资源唯一性的特征就是资源的URL。这也意味着假如两个资源有不同的URL,但是它们的内容完全一样,也被认为是两个不同的资源。

WebKit总共三种类型的加载器:
针对每种资源类型的特定加载器,其特点是仅加载某一种资源。例如对于image这个HTML元素,该元素需要图片资源,对应的特定资源加载器是ImageLoader类。对于CSS自定义字体,它的特定资源加载器是FontLoader类。这些资源加载器没有公共基类,其作用就是当需要请求资源时,由资源加载器负责加载并隐藏背后复杂的逻辑。
资源缓存机制的资源加载器的特点是所有特定加载器都共享它来查找并插入缓存资源-CachedResourceLoader类。特定加载器先是通过缓存机制的资源加载器来查找是否有缓存资源,它属于HTML的文档对象。
通用的资源加载器-ResourceLoader类,是在WebKit需要从网络或文件系统获取资源的时候使用。该类只负责获得资源的数据,因此被所有特定资源加载器所共享。它属于CachedResource类,但它同CachedReasourceLoader类没有继承关系。

同CacheResourceLoader对象一样,资源池也属于HTML文档对象。资源池不能无限大,必须要用相应的机制来替换其中的资源,从而加入新的资源。资源池使用的机制其实很简单,就是采用LRU(Least Recent Used 最近最少使用)算法。另一方面,当一个资源加载后,通常它会被放入资源池,以便之后使用。问题是,WebKit如何判断下次使用的时候是否需要更新该资源从而对服务器重新请求呢?因为服务器可能在某段时间之后更新了该资源。考虑这样的场景,当用户打开网页后,他想刷新当前的页面。这种情况下,资源池会出现怎样的情况呢?是清除所有的资源,重新获得呢?还是直接利用当前的资源?都不是。对于某些资源,WebKit需要直接重新发送请求,要求服务器端将内容重新发送过来。对于很多资源,WebKit则可以利用HTTP协议减少网络负载。在HTTP协议的规范中对此有规定,浏览器可以发送消息确认是否需要更新,如果有,浏览器则重新获取该资源;否则就需要利用该资源。WebKit的做法是,首先判断资源是否在资源池中,如果是,那么发送一个HTTP请求给服务器,说明该资源在本地的一些信息,例如该资源什么时间修改的,服务器则根据该信息作判断,如果没有更新,服务器发送回状态码304,表明无需更新,那么直接利用资源池中原来的资源;否则,WebKit申请下载最新的资源内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值