webpack跨域问题:解决webpack跨域的三种方式

标签: 其他

解决webpack跨域的三种方式
1.使用代理
2.模拟数据
3.前端启动到服务端上

webpack跨域问题

演示文件目录展示:
在这里插入图片描述
创建server.js文件来开启服务,模拟数据请求

// server.js
let express = require('express');
let app = express();

app.get('/api/user',(req,res)=>{
    res.json({name:'小白'})
})

app.listen(3000)

在这里插入图片描述
src->index.js文件中发送请求:

// index.js
let xhr = new XMLHttpRequest();
xhr.open('GET','/api/user',true);
xhr.onload = function() {
    console.log(xhr.response)
}
xhr.send()

这个时候,当我们npm run dev后,访问http://localhost:8080/,出现错误:
在这里插入图片描述
我们应该请求的是http://localhost:3000/api/user,而不是http://localhost:8080/api/user;这里产生了跨域问题;
那么,如何配置webpack来解决呢?
配置:
webpack.config.js中配置:

devServer:{
    proxy:{
        '/api':'http://localhost:3000'  // 配置了一个代理: 如何访问的是/api开头,就去http://localhost:3000这里找
    }
},

这样子就可以成功请求到http://localhost:3000/api/user的数据:
在这里插入图片描述
这里有一个问题,不一定所有的接口都是以/api开头的,按照上面的配置写法,如果有其他开头的接口请求,那我们还需要在下面配置不同开头对应的代理地址;
这里,我们可以这样配置:

// server.js
let express = require('express');
let app = express();

app.get('/user',(req,res)=>{
    res.json({name:'小白2'})
})
app.listen(3000)
// index.js
let xhr = new XMLHttpRequest();
xhr.open('GET','/api/user',true);
xhr.onload = function() {
    console.log(xhr.response)
}
xhr.send()

webpack.config.js中配置:

devServer:{
    proxy:{  // 重写的方式,把请求代理到express服务器上
        '/api':{
            target:'http://localhost:3000',
            pathRewrite:{'/api':''} // 把/api 替换为空
        }
    }
},

如上配置,就可以将前端以/api开头的请求代理到指定的服务端地址http://localhost:3000,并且会把请求地址的/api去除;

如果想直接在webpack里模拟数据可以这样配置:

devServer:{
    // 模拟数据
    before(app){
        app.get('/user',(req,res)=>{
            res.json({name:'小白'})
        })
    }
},
// index.js
let xhr = new XMLHttpRequest();
xhr.open('GET','/user',true);
xhr.onload = function() {
    console.log(xhr.response)
}
xhr.send()

如果自己有服务端,不用代理来处理;

就可以在服务端中启动webpack,端口用服务端端口
需要安装webpack-dev-middleware:它可以让我们在服务端启动webpack

npm i webpack-dev-middleware -D

代码:

// server.js
let express = require('express');
let app = express();
let webpack = require('webpack');

let middle = require('webpack-dev-middleware');
let config = require('./webpack.config.js');
let compiler = webpack(config);

app.use(middle(compiler))

app.get('/user',(req,res)=>{
    res.json({name:'小白2'})
})
app.listen(3001)
// index.js
let xhr = new XMLHttpRequest();
xhr.open('GET','/user',true);
xhr.onload = function() {
    console.log(xhr.response)
}
xhr.send()

运行效果:
在这里插入图片描述
在这里插入图片描述

总结:解决webpack跨域的三种方式

1. 使用代理:服务端是别人的,使用这个方式
devServer:{
    proxy:{  // 重写的方式,把请求代理到express服务器上
        '/api':{
            target:'http://localhost:3000',
            pathRewrite:{'/api':''} // 把/api 替换为空
        }
    }
},
2. 前端模拟数据
devServer:{
    // 模拟数据
    before(app){
        app.get('/user',(req,res)=>{
            res.json({name:'小白'})
        })
    }
},
3. 服务端是自己写的,就可以把前端代码启动到服务端上
// server.js
let express = require('express');
let app = express();
let webpack = require('webpack');

let middle = require('webpack-dev-middleware'); // 引入这个
let config = require('./webpack.config.js');    // 配置文件
let compiler = webpack(config);

app.use(middle(compiler))

