网络

85 阅读3分钟

1. 跨域

1.1 webpack或者vite中可以使用proxy解决跨域,它解决跨域的原理是什么?

Webpack 或者 Vite 中的 proxy 功能是一个开发时功能,通常在开发环境中使用,用于解决跨域问题。它的原理是基于 Node.js 提供了一个 HTTP 代理服务器。

具体来说,当你在前端发起一个请求时,如果这个请求匹配到了开发服务器的 proxy 规则,这个请求会被重定向到另一个你设定的服务器上,然后开发服务器将获得响应返回给前端。因为你的前端代码实际上是发送请求到同源的开发服务器,因此不存在跨域问题。

PS: 此方法只能适用于开发环境,在生产环境需要通过后端服务器做代理,或者使用 CORS 等策略。

1.2 为什么跨域的时候有时候请求会发两次?

当遇到跨域问题的时候,有些请求可能会发送两次,这通常是因为跨域请求进行了预检(Preflight)。

预检请求是一种由浏览器自动发起的请求,其目的是为了检查实际请求是否安全。预检请求是一种 HTTP OPTIONS 请求,它会在实际的请求被发送之前被发送。

以下情况浏览器会发送预检请求:

1.请求方法是除 GET、HEAD、POST 之外的 HTTP 方法,如 PUT、DELETE 等;

2.POST 请求 Content-Type 是除 applicant/x-www-form-urlencoded、multipart/form-data、text/plain 之外的类型,如 application/json;

3.请求设置了自定义的 header 字段。

当遇到以上情况,浏览器会先发送一个 OPTIONS 请求到服务器,询问服务器是否允许跨域请求。如果浏览器允许,浏览器才会发送实际的请求。

2. HTTP

2.1 HTTP 版本

  1. HTTP/0.9
  • 只支持 GET 请求方式,且请求由单行指令构成,后面跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。
  1. HTTP/1.0
  • 支持 POST、HEAD 请求方式,而 PUT、DELETE 是 1.1 时代才有的
  • 增加了请求头和响应头,在通信中指定了协议版本号
  • 扩充传输内容格式:图片、音视频资源、二进制

缺点:

  • 短连接:每次通信都需要重新创建 TCP 链接
  • 队头阻塞:单通道传输,前一个传输时间很长,那么就会阻塞后面的资源传输
  1. HTTP/1.1
  • 长连接:新增 Connection 字段,默认为 keep-alive,可以保证连接不断开,如此就可以复用底层 TCP 连接,节省了多次建立 TCP 连接的大量时间

  • 管道化

    • 无管道:请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3
    • 有管道:请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3
    • 缺点:
      • 即使服务器先准备好响应2,也是按照请求顺序先返回响应1,因此并没有彻底解决队头阻塞的问题
  • 缓存处理:当浏览器发送请求时,先查看是否有缓存,有则直接读取,没有则发送请求,通过设置 Cache-Control 来控制缓存

  • 断点传输:在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率

  1. HTTP/2.0
  • 可以二进制传输,而且将 head 和 body 分成帧传输
  • 多路复用
  • 压缩 head
  • 支持服务器推送