浏览器-知识点总结

浏览器的内存模型

  • 浏览器进程(主进程)
  • 网络进程(子进程)
  • 渲染进程(子进程)
    每打开一个新的标签页 都会由主进程开启子进程 其中渲染进程开启渲染主线程 在其中执行所有的前端代码

渲染主线程

浏览器内最繁忙的线程 里面的执行机制——事件循环在这里插入图片描述

事件循环

先微后宏

  • 微任务
    process.nextTick(与普通微任务有区别,在微任务队列执行之前执行)
    new Promise().then(回调)等。
  • 宏仁务
    web worker
    setTimeout
    setInterval
    setImmediate
    script(整体代码)
    I/O 操作等

现在的新说法:因为任务的类型越来越多 同样的任务需要放在同一个队列 所以宏仁务的概念改成了队列优先级:(保留微任务的说法)微任务>交互队列(点击事件)>延时队列(定/延时器)

URL到整个页面加载完毕显示在屏幕上的整个流程

主要是2个过程:网络(获取HTML文档)+渲染(解析HTML文档)

网络的过程:

输入网址
DNS解析
客户端与服务端3次握手建立TCP连接
客户端发送HTTP请求
服务器处理并响应请求
客户端获取到HTML文档

当网络线程获取了HTML文档后,会产生1个渲染任务,传递到渲染主线程的消息队列;
在事件循环机制的作用下,渲染主线程拿出消息队列的该渲染任务并执行
在这里插入图片描述

渲染的过程:

根据html代码生成DOM树
根据css代码生成CSSOM
将DOM树和CSSOM整合形成Render树
根据render树渲染页面
遇到script标签则暂停渲染
优先加载并执行js代码
直至渲染完成Render树

在这里插入图片描述

页面展示过程

Javascript:负责业务交互逻辑
Style:根据CSS对每个DOM元素匹配样式
Layout:计算DOM元素显示在屏幕的位置大小
Paint:由多个渲染层完成DOM元素的可视效果
Composite:每层绘制完成后将所有的层依序合并为一个图层显示到屏幕

DNS 预解析

DNS Prefetching:具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,减少等待时间,提升用户体验

浏览器对网站第一次的域名DNS解析查找流程依次为:
浏览器缓存
系统缓存
路由器缓存
ISP缓存
递归搜索
DNS预解析的实现
  1. meta标签告知浏览器需要DNS预解析:
<meta http-equiv="x-dns-prefetch-control" content="on" />
  1. link标签强制对DNS预解析:
<link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />

注意:dns-prefetch需慎用,多页面重复DNS预解析会增加重复DNS查询次数

垃圾回收机制(GC)

  • 标记清除
  • 引用计数

常见的内存泄露

  1. 闭包
  2. 全局变量
  3. 事件绑定没有移除
  4. 定时器setInterval() 、setTimeout()
  5. jQuery里对 DOM 的引用
  6. 控制台日志 console
  7. 彼此引用的对象产生的循环(需要手动断开引用)

解决方法:

  • 重复测试单一脚本
  • 在开发者工具里手动GC
  • 借助浏览器的任务管理器分析内存占用

跨域

出于浏览器的同源策略Sameoriginpolicy限制:协议(protocol),主机/域名(host)和端口号(port)三者任一不同

解决方法

  1. JSONP
  2. CORS
  3. WebSockets
  4. WebPack协议跨域
  5. Proxy代理
  6. Nginx反向代理
  7. 跨文档通信API:window.postMessage()
  8. 设置document.domain解决无法读取非同源网页的 Cookie问题(仅限主域相同,子域不同的跨域应用场景)

解决方法

  1. JSONP
  2. CORS(必须与服务器一起配置)
  3. WebSockets
  4. WebPack协议跨域
  5. Proxy代理
  6. Nginx反向代理
  7. 跨文档通信API:window.postMessage()
  8. 设置document.domain解决无法读取非同源网页的 Cookie问题(仅限主域相同,子域不同的跨域应用场景)

JSONP实现原理

后端将数据转换成JSON格式然后包装成函数,通过js传递给前端进行对应的函数解析(利用了浏览器对标签的限制较小)

  • 缺点:只能进行GET请求
  • 优点:兼容性好,在一些古老的浏览器中都可以运行
// 定义解析函数
function jsonpCallback(data) {
  console.log(data);
}

// 动态创建script标签并设置src
function fetchJSONP(url) {
  const script = document.createElement('script');
  script.src = url;
  script.onload=function(){
    script.remove();
  };
  document.body.appendChild(script);
}

// 调用JSONP请求
fetchJSONP('http://example.com/api/data?callback=jsonpCallback');
const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
    const queryData = url.parse(req.url, true).query;
    const callback = queryData.callback;

    // 数据
    const data = {
        name: 'John',
        age: 30
    };

    // 将数据转换成JSONP格式
    const jsonData = JSON.stringify(data);
    const responseText = `${callback}(${jsonData})`;

    // 设置响应头
    res.writeHead(200, {'Content-Type': 'application/javascript'});
    res.end(responseText);
});

const PORT = 3000;
server.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

Ngnix反向代理

Ngnix反向代理
监听localhost主机的2222端口;
api的所有请求都转发到3333端口,同时加上header请求头

LocalStorageSessionStorageCookieSessionToken

在这里插入图片描述

LocalStorageSessionStorageCookieSessionToken
存储位置客户端客户端/服务端
存储类型字符串任意类型
增/改、删、查、清setItem()、getItem()、removeItem()、clear()都是操作document.cookie/
存储大小10M5M4K/
兼容性H5H4 / H5/
语法简易复杂/
有效期永久:需手动清除仅当前会话有效在设置的有效期后过期由服务器管理/
与服务端通信×携带在HTTP请求头信息中无需额外措施需要额外措施,如 CSRF Token
页面共享不同顶级窗口不共享同域名不同端口可共享不可直接访问JS可直接访问
易用性可以接受原生/封装接口,对Object/Array支持更好原生接口不友好,需要手动封装不可直接访问
适用场景不需要与服务端通信的数据需要与服务端通信的数据
数据传输/在请求头传输在请求头/请求体传输/
前端访问JS可直接访问不可直接访问JS可直接访问
CSRF防护需要额外措施,如设置同源策略/需要额外措施,如 CSRF Token/需要额外措施,如 CSRF Token
安全性相对较高,但仍存在 XSS 攻击风险低,容易受到 XSS 攻击相对较低,容易受到 CSRF、XSS 攻击相对较高,但仍存在 XSS 攻击风险高,提供 CSRF 防护机制
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘泽宇Developer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值