一、什么是跨域
跨域指的是在浏览器中,一个正在运行在域名或端口号不同的JavaScript程序试图访问另一个JavaScript程序的资源。
跨域产生的原因是浏览器的同源策略,即JavaScript只能访问与当前页面主机名、协议、端口号相同的资源。
例如,当前网页URL为 http://www.example.com/
,那么同源策略只允许JavaScript访问URL为 http://www.example.com/
的资源。
二、为什么需要配置跨域
需要跨域访问的情况多种多样,例如:
- 前后端分离的项目,前端在独立的域名下,需要通过AJAX请求访问后端API。
- 前端需要在iframe中加载来自其它域名下的网页。
- 通过跨域脚本,前端需要在页面上引入来自其它域名下的JavaScript文件以实现某些功能。
以上都需要支持跨域访问才能正常运行。
三、vite中跨域的配置方法
vite是一个基于ES modules的构建工具,支持原生ES modules的引入和导出语法,无需类似webpack的繁琐配置即可启动项目,因此配置跨域也非常简单。
vite提供了一个server选项,可以自定义服务器相关配置。我们可以通过设置此选项来完成跨域的配置。
在package.json文件的"script
"中添加一条命令用于启动vite:
然后在项目根目录下创建一个vite.config.js
的文件,内容如下:
import { defineConfig } from 'vite'
export default defineConfig({
server: {
proxy: {
'/api': 'http://localhost:3000'
}
}
})
以上配置会将所有以/api
开头的HTTP请求代理到http://localhost:3000
。
四、跨域配置参数详解
1. target
类型: string
默认值: undefined
规定请求的地址,可以是一个字符串或一个对象
- target: 'http://localhost:3000' 代理到某个地址
- target: { host: 'localhost', port: 3000 } 代理到某个地址
我们也可以使用代理函数的形式指定不同的代理规则:
import { defineConfig } from 'vite'
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:3000',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '')
}
}
}
})
2. changeOrigin
类型: boolean
默认值: false
是否改变请求来源。如果设置为true,则源URL将作为原始请求头中的Host字段发送。
3. rewrite
类型: (path: string) => string | undefined
默认值: undefined
重写路径。用来重写请求路径,可以通过此选项去除基路径。
4. pathRewrite
类型: Record<string, string>
默认值: {}
路径重写规则。可以使用正则表达式进行匹配和替换。
import { defineConfig } from 'vite'
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:3000',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
})
以上配置会将以/api
开头的请求重写为当前路径。
五、总结
vite中跨域的配置非常方便,只需要在vite.config.js
中添加相应配置即可。我们可以通过设置server.proxy
选项来完成跨域配置。同时,vite也支持代理函数的形式指定不同的代理规则,可以根据实际情况选择使用不同的方法完成跨域配置。