Vue3实战三、Axios封装结合mock数据、Vite跨域及环境变量配置
目录
- Axios封装、调用mock接口、Vite跨域及环境变量配置
- 封装Axios对象调用mock接口数据
- 第一步、安装axios,处理一部请求
- 第二步、创建`request.ts`文件
- 第三步、本地模拟mock数据接口
- 第四步、测试axios+mock接口是否可以调用
- 第五步、自行扩展 axios 返回的数据类型 axios.d.ts
- 跨域解决
- 什么是跨域
- 跨域示例
- 跨域解决
- 跨域实操
- Vite配置环境变量及模式
- Vite 配置环境变量
- Vite配置环境模式
- 重构代理配置
- 完结~
Axios封装、调用mock接口、Vite跨域及环境变量配置
封装Axios对象调用mock接口数据
因为项目中有很多接口要通过Axios发送异步请求,所以需要封装一个axios对象,自己封装的Axios后面可以时候axios中提供的拦截器,参考官方文档
第一步、安装axios,处理一部请求
npm install axios

第二步、创建request.ts文件
在 src 目录下创建utils目录,然后 utils 目录下创建 request.ts 文件
import axios from 'axios';
import type { AxiosInstance } from 'axios';
import { ElMessage } from 'element-plus';
// 手动创建一个 axios 对象, 参考: https://github.com/axios/axios#creating-an-instance
const request: AxiosInstance = axios.create({//baseURL: 'https://mock.xxx.com/mock/64fa8039e70b8004a69ea036/hsk-admin',// 根据不同环境设置 baseURL, 最终发送请求时的URL为: baseURL + 发送请求时写URL ,// 比如: `baseURL: '/dev-api'` ,当请求 get('/test'), 最终发送请求是: /dev-api/test// baseURL: '/dev-api',// 获取项目根目录下 .env.xxxx 文件中的环境变量值baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 20000, // 请求超时的毫秒数,请求时间超过指定值,则请求会被中断
});
// 请求拦截器
request.interceptors.request.use(config => {// 在此处可向请求头加上认证tokenreturn config;
}, error => {// 出现异常, catch可捕获到return Promise.reject(error);
})
// 响应拦截器
request.interceptors.response.use(response => {// console.log('响应拦截器', response);const res = response.data;// 20000 正常响应,返回响应结果给调用方if (res.code === 20000) {return res;}// 非正常响应弹出错误信息,ElMessage.error(res.message);return Promise.reject(res);
}, error => {// 处理响应错误const { message, response } = error;if (message.indexOf('timeout') != -1) {ElMessage.error('网络超时!');} else if (message == 'Network Error') {ElMessage.error('网络连接错误!');} else {if (response.data) ElMessage.error(response.statusText);else ElMessage.error('接口路径找不到');}return Promise.reject(error);
});
export default request; // 导出 axios 对象
第三步、本地模拟mock数据接口
前后端分离开发过程中,后端数据接口还没有写出来,前端可以使用mock模拟假数据进行先一步页面的开发,使用mockjs模拟后端接口,可随机生成所需要的数据,模拟对数据的增删查改,mock支持丰富的数据类型,支持生成随机的文本,数字,布尔值,日期,邮箱,链接,图片,颜色等,拦截Ajax请求不需要修改既有代码可以拦截,返回模拟的响应数据。
项目中使用mockjs的时候,首先确保安装了axios和mock,上面第一步的时候已经安装了axios数据,现在开始进行安装mock:
npm install -D mockjs

在项目的src文件夹下新建一个文件夹用来存放mock模拟的数据,一般我们放在将mock模拟的数据( /src/mock/index.js)这个文件中,这里以此为例。
//这里是我使用本地的服务器商品接口地址模拟的数据
import { mock } from 'mockjs'
let data = mock({"code": 20000,"message": "查询成功","data": [{ "name": "小梦", "age": 18 },{ "name": "涛姐", "age": 32 },{ "name": "林志玲", "age": 48 }]
})
mock(/test/, 'get', () => {return data
})

