客户端容器 | 青训营笔记

49 阅读4分钟
客户端容器 | 青训营笔记
浏览器架构
  • 单进程架构:所有模块运行在同一个进程里,包括网络、插件、JavaScript运行环境
  • 多进程架构:主进程、网络进程、渲染进程、CPU进程、插件进程
  • 面向服务进程:将原来的UI、数据库、文件、设备、网络等,作为一个独立的基础服务
进程名称进程描述
浏览器(主进程)主要负责页面展示逻辑,用户交互,子进程管理;包括地址栏、书签、前进、后退、收藏夹等
GPU进程负责UI绘制,包含整个浏览器全部UI
网络进程网络服务进程,负责网络资源加载
标签页(渲染进程)控制tab内的所有内容,将Html、Css和JavaScript转换为用户可交互的网页
插件进程控制网站于宁的插件,比如flash、ModHeader等
其它进程适用程序 Storage/NetWork/Audio Service等
渲染进程

JS 引擎 VS 渲染引擎

1、解析执行JS

2、XML解析生成渲染树,显示在屏幕

3、桥接方式通信

多线程工作流程:

  • 网络线程负责加载网页资源
  • JS 引擎 解析 JS脚本并且执行
  • JS 解析引擎 空闲时,渲染线程立即工作
  • 用户交互、定时器等操作产生回调函数加入任务队列中
  • 事件线程进行事件循环,将队列里的任务取出交给JS引擎执行
const now = Date.now()
setTimeout(() => {
    console.log('time10', Date.now() - now)
}, 10)
setTimeout(() => {
    console.log('time30', Date.now() - now)
}, 30)
while(true) {
    if (Date.now() - now >= 20)
        break
}
console.log(Date.now() - now)
// 输出: 20 30 50 
Chrome运行原理

1)如何展示网页

  • 资源加载:加载子资源 -》 执行脚本
  • 构建:构建DOM -》 构建CSSDOM -》构建渲染树
  • 布局
  • 绘制:构建图层 -》绘制图层
  • 合成:光栅化
  • 展示完成

2)输入处理

1、用户URL框输入内容后,UI线程会按段输入的是一个URL地址还是一个query查询条件

如果是URL,直接请求站点资源

如果是query,将输入发送给搜索引擎

3)开始导航

1、当用户按下回车,UI线程通知网咯线程发起一个网络请求,来获取站点内容

2、请求过程中,tab处理loading状态

4)读取响应

1、网络线程接收到HTTP响应后,先检查响应头的媒体类型

2、如果响应主体是一个HTML文件,浏览器将内容交给渲染进程处理

3、如果拿到的是其他类型的文件,比如Zip、exe等,则交给下载管理器处理

5)资源加载

1、收到主进程的消息后,开始加载HTML文档

2、除此之外,还需要加载子资源,比如一些图片、CSS样式文件以及JavaScript脚本

6)构建渲染树

1、构建DOM 树,将HTML文本转化为浏览器能够理解的结构

2、构建CSSOM树,浏览器同样不认识CSS,需要将CSS代码转化为可以理解的CSSOM

3、构建渲染树,渲染树是DOM树和CSSOM树的结合

7)页面布局

1、根据渲染树计算每个节点的位置和大小

2、在浏览器页面区域绘制元素边框

3、遍历渲染树,将元素以盒模型的形式写入文档流

8)页面绘制

1、构建图层:为指定的节点生成专用图层

2、绘制图层:一个图层分成很多绘制指令,然后将这些指令按顺序组成一个绘制列表,交给合成线程

3、合成线程接收指令生成图块

4、栅格线程将图块进行栅格化

5、展示在屏幕上

9)首屏优化

1、压缩、分包、删除无用代码

2、静态资源分离

3、JS脚本非阻塞加载

4、缓存策略

5、SSR

6、预置loading、骨架屏

10)渲染优化

1、GPU加速

2、减少回流、重绘

3、离屏渲染

4、懒加载

11)JS优化

1、防止内存泄漏

2、循环尽早break

3、合理使用闭包

4、减少DOM访问

5、防抖、节流

6、Web Workers