webkit笔记,主要来自 朱永盛 《WebKit技术内幕》 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买

WebKit资源加载机制

HTML支持的资源主要包括:

HTML: HTML页面,包括各式各样的HTML元素

JavaScript: JavaScript代码,可以内嵌在HTML文件中,也可以单独的文件存在

CSS样式表: CSS样式资源,因为CSS代码除了可以内嵌在HTML文件之外,还可以以单独文件形式存在

图片: 各种编码格式的图片资源,包括 png、jpeg等。当然还有一些特殊的图片资源,例如 SVG 中所需要的图片资源

SVG : 用于绘制 SVG 的2D 矢量图形表示

CSS Shader: 支持 CSS Shader文件, 目前WebKit支持该功能

视频、音频和字幕: 多媒体资源及支持音视频的字幕文件( TextTrack )

字体文件: CSS支持自定义字体, CSS3 引入的自定义字体文件

XSL 样式表: 使用 XSLT语言编写的 XSLT代码文件

上面这些资源在 WebKit中均有不同的类表示它们,它们的公共基类是 CachedResource。

HTML 对应的类型为  MainResource类, 与其对应的资源类型叫 CachedRawResource 类

还有两个与资源密切关联的类:

CachedResourceClient: 监听资源加载状态信息的

CachedResourceLoader: 负责资源加载的策略

WebKit 资源缓存机制

WebKit利用MemoryCache和CachedResourceLoader来实现资源缓存机制,如下图所示

对于相同的URL,使用同一个 CacheResource

当资源占用的内存超过缓存空间的时候,使用 LRU机制释放缓存

资源加载器

Webkit 总共有三种类型的资源加载器

1,针对某种资源类型的特定加载器,仅加载某一种资源。 例如:对于 'image' 这个HTML元素,该元素需要图片资源,对应的特定资源加载器是 ImageLoader 类。对于 CSS 自定义字体,

它的特定资源加载器是 FontLoader类。这些资源加载器没有公共基类,其作用就是当需要请求资源时,由资源加载器负责加载并隐藏

背后的复杂逻辑。加载器属于它的调用者,如下图所示的图片加载器

2,资源缓存机制的资源加载器,特点:所有特定加载器都共享它来查找并插入缓存资源 --- CacheResourceLoader类。特定加载器 先 通过缓冲机制的资源加载器来查找是否有缓存资源

它属于 HTML 的文档对象, 如下图:

3,通用资源加载器  -----  ResourceLoader 类, 是在 WebKit需要从网络或者文件系统获取资源的时候使用该类 ,只负责获得资源的数据,因此被所有特定资源加载器所共享。

它属于 CachedResource 类,但它同 CacheResourceLoader 类没有继承关系,如下图所示:

之所以 WebKit这样设计加载器,主要还是因为 WebKit 想将其中的负载机制 逐渐简化为 若干简单步骤。

加载过程

加载过程如下图所示:

鉴于从网络获取资源时一个非常耗时的过程,通常一些资源的加载是异步执行的,也就是说资源的获取和加载不会阻碍 当前 WebKit的渲染过程,例如图片、CSS文件。当然,网页也存在某些特别的资源会阻碍主线程的渲染过程,例如 JavaScript 代码文件。这会严重影响 WebKit 下载资源的效率,因为后面可能还有许多需要下载的资源,WebKit会怎么做?

因为主线程被阻碍了,后面的解析工作没办法继续往下进行,所以对于 HTML 网页中后面使用的资源也没有办法知道并发送下载请求。

当遇到这种情况的时候,WebKit的做法是这样的:当前的主线程被阻碍时。WebKit会启动另外一个线程去遍历后面的HTML页面,收集需要的资源URL

,然后发送请求,这样就可以避免被阻碍。

与此同时,WebKit 能够并发下载这些资源,甚至并发下载 JavaScript 代码资源。

这种机制对于网页的加载提速很是明显。

最新文章

  1. 【iOS】UITabView/UICollectionView 全选问题
  2. .NET微信公众号开发-5.0微信支付
  3. C++中使用函数指针 【瓦特芯笔记】
  4. ASP.NET5/MVC6 下生成Helppage
  5. ASP.Net4.0中新增23项功能
  6. File System Shell
  7. HighCharts常用设置(摘抄笔录)
  8. Python-windows服务-重启自动化
  9. 不容错过的UI设计素材大合集
  10. Ubuntu Linux中开启MySQL远程访问功能
  11. 《类型编程晋级——shapeless类库使用指南》前言及第一章翻译
  12. mshadow的原理--MXNet
  13. 小白学习java设计模式之策略模式
  14. SSLTLS 服务器瞬时 Diffie-Hellman 公共密钥过弱【原理扫描】解决说明
  15. HTTP 响应类型 ContentType 对照表
  16. node.js 递归创建多级目录
  17. Replace和ReplaceAll的差别
  18. Linux中Postfix虚拟用户及虚拟域(六)
  19. 拼凑sql语句另外一个方法
  20. 关于async和await的一些误区

热门文章

  1. [vue warn]:typeError:_this.getMounted.forEach is not a function
  2. mysql修改登录密码三种方式
  3. (Linux 日常命令)[20171225]
  4. jQuery(四)--HTTP请求
  5. java后台去除JSON数组的重复值
  6. eclipse全选包
  7. flask 中访问时后台错误 error: [Errno 32] Broken pipe
  8. SocketServer模块中的几种类
  9. python--基本类型之列表
  10. Java:Random函数及其种子的作用