一、线程与进程
1、常见进程、线程
- http请求:通过一个线程发送;
- JS:通过单线程执行;
- 浏览器:多线程的进程
2、两者关系
- 进程中某个线程执行出错导致整个进程崩溃;
- 进程之间互相隔离,可通过IPC机制通信;
- 进程所占资源在其关闭后被操作系统回收,即使某个线程产生内存泄漏,进程退出时相关内存资源也会被回收;(关机重启)
- 线程之间通信更方便,共享进程的数据。
3、浏览器
- 早期是单进程,一个线程出错浏览器崩溃;
- 2008,谷歌浏览器:多进程,进程间IPC通信,浏览器不容易崩溃;
- 主进程、GPU(图形处理单元)进程、插件进程、网络进程、渲染进程(内核):让每个标签页成为一个独立的进程;
- 这样某个进程出错也不影响其他的进程;
- shift+esc:打开浏览器的任务管理器,查看进程;
4、建立HTTP请求
-
1、DNS解析
-
2、通信链路的建立(一次请求的过程);都是客户端先发。
- TCP/IP面向有连接的通讯协议,数据传输前需要建立客户端与服务端的连接,于是【三次握手:客户端>服务端,服务端>客户端(证明能收到客户端消息),客户端再握手服务端(证明可以收到服务端消息),最后发送数据】
- 【四次挥手】:确保请求与响应都发完了;
-
3、反向代理服务器:负载均衡、防火墙、加密、压缩、静态资源缓存、解决跨域等,nginx、iis、apache;
-
4、后端处理:验证、处理、响应;
-
5、浏览器缓存
-
6、关键渲染路径:解析html、css,构建DOM、CSSOM对象结构;
-
7、渲染绘制:结合为render tree(要用于显示的具体对象,被隐藏的标签这里就没有了);
二、优化
1、DNS优化:
- 减少DNS查找:
- 浏览器自带缓存(1min);
- 前端预解析,用于快速找到静态资源服务器如
<link ref="dns-prefetch" href="//tce.taobao.com" />
(异步的); - 同一个服务器有2~4个域名比较合适,可以突破浏览器对单个域名同时可发送6个请求的限制;但域名过多也不好,会增加DNS查找;
2、http缓存
一般静态资源通过nginx设置缓存方式,动态资源就是后台能代码设置缓存;
总结:缓存配置都是服务端做,通过响应头;
强制缓存(优先级低):响应头Cache-control: maxage=3600;
或优先级更低的Expires:***;
协商缓存(优先级高):响应头Cache-Control:no-cache; etag:***;
、请求头if-none-match:***
ps:Cache-Control:no-store;
本请求不开启缓存(即不会被存储在浏览器或代理服务器),如用户敏感信息;
- 强缓存:浏览器第一次请求后缓存资源,只要小于这个时间段就直接用缓存,不再发任何请求;
- 怎么使用:服务端设置响应头【
Expires
或Cache-Control
】; - 早期【
Expires
】:有缺点-设置的时间可能与客户端本地不一样,导致缓存失效; - 现在【
Cache-Control
】:http1.1新增,通过设置时长,解决上述缺点;
- 怎么使用:服务端设置响应头【
Response Headers //浏览器显示的响应头
Expires:Sat Mar 26 2022 21:06:46 GMT+0800 //后端发字符串形式
Cache-control: maxage=3600;//单位:秒
- 协商缓存:当可以用本地缓存时,每次使用本地缓存之前,还是要发 get 请求询问一下;
- 怎么开启:服务端设置【
Cache-Control:no-cache
,Last-modified
】; - 过程:
- 通过【no-cache`】,客户端知道使用浏览器缓存前先询问这个资源是否有效或过期;
- 通过【
Last-modified
】会在询问的请求头自动设置【if-modified-since
】,告诉服务器上次修改是这个时间,你对比一下是否是最后一次修改,如果是就返回304;如果不是就返回200+最新的资源; - 【
Last-modified
】:只是用这个字段也有问题,就是当资源改了名有改回来了,内容没有变但是因为修改时间变了,所以还是会导致使用缓存失败;所以引入了响应头【ETag
】; - 【
ETag
】:通过文件内容生成hash字符串;内容不变值不变;同样的也是给后端用,客户端以请求头【if-none-match
】传回来用于对比;
- 怎么开启:服务端设置【
//服务端设置响应头
res.setHeader('Cache-Control','no-cache')
res.setHeader('last-modified',[获取文件修改时间字符串格式])
3、缓存策略
有时希望使用强缓存让客户端更快拿到,但又不能同步更新;
所以目前主流方案,针对不同资源进行分类:
协商缓存:html页面
;
强缓存:静态资源;如图片
(因为一般同一个地址内容不会变,要改就直接换名地址也变了,随着html页面更新)、css文件
(如果样式改变,打包的样式名也变了,地址改变就会重新请求,地址不变就可以直接用缓存文件)、js
(同css,文件内容改变直接改文件名,另外如果有敏感信息不想让代理缓存,可以添加private
属性);