模拟完数据后,在入口主文件 main.js 中引入这个模拟数据的文件
import "./mock/index.js"

第四步、测试axios+mock接口是否可以调用
在 src/ 下创建 /api/test.ts 目录和文件, 调用接口代码如下:
import request from "@/utils/request";
export function test1() {// 测试1: 调用 get 方式发送get请求request.get("/test").then(response => {console.log("get1", response);}).catch(error => {console.log('error', error);});
}export function test2() {// 测试2, 使用对象形式传入请求配置,如 请求url, method,paramrequest({url: `/test`,method: "GET"}).then(response => {console.log("get2", response);}).catch(error => {console.log(error);});
}

app.vue页面引入接口并调用:
<template><div><el-icon><ele-Search /></el-icon><SvgIcon name="ele-Search"></SvgIcon><el-button type="primary">Primary</el-button></div>
</template>
<script lang="ts" setup>
// 导入 test.ts,
import { test1, test2 } from "../src/api/test.ts";
// 调用方法发送请求
test1();
test2();
</script>
<style lang="scss">
// 编写 scss 代码
</style>
效果:

测试三、通过 api 方法返回请求的 Promise 对象,然后在调用方通过then 获取响应数据,api\test.ts 新增如下代码:
import request from "@/utils/request";
// 返回 Promise
export function getList() {const req = request({url: `/test`,method: "GET"});// console.log(req) // Promisereturn req;
}
在 App.vue 中导入 test.ts
<script setup lang='ts'>
// 导入 test.ts,调用方法发送请求
import { getList } from "@/api/test";
import { onMounted } from "vue";
onMounted(() => {loadData();loadData2();
});
function loadData() {getList().then((response: any) => {console.log("loadData", response);}).catch((error: Error) => {console.log(error);});
}
// 使用 async+await
async function loadData2() {const response = await getList();console.log("loadData2", response);
}
</script>

后面数据访问都采用测试三这种方式。
第五步、自行扩展 axios 返回的数据类型 axios.d.ts
-
使用
axios发送请求接口后,axios生命的响应对象AxiosResponse中的属性并不是我们想要的,我们需要自行扩展为我们需要相应的数据类型。/* eslint-disable */ import * as axios from 'axios'; // 自行扩展 axios 返回的数据类型 declare module 'axios' {export interface AxiosResponse<T = any> {code: number;message: string;data: T;} }
declare定义的接口类型,在SFC和ts文件中不需要导入,相当于全局接口,直接引用接口类型。但是要告知ts文件在哪里 -
自动加载
*.d.ts文件,修改tsconfig.app.json(旧版本在tsconfig.json中)文件的includes选项值:追加"src/**/*.d.ts"
{"extends": "@vue/tsconfig/tsconfig.dom.json","include": ["env.d.ts", "src/**/*", "src/**/*.vue", "src/**/*.d.ts"],"exclude": ["src/**/__tests__/*"],"compilerOptions": {"composite": true,"baseUrl": ".","paths": {"@/*": ["./src/*"]}}
}

注意:添加后,重启编辑器VsCode,不然可能无法识别到*.d.ts文件
跨域解决
什么是跨域
前后端分离时,前端和后端API服务器可能不在同一台主机上面,就存在跨域问题,浏览器限制了跨域访问,违反了同源策略【协议,域名,端口】都要相同,其中一个不同都会产生跨域。
跨域示例
- 前端部署在
http://127.0.0.1:8888/即本地ip端口8888上面- 后端API部署在
http://127.0.0.1:9999/即本地ip端口999上面
他们的IP一样,但是端口不一样就会存在跨域问题。

