说说webpack proxy工作原理?为什么能解决跨域?

news/2024/9/20 10:34:52

一、是什么

webpack proxy,即webpack提供的代理服务

基本行为就是接收客户端发送的请求后转发给其他服务器

其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制)

想要实现代理首先需要一个中间服务器,webpack中提供服务器的工具为webpack-dev-server

webpack-dev-server

webpack-dev-server是 webpack 官方推出的一款开发工具,将自动编译和自动刷新浏览器等一系列对开发友好的功能全部集成在了一起

目的是为了提高开发者日常的开发效率,只适用在开发阶段

关于配置方面,在webpack配置对象属性中通过devServer属性提供,如下:

// ./webpack.config.js
const path = require('path')module.exports = {// ...devServer: {contentBase: path.join(__dirname, 'dist'),compress: true,port: 9000,proxy: {'/api': {target: 'https://api.github.com'}}// ...}
}

devServetr里面proxy则是关于代理的配置,该属性为对象的形式,对象中每一个属性就是一个代理的规则匹配

属性的名称是需要被代理的请求路径前缀,一般为了辨别都会设置前缀为/api,值为对应的代理匹配规则,对应如下:

  • target:表示的是代理到的目标地址
  • pathRewrite:默认情况下,我们的 /api-hy 也会被写入到URL中,如果希望删除,可以使用pathRewrite
  • secure:默认情况下不接收转发到https的服务器上,如果希望支持,可以设置为false
  • changeOrigin:它表示是否更新代理后请求的 headers 中host地址

二、工作原理

proxy工作原理实质上是利用http-proxy-middleware 这个http代理中间件,实现请求转发给其他服务器

举个例子:

在开发阶段,本地地址为http://localhost:3000,该浏览器发送一个前缀带有/api标识的请求到服务端获取数据,但响应这个请求的服务器只是将请求转发到另一台服务器中

const express = require('express');
const proxy = require('http-proxy-middleware');const app = express();app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
app.listen(3000);// http://localhost:3000/api/foo/bar -> http://www.example.org/api/foo/bar

三、跨域

在开发阶段, webpack-dev-server 会启动一个本地开发服务器,所以我们的应用在开发阶段是独立运行在 localhost的一个端口上,而后端服务又是运行在另外一个地址上

所以在开发阶段中,由于浏览器同源策略的原因,当本地访问后端就会出现跨域请求的问题

通过设置webpack proxy实现代理请求后,相当于浏览器与服务端中添加一个代理者

当本地发送请求的时候,代理服务器响应该请求,并将请求转发到目标服务器,目标服务器响应数据后再将数据返回给代理服务器,最终再由代理服务器将数据响应给本地

 

在代理服务器传递数据给本地浏览器的过程中,两者同源,并不存在跨域行为,这时候浏览器就能正常接收数据

注意:服务器与服务器之间请求数据并不会存在跨域行为,跨域行为是浏览器安全策略限制

参考文献

  • https://webpack.docschina.org/configuration/dev-server/#devserverproxy

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

AST 简述

AST 是源代码的抽象语法结构的树状表示。利用它可以还原混淆后的js代码。 @babel/parser 是js语法编译器 Babel 的 nodejs 包,内置很多分析 js 的方法,可以实现js到AST的转换。 JS 转为 AST:https://astexplorer.net/ 准备工作: 需安装nodejs环境以及babel,babel 安装: n…

arco-init 项目初始化失败!Error: spawnSync pnpm.cmd ENOENT

今天使用arco创建项目时初始化失败,失败截图: 只需要安装 npm i -g pnpm 就可以了,不需要做额外配置,之后再初始化项目arco init hello-arco

小程序框架是智能融媒体平台构建的最佳线路

2023年,以AIGC(人工智能生产内容)为代表的人工智能技术加速迭代演进,媒体融合进入媒体智能化快速发展新时代。过去5年,媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下:新闻终端的端侧内容矩阵建设,如App新闻端,社交平台上的官…

高效调度新篇章:详解DolphinScheduler 3.2.0生产级集群搭建

转载自tuoluzhe8521导读:通过简化复杂的任务依赖关系, DolphinScheduler为数据工程师提供了强大的工作流程管理和调度能力。在3.2.0版本中,DolphinScheduler带来了一系列新功能和改进,使其在生产环境中的稳定性和可用性得到了显著提升。 为了帮助读者更好地理解和应用这一版…

k8s-Service资源

Service资源的作用: 因为k8s是使用RC来管理保证它的高可用,RC是管理k8s pod的.如果一个pod挂掉了,就会马上自动启动一个可用的pod,那么新的pod的IP肯定就是新的。如果是采用端口映射的话,就会出现刚配置好的pod端口和ip 在pod挂了后 新的pod被启动了 新pod又是一个新的ip,…

串口通信原理

异步串行:异步说明不带时钟信号,串行说明是按位(一位=8bit),一位一位传输

ESP32-P4 --- vscode 指定用哪个 ESP-IDF

vscode 可以安装多个 ESP-IDF,如下但是只有一个 ESP-IDF 可以生效,要生效哪个,就点哪个,弹出如下表示生效成功

Delphi DX10.2安装TeeChartPro2022找不到指定文件

1、显示报错TeeChart Pro Compilation started: 2024-05-15 17:12:48 Win32 v25 Enterprise (Delphi 10.2 and C++Builder 10.2 Update 3) (C++) ERROR Tee925 This version of the product does not support command line compiling. TeeUI925 This version of the product do…