浏览器多进程到JS单线程(JS运行机制)
1.进程和线程
进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)
线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)
2.浏览器进程(多进程)
Browser进程(管理资源),第三方插件进程,GPU进程(3D绘制),浏览器渲染进程
3.浏览器内核(渲染进程)
1.GUI渲染线程(构建DOM树和Render树,布局绘制回流重回等)
2.JS引擎线程(处理js脚本)
3.事件触发线程(用来控制事件循环)
4.定时触发器线程(定时器所在的线程)
5.异步HTTP请求线程(XMLHttpRequest对象请求的线程)
GUI渲染线程与JS引擎线程互斥,JS阻塞页面加载
4.EventLoop
宏任务:script,setTimeout,setInterval,Dom事件
微任务:promise.then()
同步任务会在调用栈中按照顺序等待主线程依次执行,异步任务会在异步任务有了结果后,将注册的回调函数放入任务队列中等待主线程空闲的时候(调用栈被清空),被读取到栈内等待主线程的执行。
过程:执行栈在执行完同步任务后,就会去执行微任务,然后检查微任务队列是否为空,如果为空就会去执行宏任务
Cookie,session,token的区别
1.cookie和session
存储:cookie存储在客户端,session存储在服务端
类型:cookie只能存字符串数据,session可以存任意数据类型
有效期:cookie可以设置为长时间保存,session客户端关闭或超时会失效
存储大小:cookie保存数据不超过4K,session存储理论无线,但是耗费性能
2.session和token
状态:session可以记录会话信息,是服务端有状态化,token是令牌不会存储会话信息
安全性:身份认证token安全性比session好
输入一个url发生了什么
1.DNS查址
浏览器会从浏览器自身缓存中查找是否有目标域名和对应的IP地址
从本地电脑的hosts文件查找是否有存储DNS信息
从路由器的缓存DNS信息中查找
ISP DNS缓存查找,从网络服务商(比如电信)的DNS缓存信息中查找
2.TCP三次握手
第一次握手:客户端发送syn包(j),等待服务器确认
第二次握手:服务端收到syn包,确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包
第三次握手:客户端收到SYN包和ACK包,向服务器发送确认ACK包(ack=k+1)完成链接
3.HTTP缓存
判断服务器响应头中的Expires和cache-control(数据到期时间,Cache-Control优先级更高),如果资源没有过期就会读取缓存,如果资源过期,没有命中强缓存,就会去进行协商缓存,对比Eatg和If-none-Match(服务器资源唯一标识),如果不符合,就对Last-Modified和If-Modified-Since(资源最后修改时间)进行对比,若最后修改时间较旧,说明资源无新修改,响应HTTP 304 走缓存
4.客户端发送请求
5.服务端返回资源
6.解析文件,渲染界面
解析HTML,CSS生成reander树进行页面渲染(JS代码会进行阻塞)
js会修改css样式表,操作dom,会对渲染产生阻塞
define:JS脚本先不执行,延迟到文档解析和显示后执行,有顺序
async:异步加载脚本,无法保证加载执行顺序
网络安全问题
1.XSS攻击
XSS攻击是页面被注入恶意代码
在url,评论框中注入脚本(JS代码块)
1.编码转义
2.过滤相关属性
3.HTTPOnly
2.CSRF攻击
1.加入验证码
2.使用referer验证
3.Token