跨域解决
【跨域解决参考文档入口】
- 通过代理请求的方式解决,将
API请求通过代理服务器请求到API服务器。- 开发环境中,在
vite.config.ts文件中使用server.proxy选项进行代理配置。- 生产环境,可采用
nginx代理 解决跨域问题。
跨域实操
- 在
vite.config.ts文件中使用server.proxy选项进行代理配置。
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({// 开发服务器选项,参考:https://cn.vitejs.dev/config/server-options.html#server-hostserver: {open: true, //启动服务时自动打开浏览器访问port: 8888, //端口号, 如果端口号被占用,会自动提升1proxy: { // ++++++++++++++++++ 解决跨域问题'/dev-api': { // 匹配 /dev-api 开头的请求,// 目标服务器, 代理访问到https://mock.mengxuegu.com/mock/6621e5cbfaa39b4567596484/adminPowertarget: 'https://mock.mengxuegu.com/mock/6621e5cbfaa39b4567596484/adminPower',// 开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,// 这样服务端和服务端进行数据的交互就不会有跨域问题changeOrigin: true,// 将 /dev-api 替换为 '',也就是 /dev-api 会移除,// 如 /dev-api/test 代理到https://mock.mengxuegu.com/mock/6621e5cbfaa39b4567596484/adminPowerrewrite: (path) => path.replace(/^\/dev-api/, ''),},}},plugins: [vue(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})
- 将
src\utils\request.ts中的baseURL修改:const request: AxiosInstance = axios.create({baseURL: '/dev-api',timeout: 20000, // 请求超时的毫秒数,请求时间超过指定值,则请求会被中断 });
- 测试:访问
http://127.0.0.1:8888/,查看控制台响应了数据,说明代理成功

Vite配置环境变量及模式
Vite 配置环境变量
环境分为test,prod,test环境,他们请求的后台接口获取数据,不同环境的接口的URL不同,所以要为不同环境配置不同的接口URL,通过路径前缀进行匹配。
-
在根目录下创建
.env.development和.env.production文件,为了防止意外地讲一些环境变量泄漏到客户端,只有以VITE_为前缀的环境变量才会通过import.meta.env以字符串形式暴露给经过Vite处理的代码使用。如:
VITE_DEV_API=/dev-api可以通过import.meta.env.VITE_DEV_API访问,返回/dev-api。WY_DEV_API=/dev-api不能通过import.meta.env.WY_DEV_API访问,返回undefined。
-
.env.development文件配置(注意开发和生产环境配置不要搞反了)VITE_APP_SERVICE_URL值更改为你自已配置的项目后端的接口服务地址。# 使用 VITE_ 开头的变量会被 vite 暴露出来 # 定义请求的基础URL, 方便跨域请求时使用 VITE_APP_BASE_API=/dev-api # 接口服务地址 VITE_APP_SERVICE_URL= https://www.****.com/ -
.env.production 文件配置
# 使用 VITE_ 开头的变量会被 vite 暴露出来 # 定义请求的基础URL, 方便跨域请求时使用 VITE_APP_BASE_API=/pro-api # 接口服务地址 VITE_APP_SERVICE_URL= https://www.****.com/ -
测试是否配置成功,在
request.ts中添加以下代码,看下浏览器控制台是否会输出,在项目任意模块文件中,都可以使用 通过import.meta.env.VITE_APP_BASE_API获取值:import axios from 'axios'; import type { AxiosInstance } from 'axios'; import { ElMessage } from 'element-plus'; console.log(import.meta.env.VITE_APP_BASE_API) const request: AxiosInstance = axios.create({baseURL: '/dev-api',timeout: 20000, // 请求超时的毫秒数,请求时间超过指定值,则请求会被中断 });
Vite配置环境模式
默认情况下,开发服务器 ( dev 命令) 运行在 development (开发) 模式,而 build 命令则运行在 production(生产) 模式。
查看package.json ,当执行 vite build 时,它会自动加载 .env.production 中可能存在的环境变量:
VITE_APP_BASE_API=/pro-api
在 utils/request.ts 中可以使用import.meta.env.VITE_APP_BASE_API 获取引用。在某些情况下,若想在 vite build 时运行不同的模式来渲染不同的标题,你可以通过传递 --mode 选项标志来覆盖命令使用的默认模式。
例如,如果你想在 production(生产)模式下构建应用:
-
项目根目录下新建一个
.env.production文件:

-
在
package.json中添加一个prod选项运行vite --mode production命令

-
启动prod环境查看
console.log(import.meta.env.VITE_APP_BASE_API)打印结果:


重构代理配置
重构vite.config中的server.proxy代理配置,在vite.config.ts中无法通过import.meta.env.xxx获取到VITE_环境变量,解决此问题需要用到vite中提供的loadEnv方法来读取环境变量。
import { defineConfig, loadEnv } from 'vite'
// mode:获取 --mode 指定的模式,process.cwd()项目根目录,下面 `env` 相当于 `import.meta.env`
const env = loadEnv(mode, process.cwd());
- 重构
vite.config中的server.proxy代理配置import { fileURLToPath, URL } from 'node:url' // 1. 导入 loadEnv import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' // 2. 向 defineConfig 传递对象改为传递方法,并返回配置对象 export default defineConfig(({ mode }) => {// mode:获取 --mode 指定的模式,process.cwd()项目根目录,下面 `env` 相当于 `import.meta.env`const env = loadEnv(mode, process.cwd());return {// 开发服务器选项server: {open: true, //启动服务时自动打开浏览器访问port: 8888, //端口号, 如果端口号被占用,会自动提升1proxy: {// '/dev-api': { // 匹配 /dev-api 开头的请求,[env.VITE_APP_BASE_API]: { // 引用变量作为key时,要加中括号[]// 目标服务器target: env.VITE_APP_SERVICE_URL,// 开启代理changeOrigin: true,rewrite: path => path.replace(new RegExp(`^${env.VITE_APP_BASE_API}/`), '')},}},plugins: [vue(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}} }); - 修改
utils/request.ts文件配置:baseURL: import.meta.env.VITE_APP_BASE_APIimport axios from 'axios'; import type { AxiosInstance } from 'axios'; import { ElMessage } from 'element-plus'; console.log(import.meta.env.VITE_APP_BASE_API) const request: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 20000, // 请求超时的毫秒数,请求时间超过指定值,则请求会被中断 });
- 重启看一下效果,接口是否调用到

完结~
相关文章:
Vue3实战三、Axios封装结合mock数据、Vite跨域及环境变量配置
目录 Axios封装、调用mock接口、Vite跨域及环境变量配置封装Axios对象调用mock接口数据第一步、安装axios,处理一部请求第二步、创建request.ts文件第三步、本地模拟mock数据接口第四步、测试axiosmock接口是否可以调用第五步、自行扩展 axios 返回的数据类型 axios…...
机器学习(神经网络基础篇)——个人理解篇5(梯度下降中遇到的问题)
在神经网络训练中,计算参数的梯度是关键步骤。numerical_gradient 方法旨在通过数值微分(中心差分法)计算损失函数对网络参数的梯度。然而,该方法的实现存在一个关键问题,导致梯度计算错误。 1、错误代码示例…...
sklearn的Pipeline
Pipeline类 介绍:Pipeline 可以将多个数据处理步骤和机器学习模型组合成一个序列,其中每个步骤都是一个变换器(Transformer)或者估计器(Estimator),并且Pipeline中的最后一个必须为估计器,其它的必须为变换器,如果Pipeline中的估计器为为分类器则整个Pipeline就作为分…...
【Linux】虚拟机设置静态IP
主播我今天下午学了几节微服务课,上课的时候,直接把手机拿走了去上课(电脑连的我手机的热点),虚拟机没关,晚上主播我回来继续学,电脑连上热点之后,发现虚拟机连接不上了,…...
职坐标解析自动驾驶技术发展新趋势
内容概要 作为智能交通革命的核心驱动力,自动驾驶技术正以惊人的速度重塑出行生态。2023年,行业在多传感器融合与AI算法优化两大领域实现突破性进展:激光雷达、摄像头与毫米波雷达的协同精度提升至厘米级,而深度学习模型的实时决…...
js算法基础-01
文章目录 1、双指针2、快慢指针3、滑动指针4、哈希表5、汇总区间6、栈7、进制求和8、数学9、动态规划 js算法基础, 每个重要逻辑思路,做一下列举 1、双指针 有序数组合并:一般思路就是合并、排序,当然效率略低题目1:nums1中取前m个…...
了解 DeepSeek R1
了解DeepSeek R1 R1探索纯强化学习是否可以在没有监督微调的情况下学会推理的能力。 ‘Aha’ Moment 这种现象有点类似于人类在解决问题时突然意识到的方式,以下是它的工作原理: 初始尝试:模型对解决问题进行初始尝试识别:识别…...
局域网:电脑或移动设备作为主机实现局域网访问
电脑作为主机 1. 启用电脑的网络发现、SMB功能 2. 将访问设备开启WIFI或热点,用此电脑连接;或多台设备连接到同一WIFI 3. 此电脑打开命令行窗口,查看电脑本地的IP地址 Win系统:输入"ipconfig",回车后如图 4.…...
小型园区组网图
1. 在小型园区中,S5735-L-V2通常部署在网络的接入层,S8700-4通常部署在网络的核心,出口路由器一般选用AR系列路由器。 2. 接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。 3. 每个部门业务划分到一个VLAN中,部门间的业务在C…...
数据分享:汽车测评数据
说明:如需数据可以直接到文章最后关注获取。 1.数据背景 Car Evaluation汽车测评数据集是一个经典的机器学习数据集,最初由 Marko Bohanec 和 Blaz Zupan 创建,并在 1997 年发表于论文 "Classifier learning from examples: Common …...
python小整数池和字符串贮存
在Python中,**小整数池**是一种优化机制,用于减少内存使用和加速小整数的创建。 ### 小整数池的工作原理 - **范围**:Python会预先创建并缓存-5到256之间的整数对象。这些对象在解释器启动时就已经创建,并且会一直驻留在内存中。…...
批量将 txt/html/json/xml/csv 等文本拆分成多个文件
我们的文本文件太大的时候,我们通常需要对文本文件进行拆分,比如按多少行一个文件将一个大的文本文件拆分成多个小的文本文件。这样我们在打开或者传输的时候都比较方便。今天就给大家介绍一种同时对多个文本文件进行批量拆分的方法,可以快速…...
Vue3 路由权限管理:基于角色的路由生成与访问控制
Vue3 路由权限管理:基于角色的路由生成与访问控制 一、核心概念 1.1 大致流程思路: 用户在登录完成的时候,后端给出一个此登录用户对应的角色名字,此时可以将这个用户的角色存起来(vuex/pinia)中,在设置路由时的met…...
LLM Agents的历史、现状与未来趋势
引言 大型语言模型(Large Language Model, LLM)近年在人工智能领域掀起革命,它们具备了出色的语言理解与生成能力。然而,单纯的LLM更像是被动的“回答者”,只能根据输入给出回复。为了让LLM真正“行动”起来ÿ…...
忘记mysql的root用户密码(已解决)
1、打开数据库可视化界面(比如MySQL workbench) 2、执行select host,user,authentication_string from mysql.user; 3、把‘authentication_string’下面的字段 复制到MD5在线解密网页中(比如md5在线解密)...
【Pandas】pandas DataFrame set_flags
Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…...
Vue3.2 项目打包成 Electron 桌面应用
本文将详细介绍如何将基于 Vue3.2 的项目打包成 Electron 桌面应用。通过结合 Electron 和 Vue CLI 工具链,可以轻松实现跨平台桌面应用的开发与发布。 1. 项目结构说明 项目主要分为以下几个部分: electron/main.js:Electron 主进程文件。…...
git stash pop 后反悔操作
当使用 git stash pop 应用并删除某个存储(stash)后,如果想撤销该操作(即恢复工作目录到 pop 前的状态,并重新将存储放回存储栈),可以按以下步骤操作: 1 强制丢弃所有未提交的更改&…...
Spring Boot 集成 MongoDB 时自动创建的核心 Bean 的详细说明及表格总结
以下是 Spring Boot 集成 MongoDB 时自动创建的核心 Bean 的详细说明及表格总结: 核心 Bean 列表及详细说明 1. MongoClient 类型:com.mongodb.client.MongoClient作用: MongoDB 客户端核心接口,负责与 MongoDB 服务器建立连接、…...
TypeScript面试题集合【初级、中级、高级】
初级面试题 什么是TypeScript? TypeScript是JavaScript的超集,由Microsoft开发,它添加了可选的静态类型和基于类的面向对象编程。TypeScript旨在解决JavaScript的某些局限性,比如缺乏静态类型和基于类的面向对象编程,…...
ubuntu 20.04 编译和运行SC-LeGo-LOAM
1.搭建文件目录和clone代码 mkdir -p SC-LeGo-LOAM/src cd SC-LeGo-LOAM/src git clone https://github.com/AbangLZU/SC-LeGO-LOAM.git cd .. 2.修改代码 需要注意的是原作者使用的是Ouster OS-64雷达,需要更改utility.h文件中适配自己的雷达类型,而…...
CentOS 7安装hyperscan
0x00 前言 HyperScan是一款由Intel开发的高性能正则表达式匹配库,专为需要快速处理大量数据流的应用场景而设计。它支持多平台运行,包括Linux、Windows和macOS等操作系统,并针对x86架构进行了优化,以提供卓越的性能表现。HyperSc…...
Quartz MisFire补偿机制 任务补偿 任务延迟 错过触发策略
介绍 在 Quartz 中,MisFire(错过触发)是指触发器错过了预定的触发时间,通常是由于系统延迟、任务执行时间过长或者调度器本身未能及时执行任务等原因。这种情况可能会导致任务无法按预期的时间执行。为了应对这些问题,…...
AI训练存储架构革命:存储选型白皮书与万卡集群实战解析
一、引言 在人工智能技术持续高速发展的当下,AI 训练任务对存储系统的依赖愈发关键,而存储系统的选型也变得更为复杂。不同的 AI 训练场景,如机器学习与大模型训练,在模型特性、GPU 使用数量以及数据量带宽等方面的差异ÿ…...
谢志辉和他的《韵之队诗集》:探寻生活与梦想交织的诗意世界
大家好,我是谢志辉,一个扎根在文字世界,默默耕耘的写作者。写作于我而言,早已不是简单的爱好,而是生命中不可或缺的一部分。无数个寂静的夜晚,当世界陷入沉睡,我独自坐在书桌前,伴着…...
UE5 Simulation Stage
首先将Grid2D创建出来,然后设置值,Grid2D类似于在Niagara系统中的RenderTarget2D,可以进行绘制,那么设置大小为512 * 512 开启Niagara粒子中的Simulation Stage 然后开始编写我们的自定义模块 模块很简单,TS就是Textur…...
Swift 解 LeetCode 250:搞懂同值子树,用递归写出权限系统检查器
文章目录 前言问题描述简单说:痛点分析:到底难在哪?1. 子树的概念搞不清楚2. 要不要“递归”?递归从哪开始?3. 怎么“边遍历边判断”?这套路不熟 后序遍历 全局计数器遍历过程解释一下:和实际场…...
怎样使用Python编写的Telegram聊天机器人
怎样使用Python编写的Telegram聊天机器人 代码直接运行可用 以下是对这段代码的详细解释: 1. 导入必要的库 import loggingfrom telegram import Update from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, filters, MessageHandler import log…...
Elixir语言的移动应用安全
Elixir语言的移动应用安全解析 引言 在当今的数字化时代,移动应用已经成为我们日常生活中不可或缺的一部分。从购物、社交到在线银行,几乎每一个生活领域都与移动应用紧密相连。然而,随着应用的普及,安全问题也随之而来。如何确…...
动态估算gas和gasPrice
目录 一、什么是动态估算? 二、动态估算 Gas(代码示例) ✅ 使用 Ethers.js 估算 gasLimit: 💡 发送交易时加一点 buffer: 三、动态估算 gasPrice / maxFee ✅ 获取当前 baseFee(用 provider): ✅ 搭配交易一起发送: 四、完整组合:动态估算 Gas + EIP-1559 费用…...
