• webkit技术--网页渲染原理


    Webkit渲染

    Webkit 是苹果发起的一个开源项目,后来谷歌用这个项目以 webkit 创建了一个新的项目 Chromium,我们平常用的 Chrome 浏览器一般都是基于 Chromium 开发出来的稳定版本。本文主要介绍浏览器的渲染引擎即 webkit内核。webkit 作为浏览器的渲染引擎能够将 html/css/js文本及相应的资源文件转换成图像结果。

    1.内部模块结构图如下:

    可以看出渲染引擎大致包括HTML解释器,CSS解释器,布局和JavaScript引擎等模块。这些模块可能又依赖其他的基础模块,比如依赖第二层的一些基础模块。

     

    2.下图展示这些模块是如何一起完成网页的基本渲染过程:

     

    首先是网页内容,送到HTML解释器。HTML解释器在解释它后形成DOM树,中间如果遇到JavaScript代码则交给JavaScript引擎去处理。如果页面包含CSS,则交给CSS解释器去解析。当DOM建立的时候,接受来自CSS解释的样式信息,构建一个新的内部绘图模型。该模型由布局模块计算模型内部的各个元素的位置和大小信息,最后由绘图模块完成从该模型到图像的绘制。

    最后解释图中虚线箭头的指向含义。它们表示在渲染过程中,每个阶段可能使用到的其他模块。在网页内容的下载中,需要使用到网络和存储,这个是显而易见地。但计算布局和绘图的时候,需要使用2D/3D的图形模块,同时因为要生成最后的可视化结果,这时候需要开始解码音频视频和图片,同其它内容一起绘制到最后的图像中。 在渲染完成之后,用户可能需要跟渲染的结果进行交互,或者网页自身有动画,一般而言,这会持续的重新渲染过程。

     3.网页渲染过程

     Webkit 的网页渲染过程,所以和网上那个比较流行的面试题(输入url到页面展示有哪些过程)有点不同。

     主要大致分三个过程:第一阶段是从URL到构建完 DOM树,第二阶段是 DOM 树到构建完 webkit 的绘图上下文,第三个阶段是从绘图上下文到最终生成的图像。

    我们还是分别看图来理解三个阶段

     

    这里分别解释一下1-8每步的作用:

    1.表示当用户输入 URL时,Webkit调用其资源加载器,加载该url对应的资源

    2.加载器依赖网络模块建立链接,发生请求,并接受答复。

    3.webkit接收到各种网页请求或者资源的数据,其中某些资源可能同步或异步。

    4.网页交给 HTML 解释器转变成一系列的词语(Token)

    5.解释器根据词语构建 DOM 节点,形成 DOM 树

    6 如果节点有 js 代码,调用 javaScript 引擎

    7.其中 js 有可能修改 DOM 树结构

    8.如果节点还需要加载其他资源(视频图片之类的),就会调用加载器加载他们,但这个过程是异步的,不会阻碍当前 DOM 树的创建。

    上面就是第一阶段的过程了,下面再说第二阶段

    这个具体过程大概是: 

    1.css文件被 css解释器解释内部表示结构

    2.css解释器工作完成之后,在 DOM 树上附加解释后的样式信息,这就是 RenderObject

    3.RenderObject 节点在创建的同时,webkit 根据网页的层次结构创建 RenderLayer 树,同时构建一个虚拟的绘图上下文。

    上面图中的四个内部表示结构是一直存在的,除非网页被销毁。

    最后一个就是第三阶段,根据绘图上下文生成最后的图像:

     

    以上三个阶段基本介绍完了一个完成的网页渲染过程。由于现在的网页有动态交互等,所以浏览器其实一直在不停的重复执行渲染过程。

    下面举个例子在浏览器里来看看实际的情况:

    我把的我demo在 chrome 浏览器里打开,(demo是个html文件只有一张图)。

    打开chrome 的开发者工具,在 network 里发现如下所示的结果

    可以发现最终加载了两个资源:一个html页面,一个图片。

    两条竖线,第一条表示 DOM 已经加载完成,第二条表示资源全部加载完成。你仔细观察会发现第二条线出现在图片加载完成之后。 第二条线出现之后表明第一阶段完成了,下面再看看第二,三阶段。

     

    这个 TimeLine 是根据时间来获取网页渲染的动作过程的。 蓝色部分表示的是第一阶段加载 DOM资源的,紫色的虽然只显示了 Layout布局,但他表示的是第二阶段。绿色的表示的是第三阶段绘图阶段(paint绘制节点和composite Layers合成网页的层次)。

     

     

  • 相关阅读:
    jQuery入门教程
    vue-lazyload 图片不更新
    Eggjs 设置跨域请求
    Vue.js错误: Maximum call stack size exceeded
    ubuntu nginx ssl 证书配置
    ubuntu 安装nginx, 出现 Unable to locate package
    nginx 判断移动端或者PC端 进入不同域名
    node.js 生成二维码
    Linux 配置ssh 免密码登录
    nodejs 从部署到域名访问
  • 原文地址:https://www.cnblogs.com/QingFlye/p/4175868.html
Copyright © 2020-2023  润新知