作为一名前端开发工程师,要掌握的知识点是多而杂的,在面试刷题阶段,经常没头没脑的,我将面试题系统化,分了好几个系列,祝愿大家(包括我)在这个疫情刚过去的互联网寒冬找到事儿少钱多🤪的工作。
第一章 前端面试宝典之浏览器篇
没有前言,废话不说,马上进入正题!
我们先了解一下进程和线程:
进程是 CPU 资源分配的最小单位,线程是 CPU 调度的最小单位。
知乎上有位大佬的比喻我觉得十分的形象有助于理解。
浏览器是多进程的,浏览器的进程有:
浏览器渲染进程内部又是多线程的:
运行机制是:宏任务 -> 微任务 -> 调度 GUI 渲染线程 -> 宏任务……
对于浏览器渲染机制,我找到一篇【图解浏览器渲染原理及流程】,想要详细了解和深入理解的大家应该看完就可以了
说完渲染流程不可避免会提到重绘和回流:
阻塞解析:阻塞点后面的标签不会被解析,阻塞解析不一定会阻塞其他外部资源的加载
阻塞渲染:阻塞点后面的标签会继续被解析,img,link等会继续发送请求获取外部资源,但不会触发页面渲染(白屏 ),也不会执行 JavaScript 代码
阻塞渲染的情况:
JS
a. 尽量放在body后面
b. 使用defer和async
defer 在下载完成以后立即异步加载,加载后等待DOM树构建好再执行async 在下载完成后立即异步加载,加载后立即执行JS代码。
CSS
a. style: GUI直接渲染。如果css少,尽量内嵌
b. link 浏览器派发新的线程(HTTP线程)去加载资源文件,GUI渲染进程会继续向下渲染代码
c. @import GUI渲染进程会暂时停止,去服务器加载文件,资源返回之前不会继续渲染
DOM树和CSSOM树
a. 减少HTML文件的代码层级
b. 使用语义化标签
c. 减少CSS代码的成绩
减少回流和重绘
a. 尽量不要使用table布局
b. 位置变换尽量使用transform
c. 不频繁操作元素样式,可以修改类名
d. 使用absolute和fixed,使元素脱离文档流,新建图层
浏览器自身的优化
将所有的回流和重绘操作放在一个队列,固定间隔或者固定内存进行一次批处理。
浏览器缓存机制其实就是HTTP缓存,由HTTP报文的缓存标识决定
缓存位置有四种,优先级如下:
以上四种缓存都没有命中的时候,才会向服务器发送请求。
服务器接收到请求以后,会根据响应报文中的HTTP请求头的缓存标识来决定是否缓存。
向浏览器缓存中查找请求结果,然后根据该结果的缓存规则来决定是否使用该缓存结果的过程。
强缓存的设置通过两种HTTP Header:Expires 和 Cache-Control, HTTP1.1以后不再使用Expires
强制缓存的情况主要由三种:
Cache-Control
主要用于控制网页缓存,有很多值:
public
标识响应可以被客户端、代理服务器缓存
private
只有客户端缓存(默认取值)
max-age
缓存秒数
no-store
任何内容都不缓存
no-cache
被缓存但下次请求时,需要验证是否过期(协商缓存)
协商缓存生效时,服务器返回304和not Modified,意思是该资源无更新,直接从浏览器缓存中读取
协商缓存设置header头:Last-Modified 和 ETag
Last-Modified是服务器返回资源的同时,添加在response header中的,值是资源在服务器上最后的修改时间
If-Modified-Since 是浏览器第二次请求的时候加在header头中的,值是Last-Modified的值
ETag是服务器返回的当前资源的唯一标识,只要资源变化,就重新生成ETag
浏览器发送请求的时候就会将ETag的值放在If-None-Match中
强缓存不会向服务器发送请求,而是直接在浏览器缓存中取值
强缓存不生效时才会使用协商缓存,就是向服务器发送请求来决定要不要使用浏览器中的缓存数据
普通的F5刷新,页面只是普通的刷新一下,获取数据啥的,该强制缓存就强制缓存、该协商就协商
强制刷新Ctrl + F5,浏览器会清空缓存,重新下载资源,并且请求头中也不会有if-None-Macth和if-modified-Since,强迫服务器不准返回304,而是返回一份真正的数据。
解决办法:
Cookie、LocalStorage、SessionStorage区别
前端储存的方式有哪些