客户端容器|青训营笔记

101 阅读5分钟

这是我参与【第六届青训营】笔记创作活动的第5天~学习的内容是【客户端容器】。

本节内容为客户端容器Web浏览器以及跨端方案,客户端容器是指能够在用户终端上运行的应用程序,通常包括浏览器和移动应用程序。

本次课程分为浏览器架构、渲染进程、Chrome运行原理和跨段容器4个部分展开。

1 浏览器架构

1.1 浏览器架构的演进

1.单进程架构:所有模块运行在同一个进程里,包含网络、插件、JavaScript运行环境等。
2.多进程架构:主进程、网络进程、渲染进程、GPU进程、插件进程。
3.面向服务架构:将原来的UI、数据库、文件、设备、网络等作为一个独立的基础服务。

截屏2023-05-14 下午4.08.21.png

三者之间的对比如下图所示:

截屏2023-05-14 下午4.09.25.png

可以看出,随着浏览器架构的演进,目前面向服务架构的性能最好。

1.2 任务管理器

截屏2023-05-14 下午4.17.31.png

1.3 多进程分工

截屏2023-05-14 下午4.17.59.png

2 渲染进程

在了解渲染进程前,首先要对常见浏览器内核进行介绍。

截屏2023-05-14 下午4.19.00.png

渲染进程的实质其实是多线程架构,内部是多线程实现的。主要负责页面渲染、脚本执行、事务处理和网络请求等。

截屏2023-05-14 下午4.19.59.png

多线程工作流程如下:
(1)网络线程负责加载网页资源;
(2)JS引擎解析JS脚本并执行;
(3)JS解析引擎空闲时,渲染线程立即工作;
(4)用户交互、定时器操作等产生回调函数,放入任务队列中;
(5)事务线程进行事件循环,将队列里的任务取出交给JS引擎执行。

截屏2023-05-14 下午4.23.46.png

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 ) //输出??

输出结果为:

截屏2023-05-14 下午4.29.49.png

3 Chorme运行原理

3.1 如何展示网页

浏览器地址输入URL后发生了什么

截屏2023-05-14 下午4.31.12.png

3.2 输入原理

1.用户URL框输入内容之后,UI线程会判断输入的是一个URL地址还是一个query查询条件;
2.如果是URL,直接请求站点资源;
3.如果是query,则将输入发送给搜索引擎。

截屏2023-05-14 下午4.39.45.png

3.3 开始导航

1.当用户按下回车,UI线程通知网络线程发起一个网络请求,来获取站点内容;
2.请求过程中,tab处于loading状态。

截屏2023-05-14 下午4.40.45.png

3.4 读取响应

1.网络线程接收到HTTP响应后,先检查响应头的媒体类型(MINE Type);
2.如果响应主题是一个HTML文件,浏览器将内容交给渲染进程处理;
3.如果拿到的是其他类型文件,比如zip、exe等,则交给下载管理器处理。

截屏2023-05-14 下午4.49.51.png

3.5 寻找渲染进程

1.网络线程做完所有检查后,会告知主进程数据已准备完毕,主进程确认后为这个站点找一个渲染进程;
2.主进程通过IPC消息告诉渲染进程去处理本次导航;
3.渲染进程开始接收数据并告知主进程自己已开始处理,导航结束,进入文档加载阶段。

3.6 资源加载

1.收到主进程的消息后,开始加载HTML文档;
2.除此之外,还需要加载子资源,比如一些照片,CSS样式文件以及JavaScript脚本。

截屏2023-05-14 下午4.56.51.png

3.7 构建渲染树

1.构建DOM树,将HTML文本转化成浏览器能够理解的结构;
2.构建CSSOM树,浏览器同样不认识CSS,需要将CSS代码转化为可理解的CSSOM;
3.构建渲染树,渲染树是DOM树和CSSOM树的结合。

截屏2023-05-14 下午4.59.15.png

3.8 页面布局

1.根据渲染树计算每个节点的位置和大小;
2.在浏览器页面区域绘制元素边框;
3.遍历渲染树,将元素以盒模型的形式写入文档流。

截屏2023-05-14 下午5.00.30.png

3.9 页面控制

1.构建图层:为特定的节点生成专用图层;
2.绘制涂层:一个图层分成很多绘制指令,然后将这些指令按顺序组成一个绘制列表,交给合成线程;
3.合成线程接收指令生成图块;
4.栅格线程将图块进行栅格化;
5.展示在屏幕上。

截屏2023-05-14 下午5.03.34.png

3.10 前端性能performance

1.首屏优化:
(1)压缩、分包、删除无用代码;
(2)静态资源分离;
(3)JS脚本非阻塞加载;
(4)缓存策略;
(5)SSR;
(6)预置loading、骨架屏。

2.渲染优化:
(1)GPU加速;
(2)减少回流、重绘;
(3)离屏渲染;
(4)懒加载。

3.JS优化:
(1)防止内存泄漏;
(2)循环尽早break;
(3)合理使用闭包;
(4)减少Dom访问;
(5)防抖,节流;
(6)Web Workers。

4 跨端容器

Q:为什么要跨端?
1)开发成本、效率;
2)一致性体验;
3)前端开发生态。

Q:有哪些跨端方案?
webview、小程序、RN/WeeX、Lynx、Flutter

截屏2023-05-14 下午5.11.15.png

5 个人总结

对于前端开发者来说,学习并掌握客户端容器的作用是很重要的。通过了解浏览器架构、渲染进程、跨端容器等概念,可以更好地优化Web应用程序的性能、安全性和可靠性。通过今天的学习,我对客户端容器中Chrome的运行原理有了更深刻的理解,同时如果将来做前端的话,我还需要会写兼容不同浏览器和客户端容器的代码,从而保证应用程序在各种环境下都能正常运行,任重而道远~