Chrome 问题

接下来开始极客时间《浏览器工作原理与实践》阅读,在这之前,搜集一些问题,让我们带着问题来阅读。

从输入 URL 到页面加载的过程

这一道题不断深入可以完善自己的前端知识体系!

  1. 浏览器构建请求头,准备发送请求

  2. 检查有无本地缓存 引申 HTTP 缓存

  3. 无缓存,开始 DNS 查询,从本地目录开始查找缓存一直到根目录 引申 DNS 查询 如果请求协议是 HTTPS,那么还需要建立 TLS 连接。 // 准备 IP 地址和端口

  4. 查询到 IP 后,检查 TCP 队列是否已满,浏览器限定同时存在 6 个连接

  5. 建立 TCP 连接,开始 3 次握手

  6. 开始数据传输,到后台处理完毕,结束传输,开始 4 次挥手

  7. 浏览器接受到数据,通过 Content-Type 区分,如果是下载类型就交给浏览器的下载管理器结束本次导航,如果是 HTML ,浏览器进程提交文档到渲染进程开始渲染

    Chrome 的默认策略是,每个标签对应一个渲染进程。但如果从一个页面打开了另一个新页面,而新页面和当前页面属于同一站点的话,那么新页面会复用父页面的渲染进程。官方把这个默认策略叫 process-per-site-instance

  8. 渲染阶段

    1. DOM 生成
    2. 样式计算
    3. 布局阶段
    4. 生成 LayerTree 《层叠上下文》

了解跨域吗,一般什么情况会导致跨域

跨域,是指浏览器不能执行其他页面的脚本,触发了浏览器的同源策略,是一种针对 Js 的安全策略。

同源策略,是指域名,协议和端口均相同,同源策略限制了 ajax 请求发送,js 对象和 DOM 读取以及 Cookie 和 local 等的访问

浏览器的 EventLoop 了解吗

浏览器有一个主线程进行通过一个 for 循环不断进行事件执行然后退出,另外维护了一个消息队列,遵循先进先出的策略,当 for 循环执行完一个事件,就将队头的事件推入 for 循环执行。在消息队列中维护的事件就是宏任务事件,为了处理一些高优先级的事件,浏览器又在每个宏任务中维护了一个微任务列表,他的执行时间介于一个主函数执行结束之后,下一个宏任务之前。常见的微任务有 mutationOberserver 和 Promise.

requestAnimationFrame 属于宏任务还是微任务

浏览器是怎么渲染的

如何根据浏览器渲染机制加快首屏速度

回流和重绘是什么?如何避免回流和重绘

重排,它需要重新根据 CSSOM 和 DOM 来计算布局树,这样生成一幅图片时,会让整个渲染流水线的每个阶段都执行一遍,如果布局复杂的话,就很难保证渲染的效率了。
重绘因为没有了重新布局的阶段,操作效率稍微高点,但是依然需要重新计算绘制信息,并触发绘制操作之后的一系列操作。
为了提升每帧的渲染效率,Chrome 引入了分层和合成的机制

什么是 GPU 加速,如何使用 GPU 加速,GPU 加速的缺点

will-change

了解 V8 的垃圾回收吗

V8 的垃圾回收 分为 栈内回收和堆内回收,栈保存简单变量,堆保存对象这种复杂变量

栈内回收比较简单,就函数执行上下文出栈后,指针下移,V8 就会进行变量回收

堆回收,V8 将回收区域分成 新生代 和 老生代 通过不同的回收策略进行回收

首先是新生代,他采用了标记-整理的方式,V8 将新生代分成 空闲区域和对象区域,采用 Savger 算法,业技术当对象被访问到就进行标记,当空间快满时就进行一次整理,将已标记的变量复制到对象区域,并清理空闲区域,同时将两个区域互换,实现可循环。当一个变量被标记两次以上或者太大,就会进入到老生代。

老生代,采用的是标记清理方式,因为这里的对象都比较大,所以复制会很消耗性能,所以,这里会选取一个根元素进行遍历,没被标记的就会被视作垃圾数据,标记完成后不做清理,而是向一端移动,然后清理边界之外的垃圾元素

然后并行标记, 使用空闲时间进行清理和整理操作