这是我参与【第六届青训营】笔记创作活动的第5天~学习的内容是【客户端容器】。
本节内容为客户端容器Web浏览器以及跨端方案,客户端容器是指能够在用户终端上运行的应用程序,通常包括浏览器和移动应用程序。
本次课程分为浏览器架构、渲染进程、Chrome运行原理和跨段容器4个部分展开。
1 浏览器架构
1.1 浏览器架构的演进
1.单进程架构:所有模块运行在同一个进程里,包含网络、插件、JavaScript运行环境等。
2.多进程架构:主进程、网络进程、渲染进程、GPU进程、插件进程。
3.面向服务架构:将原来的UI、数据库、文件、设备、网络等作为一个独立的基础服务。
三者之间的对比如下图所示:
可以看出,随着浏览器架构的演进,目前面向服务架构的性能最好。
1.2 任务管理器
1.3 多进程分工
2 渲染进程
在了解渲染进程前,首先要对常见浏览器内核进行介绍。
渲染进程的实质其实是多线程架构,内部是多线程实现的。主要负责页面渲染、脚本执行、事务处理和网络请求等。
多线程工作流程如下:
(1)网络线程负责加载网页资源;
(2)JS引擎解析JS脚本并执行;
(3)JS解析引擎空闲时,渲染线程立即工作;
(4)用户交互、定时器操作等产生回调函数,放入任务队列中;
(5)事务线程进行事件循环,将队列里的任务取出交给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 ) //输出??
输出结果为:
3 Chorme运行原理
3.1 如何展示网页
浏览器地址输入URL后发生了什么
3.2 输入原理
1.用户URL框输入内容之后,UI线程会判断输入的是一个URL地址还是一个query查询条件;
2.如果是URL,直接请求站点资源;
3.如果是query,则将输入发送给搜索引擎。
3.3 开始导航
1.当用户按下回车,UI线程通知网络线程发起一个网络请求,来获取站点内容;
2.请求过程中,tab处于loading状态。
3.4 读取响应
1.网络线程接收到HTTP响应后,先检查响应头的媒体类型(MINE Type);
2.如果响应主题是一个HTML文件,浏览器将内容交给渲染进程处理;
3.如果拿到的是其他类型文件,比如zip、exe等,则交给下载管理器处理。
3.5 寻找渲染进程
1.网络线程做完所有检查后,会告知主进程数据已准备完毕,主进程确认后为这个站点找一个渲染进程;
2.主进程通过IPC消息告诉渲染进程去处理本次导航;
3.渲染进程开始接收数据并告知主进程自己已开始处理,导航结束,进入文档加载阶段。
3.6 资源加载
1.收到主进程的消息后,开始加载HTML文档;
2.除此之外,还需要加载子资源,比如一些照片,CSS样式文件以及JavaScript脚本。
3.7 构建渲染树
1.构建DOM树,将HTML文本转化成浏览器能够理解的结构;
2.构建CSSOM树,浏览器同样不认识CSS,需要将CSS代码转化为可理解的CSSOM;
3.构建渲染树,渲染树是DOM树和CSSOM树的结合。
3.8 页面布局
1.根据渲染树计算每个节点的位置和大小;
2.在浏览器页面区域绘制元素边框;
3.遍历渲染树,将元素以盒模型的形式写入文档流。
3.9 页面控制
1.构建图层:为特定的节点生成专用图层;
2.绘制涂层:一个图层分成很多绘制指令,然后将这些指令按顺序组成一个绘制列表,交给合成线程;
3.合成线程接收指令生成图块;
4.栅格线程将图块进行栅格化;
5.展示在屏幕上。
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
5 个人总结
对于前端开发者来说,学习并掌握客户端容器的作用是很重要的。通过了解浏览器架构、渲染进程、跨端容器等概念,可以更好地优化Web应用程序的性能、安全性和可靠性。通过今天的学习,我对客户端容器中Chrome的运行原理有了更深刻的理解,同时如果将来做前端的话,我还需要会写兼容不同浏览器和客户端容器的代码,从而保证应用程序在各种环境下都能正常运行,任重而道远~