只针对自己不太熟或者面试常问的有针对性的整理
浏览器架构
现代浏览器的多进程架构如下
多进程架构的优势:
各个进程相互独立,不会互相影响,不会因为一个进程的崩溃而影响整个浏览器的运行
浏览器主进程: 负责各个页面的展示交互
渲染进程: js引擎等
GPU进程:绘制ui界面
网络进程: 负责网络资源加载,浏览器的跨域从渲染进程发起,被网络进程拦截
插件进程: 负责插件运行
JavaScript单线程模型
GUI
线程与js引擎线程
互斥js
会阻塞页面加载webWorker
可以再开启一个线程,但是这个线程由主线程控制,且不能操作DOM
,但是webWorker
需要通信,通信时长如果大于线程执行之间将得不偿失。
渲染机制
基本流程
- 解析
HTML
生成DOM
树
- 期间如果遇到
脚本(js或者其他)
那么暂停解析,加载脚本,加载完重新构建DOM
树
解析
CSS
生成CSSOM
树DOM树
和CSSOM树
合并生成渲染树
渲染树
进行布局layout
,计算节点的位置大小等等调用
GPU绘制
,这个过程称为重绘
重绘回流
基本概念
回流:会计算布局的大小位置,重新生成渲染树
局部回流: 外层
dom
大小位置不变化,只变化了内层的全局范围:从根节点开始回流
重绘:只更改外观,不更改布局
针对回流优化
不要直接修改
DOM
中会改变定位或者大小的属性不要过度的获取计算
DOM
的位置,大小visibility
取代display: none
频繁运行的动画使用
requestAnimationFrame
或者变成一个新的图层
变图层的方式:
3D
变换:translate3d
、translateZ
will-change
video、iframe 标签
position: fixed
与EventLoop的关系
requestAnimationFrame
是一个能让js
线程和浏览器交互的方法,这个函数传入的方法可以在浏览器重绘前调用,下面写一个简单的demo,让浏览器自己决定函数的触发时机保证不卡顿
1 | let count = 0; |
其余渲染优化
script
标签尽量放在后面,最好支持异步加载,最好支持延迟加载尽可能快的加载
CSS
样式表,避免js加载时样式表还没加载完适当使用图层
- 浏览器标准流可以视为一个图层,我们可以手动创建图层,脱离标准流,脱离标准流的图层会单独渲染,因此如果遇到渲染麻烦的图层我们可以单独为其创建一个图层渲染,但是不要过度使用,渲染本身也耗性能
注意点:
CSSOM
树的构建会影响渲染树
的生成,因此CSS
会影响页面渲染HTML
标签遇到script
标签会暂停构建,加载完后再去构建DOM
script
标签引入的js
文件,也需要在css
样式表加载完之后才会执行
Load 和 DOMContentLoaded
Load
是等HTML、CSS、JS、图片等
资源都加载完时触发,可以用来计算首屏渲染时间
DOMContentLoaded
是HTML
解析完成触发,不需要等待CSS、JS、图片
浏览器缓存
强缓存:Cache-Control
和 Expire
协商缓存:If-none-match
配合Etag
和 If-modified-since
配合last-modified
优先强缓存,然后协商缓存
存储方案
Cookie:小 4k左右、会带到请求头
localStorage: 5m,需要手动清理
sessionStorage 5m,一直存在
跨域
详细看HTTP
安全(XSS和CSRF)
XSS:代码注入
- 持久型:数据库代码注入
- 非持久: url代码注入(浏览器自动防范)
CSP: 白名单(设置外部资源访问限制),meta标签可以做<meta http-equiv="Content-Security-Policy">
CSRF: 跨站请求伪造,本站请求黑客服务器的方式来获取用户的信息
- 合成
url
,判断是否是一个合法的域名,非合法就调用浏览器默认搜索功能,合法就跳转到对应的网站 DNS
检索,检索优先从缓存中拿(浏览器缓存中 -> 本地HOST
-> 本地DNS
解析缓存 -> 本地DNS
服务器),缓存中如果没有,依次查找根域名服务器、顶级域名服务器、二级域名服务器- 建立
TCP
连接,TCP
连接主要是三次握手
- 第一次:客户端发送标记位
SYN
,seq = p
- 第二次:服务端响应
ACK
,ack = p + 1
,请求建立连接标记位SYN seq = q
- 第三次: 客户端响应标记位为
ACK ack = q + 1
获取文件,优先从缓存中获取文件,优先强缓存,然后协商缓存
断开连接,TCP四次挥手
- 客户端发出标记位
FIN
,请求关闭 - 服务端发送标记位
ACK
,表示收到 - 服务端发出标记位
FIN
,表示可以关闭 - 客户端发出标记位
ACK
,表示收到 - 客户端等待两个
MSL
后断开连接
- 获取文件后,解析HTML,渲染页面
层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优先级顺序占用层叠上下文的空间。
拥有层叠上下文属性的元素会被提升为单独的一层。
拥有层叠上下文属性:
- 根元素 (HTML),
z-index
值不为"auto"
的 绝对/相对定位元素,position
,固定(fixed)
/ 沾滞(sticky)
定位(沾滞定位适配所有移动设- 备上的浏览器,但老的桌面浏览器不支持)z-index
值不为"auto"
的flex
子项 (flex item
),即:父元素 -display: flex|inline-flex
,z-index
值不为"auto"
的grid
子项,即:父元素display:grid
opacity
属性值小于 1
的元素(参考 the specification for - opacity),transform
属性值不为"none"
的元素,mix-blend-mode
属性值不为"normal"
的元素,filter
值不为"none"
的元素,perspective
值不为"none"
的元素,clip-path
值不为"none"
的元素mask / mask-image / mask-border
不为”none”的元素isolation
属性被设置为"isolate"
的元素- 在
will-change
中指定了任意CSS
属性 -webkit-overflow-scrolling
属性被设置 “touch”的元素contain
属性值为"layout"
,"paint"
,或者综合值比如"strict"
,"content"
requestAnimationFrame 和 requestIdleCallback
requestAnimationFrame
浏览器渲染前调用,60刷新率大概为16.7ms
requestIdleCallback
,浏览器两帧间的空闲时间调用