当前位置: 首页 > article >正文

Vue + Axios + Mock.js 全链路实操:从封装到数据模拟的深度解析


一、项目架构深度设计

1.1 分层架构模式

采用经典的前端分层架构,实现高度可维护性:

src/
├─ api/          # 接口管理
│  └─ home.js    # 模块化接口
├─ mock/         # 模拟数据
│  ├─ index.js   # Mock入口
│  └─ home.js    # 首页数据
├─ utils/
│  └─ request.js # Axios封装
├─ config/
│  └─ index.js   # 环境配置
└─ views/└─ Home.vue   # 视图组件

技术决策依据

  • 接口模块化:按业务功能划分API文件
  • Mock独立分层:解耦真实业务逻辑
  • 配置中心化:统一管理环境变量
  • 组件隔离:视图与逻辑分离
1.2 核心模块交互流程
Home.vue api.js request.js mock.js config.js 真实服务器 调用getTableData() 发送请求 拦截请求 返回模拟数据 转发请求 返回真实数据 alt [开发环境] [生产环境] 响应数据 Home.vue api.js request.js mock.js config.js 真实服务器

二、Axios进阶封装实战

2.1 工厂模式创建实例
// request.js
const createService = (baseURL) => {const service = axios.create({baseURL,timeout: 10000,headers: {'Content-Type': 'application/json;charset=UTF-8'}})// 拦截器配置...return service
}// 创建不同域实例
const apiService = createService(config.baseApi)
const mockService = createService(config.mockApi)

关键配置项解析

  • timeout:超时阈值(毫秒)
  • transformRequest:请求数据预处理
  • validateStatus:自定义有效状态码
  • withCredentials:跨域携带凭证
2.2 智能拦截器实现

请求拦截器

service.interceptors.request.use(config => {// 自动注入Tokenconst token = localStorage.getItem('token')if (token) {config.headers.Authorization = `Bearer ${token}`}// 请求计时config.metadata = { startTime: Date.now() }// 文件上传处理if (config.data instanceof FormData) {config.headers['Content-Type'] = 'multipart/form-data'}return config
})

响应拦截器

