浏览器运行时、V8、Blink、Event Loop、Scheduler、Rendering 串联
1. 浏览器整体架构
现代浏览器不是一个单线程程序,而是多进程、多线程协作。
简化模型:
1 | Chromium |
2. Renderer Process 内部模型
Renderer 是网页真正运行的位置。
可以理解:
1 | Renderer Process |
Runtime 是什么?
Runtime 可以理解为:
网页运行时的协调系统。
它负责:
- 调度任务
- 管理事件循环
- 协调 Blink 和 V8
- 控制什么时候执行 JavaScript
- 控制什么时候进入渲染流程
它不是:
- HTML解析器
- JS执行器
- DOM实现
而是:
控制这些模块如何协作。
3. Blink 和 V8 的职责
V8
负责:
JavaScript语言本身。
例如:
1 | Promise.resolve() |
这些属于 ECMAScript。
流程:
1 | JavaScript |
Blink
负责:
浏览器提供的 Web 平台能力。
例如:
1 | document.querySelector() |
这些不是 JavaScript 自带。
而是浏览器提供。
4. Binding(绑定层)
Binding 是:
JavaScript 世界和浏览器 C++ 实现之间的桥梁。
例如:
1 | document.querySelector("#app") |
流程:
1 | JavaScript |
所以:
V8 不懂 DOM。
V8 只知道:
调用了一个函数。
真正修改 DOM:
是 Blink。
5. Web API 和 JavaScript API 区别
判断方法:
问:
这个能力是不是 ECMAScript 标准?
JavaScript 自带
例如:
1 | Promise |
流程:
1 | V8 |
浏览器提供
例如:
1 | document |
流程:
1 | V8 |
6. Event Loop 的职责
Event Loop:
不是执行 JavaScript。
它负责:
决定什么时候让 JavaScript 获得执行机会。
模型:
1 | Task Queue |
7. Task 和 Microtask
Task
来源:
- 用户事件
- setTimeout
- 网络事件
- SSE事件
例如:
1 | setTimeout(()=>{ |
流程:
1 | V8执行setTimeout |
Microtask
来源:
V8。
例如:
1 | Promise.then() |
流程:
1 | V8 |
8. 为什么 Promise 比 setTimeout 快?
因为:
执行顺序:
1 | 当前Task |
例如:
1 | console.log(1) |
结果:
1 | 1 |
原因:
Promise:
进入 Microtask。
setTimeout:
进入 Task。
9. Scheduler 的作用
Scheduler:
可以理解为:
浏览器的任务调度经理。
它负责:
- 哪些任务优先
- 什么时候处理输入
- 什么时候给渲染机会
但是:
它不能抢占 JavaScript。
例如:
1 | while(true){} |
执行:
1 | V8 |
此时:
等待:
1 | Timer Task |
都不能执行。
原因:
JavaScript:
Run To Completion
一个任务必须执行结束。
10. Rendering Pipeline
浏览器显示页面:
不是修改 DOM 就立即显示。
流程:
1 | JavaScript修改DOM |
11. requestAnimationFrame
requestAnimationFrame:
不是 Timer。
它属于:
浏览器渲染调度。
代码:
1 | requestAnimationFrame(()=>{ |
流程:
1 | V8执行调用 |
rAF 和 16.6ms
60Hz屏幕:
一帧:
约:
1 | 16.6ms |
但是:
rAF不是:
剩多少时间执行。
而是:
下一次浏览器准备渲染时执行。
如果:
JS执行太久:
例如:
1 | while(true){} |
那么:
1 | 16ms到了 |
12. Microtask 为什么可能饿死渲染?
例如:
1 | function loop(){ |
流程:
1 | Microtask |
结果:
1 | Render |
原因:
浏览器规定:
Microtask Queue 必须清空。
13. 性能优化核心思想
浏览器不是帮你抢占 JS。
开发者需要主动让出执行权。
错误:
1 | for(let i=0;i<10亿;i++){ |
优化:
拆分:
1 | setTimeout(work,0) |
或者:
1 | requestAnimationFrame(work) |
或者:
使用框架 Scheduler。
14. 最终完整模型
1 | Browser Process |

