Post

浏览器运行机制

浏览器运行机制

浏览器是多进程机制

  • 主进程
    • 负责浏览器界面显示与用户交互
    • 负责各个页面管理,创建和销毁其他进程
    • 将渲染进程得到的内存中的 Bitmap 绘制到用户界面
    • 网络资源的管理、下载等
  • 渲染进程:每个 tab 页是一个进程,进程内可以多线程
    • 页面渲染
    • 脚本执行
    • 时间处理
  • GPU 进程
    • 绘制 3D 图形
  • 插件进程
    • 处理浏览器插件

渲染进程

  • 渲染线程

    • *负责渲染浏览器界面,解析 HTML,CSS,构建 DOM 树和 RenderObject 树,布局和绘制等。

    • 当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行

    • GUI 渲染线程与 JS 引擎线程是互斥的,当 JS 引擎执行时 GUI 线程会被挂起,GUI 更新会被保存在一个队列中等到 JS 引擎空闲时立即被执行。

  • 脚本线程

    • 一个渲染进程只有一个 JS 线程
    • 负责处理并执行 JS 脚本程序
    • 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞
  • 事件线程

    • 收集管理事件
    • 处理事件循环
  • 定时器线程

    • 接收 setTimeout 和 setInterval 的回调函数
    • 管理定时器
  • 网络请求线程

    • 发送和接收网络请求
    • 将回调函数放入事件队列

输入 URL 到页面展示过程

  • 解析 URL 输入
  • 发起 URL 请求
    • DNS 解析
    • TCP 通信
    • 数据处理
  • 创建渲染进程
  • 页面渲染
    • 解析 HTML 生成 DOM
    • 解析 CSS 生成 CSSDOM
    • 加载或执行 JavaScript
    • 生成渲染树
    • 布局
    • 分层
    • 生成绘制列表
    • 光栅化
    • 显示

repaint

  • repiant 或者 redraw 遍历所有的节点检测各节点的可见性、颜色、轮廓等可见的样式属性,然后根据检测的结果更新页面的响应部分。
  • 当 render tree 中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如 background-color。则就叫称为重绘

reflow

  • reflow 指的是计算页面布局。某个节点 reflow 时会重新计算节点的尺寸和位置,而且还有可能触发其子节点、祖先节点和页面上的其他节点 reflow。在这之后再触发一次 repaint。
  • 当 render tree 中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流,每个页面至少需要一次回流,就是在页面第一次加载的时候。

触发条件

  • 调整窗口大小
  • 改变字体
  • 增加或者移除样式表
  • 内容变化,比如用户在 input 框中输入文字
  • 激活 CSS 伪类,比如 :hover (IE 中为兄弟结点伪类的激活)
  • 操作 class 属性
  • 脚本操作 DOM
  • 计算 offsetWidth 和 offsetHeight 属性
  • 设置 style 属性的值
This post is licensed under CC BY 4.0 by the author.

Trending Tags