Jacky's blog Jacky's blog
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Jacky Wang

行到水穷处,坐看云起时
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术随笔

    • git教程
    • 前端模块化:CommonJS,AMD,CMD,ES6
    • 如何动态加载本地图片
    • GitHub自动部署脚本
    • React生命周期详解
    • 将父组件的props作为组件的初始state的几种方案
    • webpack基础入门
    • StackOver记录:如何在function中使用redux
    • React中使用onClick时的三种性能优化
    • 思考React状态管理
    • forEach/for..in/of
    • styled-components使用记录
    • 深入理解forEach与forof
    • Node技术架构
    • Redux、Mobx状态管理杂谈
    • JS中的类型检测
    • 如何判断图片是否在可视区域
    • 如何使用图片的懒加载操作
    • JavaScript模块化:从CommonJS到AMD
    • git查看:修改用户名、密码
    • 保持数据Immutable的几种写法
    • 如何实现一个Promise.all
    • resolve(Promise对象)会多出两个微任务
    • todo_基于Mocha的测试驱动开发
    • 浏览器页面渲染机制
    • todo-响应式编程之数据劫持
    • todo-immer库的介绍
    • React-Hooks 基础原理解析
    • JS基本功
    • 函数闭包与this指针
    • 收集 DUMI 配置过程中遇到的问题
    • typescript 类型工具
    • 统一接口的导入导出
    • 网络安全:如何预防 XSS 攻击
    • 浏览器页面渲染机制【2023】
      • 0.前言
      • 1. 简述浏览器的渲染流程
      • 2. 细节解析
      • 3. 对应的面试题
      • 参考文章
    • 跨域资源请求
    • 浏览器事件循环机制
    • 如何理解浏览器的 user agent 用户代理的含义?
  • 转载文章

  • Mac相关

  • 前端学习周报

  • 包管理工具

  • 技术随笔
  • 技术随笔
wangjiasheng
2023-10-15
目录

浏览器页面渲染机制【2023】

# 0.前言

去年(2022) 年,已写了篇博客《浏览器页面渲染机制》 对浏览器的机制进行了梳理,发现对其中的一些概念还存在模糊的理解。故,本篇文章进一步从浏览器的渲染流程入手,分析页面渲染机制。

# 1. 简述浏览器的渲染流程

                                      ==  下载 css 文件 ==
                                         ↑            ↓
预解析线程: 解析到如 `link` 标签后   →  启用网络线程  →  CSSOM
              ↑   |
(渲染主进程)   |   ↓
渲染主线程: `parse HTML` → `recaculate style` → `layout` → `composite` → `paint`

合成线程:  →  `Tiling`     `Tiles`  → `Raster`      位图  →  `Draw`
                ↓            ↑           |          ↑         |
 (线程池)分块线程1、分块线程2、分块线程3      |          |         |
                                         ↓          |         ↓
GPU 进程:                           == GPU 进程(光栅化)===   矩阵运算
                                                              |
                                                              ↓
                                                        (安全)调用 GPU 硬件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 2. 细节解析

  • parse HTML

    • 其中涉及到 JS 阻塞 DOM 解析线程,推荐使用 defer 字段。

    • css 的四种方案。

      • <style>

      • <link ....>

      • <div style =""> 内联

      • 浏览器默认样式表

        document.styleSheets → StyleSheetList
        document.styleSheets[0].addRule('div','border:2px solid #f40 !important')
        
        1
        2
    • 扩展:现代浏览器的额外优化,使用预解析器,预先下载可点击链接的内容(预解析线程)

  • recaculate style

    • 此阶段将 DOM 树 + CSSOM 树 合并。
    • 可通过 document.getComputedStyle 或 computed 面板获取该计算的值。
    • 此阶段的作用
      • 相对单位 em → 绝对单位 px
      • 预设值 red → 绝对值rgba(255,0,0,0)
  • laylout 计算(几何信息)

    • C++ 对象。
    • 哪写属性会影响几何信息的计算?
      • width、height
      • font-size
      • 计算 相对定位,其中相对的是包含块?
    • DOM 树和 Layout 树的区别?
      • 会少:
        • Layout 只会对 DOM 树的可见部分进行生成。
        • 如,此时会根据 CSS 选择器,找到 display: none
      • 会多:
        • 伪元素 :before 或者 :after
        • 新增 匿名行盒 和 匿名块盒,满足以下规则:
          1. 文本等内容必须在 匿名行盒 中。
          2. 行盒和块盒是不能相邻的,所以会新增 匿名快盒。
    • 是否可以使用通过 js 访问 Layout 树?【重绘操作】
      • 不可以,因为该树为 C++ 对象,可通过 document.body.clientWidth/offset 读取内置暴露出的 布局信息 。
      • 注意的点是:js 对 dom 操作行为的表现是不同的,设置是 异步操作,而读取行为属于 同步 操作,读取行为会立即触发 重绘 操作。
        • 设置:dom.style.width = ? ,这里异步的原因是可以多个设置行为合并为一次批处理行为,减少浏览器的渲染消耗。
        • 读取:document.body.clientWidth ,立即触发重绘。
  • composite 分层

    • 该行为由浏览器自动分配。
    • 与分层属性有关:
      • 如:z-index 属性。
      • 其中 will-change 会极大影响分层结果。
  • paint 绘制指令

    • 渲染主线程会为每个 图层 生成绘制指令集,用于描述这一层的内容该如何画出来。
    • 完成绘制后,主线程结束,会将每个图层的绘制信息提交给合成线程,剩余工作将由 合成线程 完成。
  • Tiling 分块

    • 将每一层分为多个小的区域,内部会触发分块线程,会从多个 线程池 中拿取多个线程来完成工作。
  • Raster 光栅化(会调用 GPU 进程)计算出位图。

    • 作用:将 块 转 化为 位图。
    • 采用 GPU 可以加快光栅化的速度。
    • 优先处理靠近视口位置的快,并将后续结果会交给 合成线程。
  • Draw 生成 像素信息

    • 会生成 quad (指引信息)

    • (此阶段会执行 transform 等旋转或者缩放的变变形,即进行矩阵运算。)

    • 这里会有一个特点,需要先交给 GPU 进程,再由 GPU 进程交给 GPU 硬件进行计算。

      原因:整个渲染进程是在 沙盒 中执行的,不会影响操作系统,不会进行系统调用。

# 3. 对应的面试题

  1. 解释 reflow 原理。
  2. 解释 repaint 原理。

# 参考文章

  1. 详解浏览器渲染原理及流程 (opens new window)
  2. 渡一:袁进 (opens new window)
编辑 (opens new window)
上次更新: 2023/11/05, 21:11:00
网络安全:如何预防 XSS 攻击
跨域资源请求

← 网络安全:如何预防 XSS 攻击 跨域资源请求→

最近更新
01
如何理解浏览器的 user agent 用户代理的含义?
11-05
02
浏览器事件循环机制
10-31
03
跨域资源请求
10-09
更多文章>
Theme by Vdoing | Copyright © 2020-2023
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式