webpack proxy如何解决跨域问题

 更新时间:2023年10月24日 15:46:13   作者:嚣张农民  
webpack proxy,即webpack提供的代理服务,基本行为就是接收客户端发送的请求后转发给其他服务器,本文给大家介绍了webpack proxy如何解决跨域问题,感兴趣的朋友跟随小编一起看看吧

webpack proxy如何解决跨域?

一、是什么

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

使用webpack的proxy来解决跨域

使用webpack的proxy来解决跨域问题

什么是跨域

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的。javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

解决思路

使用前端服务IP和端口来访问后端接口地址,然后通过webpack的代理,访问实际的接口地址。就是遵守浏览器的游戏规则。

注意点:

axios的base_url一定是自己本地的,可以不写,默认就是当前服务地址。

target是后端的接口地址,也就是说我们在vue.confjg.js里面的taget写的是实际的请求地址。

可以使用webpack_proxy来解决跨域(主要说的是这里)

vue.config.js

const {defineConfig} = require('@vue/cli-service')
module.exports = defineConfig({
    transpileDependencies: true,
    devServer: {
        proxy: {
            "/api": {
                target: process.env.VUE_APP_BASE_URL, // todo 请注意,这里是后端的地址,这里不是本地的!!!!
                ws: false, // websocket
                secure: false, // 是否支持https
                changeOrigin: true, // 是否跨域
            }
        }
    }
})


.env.development

env="development"
VUE_APP_BASE_URL = "http://localhost:8000"

Api.ts

/*
@description:
@auther: alex
@data: 12/23/22
*/
import axios, {AxiosResponse} from "axios";

// const instance = axios({
//     method: "post",
//     baseURL: "", // 因为要启用代理,所以所以这里可以不用写,默认为当前服务的IP和端口
//     timeout: 10000,
// })

const instance = axios.create({
    method: "post",
    baseURL: "",
    timeout: 10000,
})
export const post = (url: string, params: any): Promise<AxiosResponse> => {
    return instance.post(url, params)
}

export const get = (url: string, params: any): Promise<AxiosResponse> => {
    return instance.get(url, params)
}


到此这篇关于webpack proxy如何解决跨域?的文章就介绍到这了,更多相关webpack proxy解决跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Emberjs 通过 axios 下载文件的方法

    Emberjs 通过 axios 下载文件的方法

    这篇文章主要介绍了Emberjs 通过 axios 下载文件的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Bootstrap插件全集

    Bootstrap插件全集

    这篇文章主要为大家详细介绍了Bootstrap插件,包括Bootstrap过渡效果插件、Bootstrap下拉菜单插件等,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 跟我学Nodejs(三)--- Node.js模块

    跟我学Nodejs(三)--- Node.js模块

    这是本系列的第三篇文章了,前面2篇网友们反馈回来不少的消息,加上最近2天比较忙,一直没来得及整理,周末了,赶紧给大家整理下发出来,本文讲的是node.js模块
    2014-05-05
  • JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】

    JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】

    这篇文章主要介绍了JS+HTML5实现的前端购物车功能插件,结合完整实例形式分析了JS结合HTML5的storage特性存储数据实现购物车功能的相关操作技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2016-10-10
  • 原生js滑动轮播封装

    原生js滑动轮播封装

    这篇文章主要为大家详细介绍了原生js滑动轮播封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • JS实现slide文字框缩放伸展效果代码

    JS实现slide文字框缩放伸展效果代码

    这篇文章主要介绍了JS实现slide文字框缩放伸展效果代码,涉及JavaScript响应鼠标事件动态操作页面元素属性的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 微信小程序实现录音播放录音功能

    微信小程序实现录音播放录音功能

    在微信小程序中,实现录音及播放功能需用到录音管理器wx.getRecorderManager()和innerAudioContext对象,调用play方法播放,结合表单,可以添加录音和播放按钮,用数据绑定保存路径,注意上传服务器保存录音文件以便持久化存储
    2024-10-10
  • Worker加载JS脚本跨域问题的几种解决方法

    Worker加载JS脚本跨域问题的几种解决方法

    Web Worker 是一种在后台线程中运行的 JavaScript 脚本,允许我们在不阻塞主线程的情况下执行复杂计算或处理,Worker 加载的 JS 脚本如果存在跨域问题,可能导致脚本无法正常加载和执行,以下是解决 Worker 加载 JS 脚本跨域问题的几种方法,需要的朋友可以参考下
    2025-02-02
  • js实现横向拖拽导航条功能

    js实现横向拖拽导航条功能

    本文主要介绍了js实现横向拖拽导航条功能的方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 微信小程序canvas截取任意形状的实现代码

    微信小程序canvas截取任意形状的实现代码

    这篇文章主要介绍了微信小程序canvas截取任意形状的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01

最新评论