service.interceptors.response.use(response => {// 性能监控const latency = Date.now() - response.config.metadata.startTimeconsole.log(`API ${response.config.url} 耗时: ${latency}ms`)// 业务状态码处理if (response.data.code !== 200) {return Promise.reject(response.data)}return response.data},error => {// 超时特殊处理if (error.code === 'ECONNABORTED') {error.message = '请求超时,请检查网络连接'}// HTTP状态码处理const statusMap = {401: '身份验证失败,请重新登录',403: '权限不足,请联系管理员',500: '服务器内部错误'}error.message = statusMap[error.response.status] || error.messagereturn Promise.reject(error)}
)
2.3 多环境智能路由
function request(options) {// 优先级:方法级mock > 全局mock > 环境配置const isMock = options.mock ?? config.mockif (process.env.NODE_ENV === 'development') {service = isMock ? mockService : apiService} else {service = apiService}// 自动转换GET参数if (options.method?.toLowerCase() === 'get') {options.params = options.datadelete options.data}return service(options)
}

环境切换策略

  1. 开发环境:可自由切换Mock/真实接口
  2. 测试环境:强制使用测试服务器
  3. 生产环境:禁用Mock功能

三、Mock.js高级应用

3.1 动态数据模拟
// mock/home.js
export default {getTableData: Mock.mock({'list|10-20': [{'id|+1': 1,'name': '@cname','age|20-60': 1,'birthday': '@date("yyyy-MM-dd")','address': '@county(true)','status|1': ['active', 'inactive']}]})
}

Mock.js语法解析

  • |min-max:生成范围数量的数组项
  • @cname:随机中文姓名
  • @date:格式化日期
  • |+1:自增序列
3.2 智能路由匹配
// mock/index.js
Mock.mock(/\/api\/order\/detail\/\d+/, 'get', ({ url }) => {const id = url.split('/').pop()return {id,price: Mock.mock('@float(100, 1000, 2, 2)'),createTime: Mock.mock('@datetime')}
})

正则匹配技巧

  • /api/order/detail/123 → 捕获ID参数
  • /api/search?keyword=test → 解析查询参数
3.3 延迟响应模拟
Mock.setup({timeout: '200-600' // 随机200-600ms延迟
})// 特定接口自定义延迟
Mock.mock(/\/api\/heavy/, 'get', () => {return Mock.mock({data: { /*...*/ },delay: 1000 // 固定1秒延迟})
})

性能测试场景

  • 测试加载状态显示
  • 验证超时处理逻辑
  • 评估用户等待体验

四、Vue3数据流管理

4.1 响应式状态管理
<script setup>
import { ref, computed } from 'vue'const tableData = ref([])// 计算属性优化展示
const sortedData = computed(() => {return [...tableData.value].sort((a, b) => b.age - a.age)
})// 分页状态
const pagination = reactive({current: 1,pageSize: 10,total: 0
})// 复合数据请求
const fetchTableData = async () => {try {const params = {page: pagination.current,size: pagination.pageSize}const { list, total } = await api.getTableData(params)tableData.value = listpagination.total = total} catch (error) {console.error('数据加载失败:', error)}
}
</script>

最佳实践

  • 使用ref管理基础类型
  • reactive处理复杂对象
  • computed缓存计算结果
  • 异步操作统一错误处理
4.2 组件通信模式

Props/Events基础通信

<!-- Parent.vue -->
<DataTable :data="tableData" @sort-change="handleSort" /><!-- DataTable.vue -->
<template><el-table @sort-change="emit('sort-change', $event)"><!-- ... --></el-table>
</template>

Provide/Inject跨层传递

// 父级提供配置
provide('tableConfig', {stripe: true,border: true
})// 子组件注入
const config = inject('tableConfig')

五、调试与优化策略

5.1 网络请求调试

Chrome DevTools技巧

  1. 过滤XHR请求:Network → Filter → XHR
  2. 重放请求:右键请求 → Replay XHR
  3. 修改请求头:右键请求 → Block request URL
  4. 性能分析:Performance面板记录请求时间线
5.2 组件渲染分析
// 渲染性能追踪
import { track } from 'vue'
const renderTracker = () => {track(() => {// 渲染逻辑})
}

优化手段

  • 虚拟滚动处理大数据量
  • v-memo缓存静态内容
  • 合理拆分子组件
5.3 安全防护策略
// 请求拦截器
service.interceptors.request.use(config => {// CSRF Token处理if (['post', 'put', 'delete'].includes(config.method)) {config.headers['X-CSRF-TOKEN'] = getCSRFToken()}// SQL注入过滤if (config.data) {Object.keys(config.data).forEach(key => {if (typeof config.data[key] === 'string') {config.data[key] = config.data[key].replace(/['"\\]/g, '')}})}return config
})

安全防护要点

  • 输入内容过滤
  • 响应数据消毒
  • HTTPS强制
  • 速率限制

六、工程化扩展方案

6.1 TypeScript集成
// api.d.ts
declare interface APIResponse<T> {code: numberdata: Tmessage?: string
}declare interface User {id: numbername: stringage: number
}// 声明接口方法
export declare function getUsers(): Promise<APIResponse<User[]>>

类型优势

  • 接口响应自动提示
  • 参数类型强制校验
  • 减少运行时错误
6.2 自动化测试方案

Jest测试示例

test('API请求模拟测试', async () => {// 模拟Axios实例const mockService = {get: jest.fn().mockResolvedValue({data: { code: 200, data: mockUsers }})}// 测试业务方法const users = await fetchUsers(mockService)expect(users).toEqual(mockUsers)expect(mockService.get).toBeCalledWith('/api/users')
})

测试金字塔模型

  1. 单元测试:核心工具函数
  2. 集成测试:组件与API交互
  3. E2E测试:完整业务流程

七、前沿技术展望

7.1 Fetch API替代方案
// 封装Fetch替代Axios
const fetchClient = (url, options = {}) => {return fetch(url, {...options,headers: {'Content-Type': 'application/json',...options.headers}}).then(async response => {const data = await response.json()if (!response.ok) {throw new Error(data.message || '请求失败')}return data})
}

优势对比

  • 更轻量级
  • 原生Promise支持
  • 渐进式增强
7.2 WebSocket集成
// 实时数据更新
const setupWebSocket = () => {const ws = new WebSocket('wss://api.example.com/ws')ws.onmessage = (event) => {const data = JSON.parse(event.data)switch (data.type) {case 'tableUpdate':tableData.value = data.payloadbreakcase 'notification':showNotification(data.message)break}}
}

应用场景

  • 实时数据仪表盘
  • 协同编辑系统
  • 即时通讯功能

八、总结

  1. 可维护性:模块化架构降低维护成本
  2. 可测试性:分层设计便于单元测试
  3. 可扩展性:配置驱动适应需求变化
  4. 稳定性:完善的错误处理机制
  5. 高性能:智能缓存与优化策略

相关文章:

Vue + Axios + Mock.js 全链路实操:从封装到数据模拟的深度解析

一、项目架构深度设计 1.1 分层架构模式 采用经典的前端分层架构&#xff0c;实现高度可维护性&#xff1a; src/ ├─ api/ # 接口管理 │ └─ home.js # 模块化接口 ├─ mock/ # 模拟数据 │ ├─ index.js # Mock入口 │ └─ home.js # 首…...

博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具

这是一个使用 wxPython 构建界面、moviepy 处理视频的自定义 GUI 应用程序。该工具提供了视频播放、元数据提取、格式转换、视频裁剪和截图等功能。通过分析其设计和实现&#xff0c;我们将了解其工作原理、优点和潜在的改进空间。 C:\pythoncode\new\output\pymovieSample.py …...

Go基础一(Maps Functions 可变参数 闭包 递归 Range 指针 字符串和符文 结构体)

Maps 1.创建map make(map[键类型]值类型) 2.设置键值对 name[key]value; 3. name[key]获取键值 3.1 key不存在 则返回 0 4.len()方法 返回 map 上 键值对数量 len(name) 5.delete()方法 从map中删除 键值对 delete(name,key) 6.clear()方法 map中删除所有键值对 clear(name) 7…...

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…...

wireshak抓手机包 wifi手机抓包工具

移动端接口测试抓包工具指南 在做手机或移动端APP的接口测试时&#xff0c;获取完整的接口文档是关键。但如果没有文档&#xff0c;我们就需要使用专业的抓包工具来分析网络请求。本文将介绍两种常用的抓包方案&#xff1a;Fiddler和Sniff Master&#xff08;抓包大师&#xf…...

niuhe插件, 在 go 中渲染网页内容

思路 niuhe 插件生成的 go 代码是基于 github.com/ma-guo/niuhe 库进行组织管理的, niuhe 库 是对 go gin 库的一个封装&#xff0c;因此要显示网页, 可通过给 gin.Engine 指定 HTMLRender 来实现。 实现 HTMLRender 我们使用 gitee.com/cnmade/pongo2gin 实现 1. main.go …...

java基础知识面试题总结

Java基础知识面试题 1.重载和重写的区别 重载&#xff08;Overload&#xff09;&#xff1a; ​ 同一个类中&#xff0c;方法名相同&#xff0c;参数列表不同&#xff08;个数、类型、顺序&#xff09;。 class Calculator {// 方法1&#xff1a;两个int相加public int add…...

使用MySQL时出现 Ignoring query to other database 错误

Ignoring query to other database 错误 当在远程连接软件中输入MySQL命令出现该错误 导致错误原因是&#xff1a;登录mysql时账户名没有加上u 如果出现该错误&#xff0c;退出mysql&#xff0c;重新输入正确格式进入即可&#xff01;...

MySQL介绍及使用

1. 安装、启动、配置 MySQL 1. 安装 MySQL 更新软件包索引 sudo apt update 安装 MySQL 服务器 sudo apt install mysql-server 安装过程中可能会提示你设置 root 用户密码。如果没有提示&#xff0c;可以跳过&#xff0c;后续可以手动设置。 2. 配置 MySQL 运行安全脚本…...

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时&#xff0c;实现“全选”功能&#xff0c;通常有两种方式&#xff1a;一种是使用内置的全选功能&#xff0c;另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…...

java后端开发day34--脑子空空如何无痛想起所有知识点--概念拟人化

1.上半部学习思考 1.1反思–浮躁–二倍速 刚开始算半个小白吧&#xff0c;从最基础的知识点开始学习&#xff0c;到后面学习整个项目的布局和功能。可能是后面慢慢懂得多了&#xff0c;每次打代码搞项目啊什么的&#xff0c;就能明显感觉到自己很浮躁&#xff1a;脑子里已经明…...

fastGPT—前端开发获取api密钥调用机器人对话接口(HTML实现)

官网文档链接&#xff1a;OpenAPI 介绍 | FastGPT 首先按照文档说明创建api密钥 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…...

解决 PDF 难题:批量处理、文档清理与自由拆分合并

软件介绍 在日常办公与学习中&#xff0c;处理 PDF 文件常常让人头疼不已&#xff0c;不过别担心&#xff0c;今天有一款堪称神器的国产老牌 PDF 工具要分享给大家。它就是 PDF 补丁丁&#xff0c;凭借其强大功能&#xff0c;为大家排忧解难。 界面体验 初次打开 PDF 补丁丁&…...

使用pycharm社区版调试DIFY后端python代码

目录 背景 前置条件 DIFY使用的框架 API服务调试配置步骤&#xff08;基于tag为0.15.3的版本&#xff09; 1.配置.env文件 2.关闭docker里面的docker-api-1服务 3.使用DOCKER启动本地环境需要用到的中间件&#xff0c;并暴露端口 注意事项一&#xff1a; 注意事项二&#xff1a…...

量子计算与人工智能的结合:未来科技的双重革命

引言 在过去几十年里&#xff0c;人工智能&#xff08;AI&#xff09;和计算能力的提升一直是推动科技进步的重要力量。然而&#xff0c;随着深度学习和大规模数据处理的发展&#xff0c;传统计算架构的算力瓶颈逐渐显现&#xff0c;人工智能的训练和推理效率受到了限制。在此背…...

关于存储的笔记

存储简介 名称适用场景常见运用网络环境备注块存储高性能、低延迟数据库局域网专业文件存储数据共享共享文件夹、非结构化数据局域网通用对象存储大数据、云存储网盘、网络媒体公网&#xff08;断点续传、去重&#xff09;海量 存储协议 名称协议块存储FC-SAN或IP-SAN承载的…...

基于机器学习的三国时期诸葛亮北伐失败因素量化分析

一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期&#xff08;220-280年&#xff09;的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库&#xff0c;收录建安十二年&#xff08;207年&#xff09;至建兴十二年…...

MySQL 中的 MVCC 版本控制机制原理

1. MVCC&#xff08;多版本并发控制&#xff09;概述 MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种数据库事务并发控制机制&#xff0c;主要用于提高数据库的读写性能。它通过维护数据的多个版本&#xff0c;使得读操作无…...

JWT认证服务

JSON Web Token&#xff08;JWT&#xff09;是一种用于在网络应用间安全地传递信息的紧凑、自包含的方式。以下是关于 JWT 认证服务器更详细的介绍&#xff0c;包括其意义、作用、工作原理、组成部分、时效性相关内容、搭建条件以及代码案例。 JWT 的意义与作用 意义&#xf…...

RAG中对于PDF复杂格式文件的预处理的解决方案:MinerU

RAG中对于PDF复杂格式文件的预处理的解决方案:MinerU 1. 场景 在RAG场景下,我们所遇到的文档格式可不仅仅局限于txt文件,而对于复杂的PDF文件,里面有图片格式的Excel、图片格式的文字、以及公式等等复杂的格式,我们很难用传统的方式去解析预处理成我们可以用的类似于TXT…...

手机中的type-C是如何防水的呢?

防水类型的type-C座子&#xff1a; 电子产品防水等级的区分&#xff1a; 这里的“IP”是国际防护标准等级&#xff1b;简而言之&#xff0c;IPXX中“XX”两位数字分别代表防尘和防水等级&#xff0c;其中防尘等级从0&#xff5e;6&#xff0c;防水等级则从0&#xff5e;8。 第…...

[Redis]Redis学习开篇概述

欢迎来到啾啾的博客&#x1f431;。 这是一个致力于构建完善 Java 程序员知识体系的博客&#x1f4da;。 它记录学习点滴&#xff0c;分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 引言 大家好…...

WordPress浮动广告插件+飘动效果客服插件

源码介绍 WordPress浮动广告插件飘动效果客服插件 将源码上传到wordpress的插件根目录下&#xff0c;解压&#xff0c;然后后台启用即可 截图 源码免费获取 WordPress浮动广告插件飘动效果客服插件...

Java基础关键_034_网络编程

目 录 一、概述 二、网络编程三要素 1.IP 地址 2.端口号 3.通信协议 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;OSI 七层参考模型 &#xff08;3&#xff09;TCP/IP 四层参考模型 三、网络编程基础类 1.InetAddress 2.URL &#xff08;1&#xff09…...

Ubuntu交叉编译器工具链安装

声明 本博客所记录的关于正点原子i.MX6ULL开发板的学习笔记&#xff0c;&#xff08;内容参照正点原子I.MX6U嵌入式linux驱动开发指南&#xff0c;可在正点原子官方获取正点原子Linux开发板 — 正点原子资料下载中心 1.0.0 文档&#xff09;&#xff0c;旨在如实记录我在学校学…...

C# 操作 Redis

一、简介 C# 中通过 StackExchange.Redis 库可以方便地操作 Redis&#xff0c;实现高性能的数据缓存和存储。StackExchange.Redis 提供了强大的 API&#xff0c;允许开发者轻松连接、读取和写入 Redis 数据。通过使用 ConnectionMultiplexer 类&#xff0c;可以建立与 Redis 服…...

基于Python的招聘推荐数据可视化分析系统

【Python】基于Python的招聘推荐数据可视化分析系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &#x1f680;&#x1f31f; 基于Python的招聘推荐数据可视化分析系统&#xff01;&#x1…...

光谱相机在工业中的应用

光谱相机&#xff08;多光谱、高光谱、超光谱成像技术&#xff09;在工业领域通过捕捉物质的光谱特征&#xff08;反射、透射、辐射等&#xff09;&#xff0c;结合化学计量学与人工智能算法&#xff0c;为工业检测、质量控制和工艺优化提供高精度、非接触式的解决方案。以下是…...

Nginx介绍及使用

1.Nginx介绍 Nginx是一款开源的、高性能的HTTP和反向代理服务器 1.正向代理和反向代理 正向代理&#xff08;代理客户端&#xff09;是一种位于客户端和目标服务器之间的中间服务器。客户端通过正向代理服务器向目标服务器发送请求&#xff0c;代理服务器将请求转发给目标服…...

使用PyQt5绘制水波浪形的柱状显示流量—学习QTimer+QPainterPath

前言&#xff1a;进入学习Python开发上位机界面的第二阶段&#xff0c;学习如何开发自定义控件&#xff0c;从常用的控件入手学习&#xff0c;本期主要学习如何使用PyQt5绘制水波浪形的柱状显示流量。但是最后我放弃了&#xff0c;因为水波的效果达不到我想要的。 1. 明确想要…...