app.get('/user',(req,res)=>{
    res.json({name:'小白2'})
})
app.listen(3001)

在这里插入图片描述

版权声明:本文为weixin_40693643原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40693643/article/details/105122709

智能推荐

解决跨域的三种方法

解决跨域的三种方法 一.为什么会产生跨域问题? 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。 当一个请求的url的协议、域名、端口三者只要有一个与当前页面的u...

IDEA下Spring项目报错-could not autowire. no beans of“” type found

把一个eclipse的项目导入到IDEA,发现项目打开就报错:-could not autowire. no beans of“” type found。 在eclipse下面没有问题 项目编译和运行没有问题。 原因 网上搜索了一下原因。 spring auto scan配置,在编辑情况下,无法找不到对应的bean,于是提示找不到对应bean的错误。常见于mybatis的m...

!HTML制作APP注册页面,利用form等标签,达到想要的结果,以帮助自己了解html的排版和页面的问题,我们的css中的代码。对于页面有着至关重要的效果,如果出现问题,就要更加小心,其中的问题,

首先建立一个基本框架,已搭建根本的服务 然后我们深刻体会其中的知识点。 在我们建立表单的时候,一定要注意的是,对于一些选项,只能选择一个,不然就会出像笑话了。 比如:性别,等,一个不可以出现两种性别,特殊不在讨论范围,大众的来说,不可以出现这样的错误。 以下是css3 的代码。我们是要把其中的代码代表意思搞懂,不如也是一个。“码农” 效果如下: 今天的文章就到这里,有更好的...

iOS 从app中分享出小程序

1、小程序缩略图的图片比例是:5:4,图片在分享过程中会被微信进行二次压缩,如果出现图片模糊的情况,可以修改成一张稍微高质量的图片,但是大小要小于128K 2、需要小程序的原始ID:   gh_xxxxxxxx 一定是gh开头的 3、需要path:pack-xxxx/xxxxx/xxxxxx  类似这种 4、使用微信分享方法,我这里用的是原生微信分享,没有使用第三方 ...

猜你喜欢

grbl脱机控制器

grbl脱机控制器 1年前因为研究自动写字机,所以渐渐萌生出做一台cnc控制器的想法,因为原来自己也研究过自动化控制,所以对于步进电机的控制还算熟悉,但由于精力的原因没有整出一个完整的控制框架,今年正好疫情严重导致自己也没啥事,所以花点时间做了一整套的东西。 然后还要说明的是,标题虽然是是grbl的脱机控制器,但实际和grbl一点关系都没有,做个标题党,吸引下点击率,这套控制系统从头到尾都是自己一...

leetcode24:两两交换链表中的节点(java实现)

    需求 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。   示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 分析 奇数&偶数:链表整体长度为偶数时可以两两进行,奇数时最后一个数位置不变 具体实现:链表反转位置,并且其前...

pycharm+pyqt5+QtDesigner+pyUIC第一个pyqt5程序

安装pyqt5和pyqt5-tools 在tools中添加QtDesigner和PyUIC QtDesigner在"./Lib/site-packages/pyqt5_tools/Qt/bin"下,具体视python安装目录而定。PyUIC目录为"./Scripts/pyuic5.exe"。 在pycharm中,File->Settings->T...

如何编写智能合约(Smart Contract)?(III)建立标准代币部落币「BLC」

在上一篇中,我们我们如何编写智能合约?(II) 建立简易的加密代币,但是它存在很多安全问题,在本章中,我们将一步步带领大家创建一个能够放到以太币钱包的加密代币。 创建项目 有别于之前使用truffle init指令来初始化项目,在Truffle推出Boxes功能之后,我们可以直接套用称作react-box的样板,此样板已经整合create-react-app,可以直接用它来开发react web,...

Ionic3 自定义组件实现图片懒加载效果

在使用ionic3的过程中,我们可以使用angularjs的组件特性进行组件的自定义开发,对一些特定条件下的需求开发对应的组件。 下面我们就通过自定义组件来实现图片的懒加载效果。当我们需要加载的图片很大,但是我们又不愿意做压缩让图片失真,所以我们需要使用图片的懒加载效果。 实现流程 首先新建一个img-lazy-load组件: 会在src目录下生成一个components文件夹,里面包含img-l...