发布时间:2026/7/4 4:00:45
企业级 Vue3 + Vite 项目实战中vite-plugin-mock 的最佳实践方案,解决开发中不依赖后端的痛点
在前端开发过程中经常会遇到后端数据缺失或后端服务尚未就绪的情况。此时我们可以通过mock数据来模拟真实接口确保开发工作不受影响。接下来介绍下企业级 Vue3 Vite 项目实战中vite-plugin-mock 的最佳实践方案。一、先说适用范围与局限vite-plugin-mock 原理在 Vite Dev ServerConnect 中间件层拦截请求只在vite dev生效不能用于 Vitest 单元测试或 Cypress E2E。✅ 适合前端独立开发、快速原型、无测试需求的中小型/中型项目⚠️ 不适合需要跨环境一致 mockVitest/Cypress、需要模拟网络超时/断网等极端场景建议用 MSW二、安装依赖pnpm add -D vite-plugin-mock mockjs types/mockjs # 如果要用生产环境演示 mock可选 pnpm add -D vite-plugin-mock/client三、推荐目录结构贴合你的企业级模板my-enterprise-app/ ├── mock/ # ✅ 根目录与 src 平级 │ ├── index.ts # 统一导出所有模块供插件读取 │ ├── types.ts # Mock 相关类型定义 │ ├── utils/ │ │ ├── helper.ts # 分页/延迟/响应包装 │ │ └── db.ts # 简易内存数据库CRUD 模拟 │ ├── fixtures/ │ │ └── users.ts # 固定基准数据 │ └── modules/ │ ├── user.ts # 用户模块接口 │ └── order.ts # 订单模块接口 ├── src/ │ ├── services/request/http.ts # Axios 实例 │ └── ... ├── vite.config.ts ├── .env.development └── .env.mock # 开启 mock 的环境文件四、vite.config.ts 配置关键// vite.config.ts import { defineConfig, loadEnv } from vite import vue from vitejs/plugin-vue import { viteMockServe } from vite-plugin-mock import path from node:path export default defineConfig(({ command, mode }) { const env loadEnv(mode, process.cwd()) // 通过环境变量控制是否启用 mock const enableMock env.VITE_USE_MOCK true command serve return { plugins: [ vue(), viteMockServe({ mockPath: mock/modules, // mock 模块目录 enable: enableMock, // 按环境开关 logger: true, // 控制台打印拦截日志 watchFiles: true, // 修改 mock 文件热更新 // supportTs: true — v3 默认支持可不写 }), ], resolve: { alias: { : path.resolve(__dirname, src), }, }, server: { port: 3000, // ⚠️ 重要proxy 不能抢走 mock 要拦截的路径 // 如果配了 proxy[/api]要确保 mock 先匹配 proxy: { // /api: { target: http://localhost:8080, changeOrigin: true } // 建议mock 开启时注释掉对应 /api proxy或只 proxy 非 mock 路径 }, }, } }).env.development联调后端VITE_USE_MOCKfalse VITE_API_BASE_URLhttp://localhost:8080.env.mock前端独立开发VITE_USE_MOCKtrue VITE_API_BASE_URL # 留空vite-plugin-mock 拦截相对路径 /api/xxx五、Axios 适配要点vite-plugin-mock 拦截的是相对路径请求所以 mock 模式下baseURL要为空或/// src/services/request/http.ts import axios from axios import { loadEnv } from vite const isMock import.meta.env.VITE_USE_MOCK true const http axios.create({ baseURL: isMock ? : import.meta.env.VITE_API_BASE_URL, timeout: 15000, }) // 请求/响应拦截器照常写token 注入、错误统一处理 http.interceptors.request.use((config) { const token localStorage.getItem(token) if (token) config.headers!.Authorization Bearer ${token} return config }) http.interceptors.response.use( (res) res.data, // 根据你的后端结构拆包 (err) Promise.reject(err) ) export default http⚠️常见坑mock 开着时 AxiosbaseURL还配成http://localhost:8080请求变成绝对路径Vite 中间件拦截不到mock 失效。六、Mock 核心代码类型安全 业务结构类型定义// mock/types.ts import type { MockMethod } from vite-plugin-mock export interface ApiRespT unknown { code: number data: T message: string } export type AppMockMethod MockMethod工具函数分页 响应包装// mock/utils/helper.ts import type { ApiResp } from ../types export function successT(data: T, message ok): ApiRespT { return { code: 200, data, message } } export function fail(message: string, code 400): ApiRespnull { return { code, data: null, message } } /** 简易内存分页 */ export function paginateT( list: T[], page 1, pageSize 20 ): { items: T[]; total: number } { const start (page - 1) * pageSize return { items: list.slice(start, start pageSize), total: list.length, } }内存数据库模拟 CRUD 状态变更// mock/utils/db.ts import Mock from mockjs import type { User } from /domain/user/types // 复用你领域层类型 export let userDb: User[] Mock.mock({ list|30: [ { id: guid, name: cname, phone: /1[3-9]\d{9}/, email: email, role: [admin, user, editor], status|1: [active, disabled], createdAt: datetime, updatedAt: datetime, }, ], }).list用户模块 Mock完整 CRUD 分页 错误模拟// mock/modules/user.ts import type { MockMethod } from vite-plugin-mock import { success, fail, paginate } from ../utils/helper import { userDb } from ../utils/db import type { User, CreateUserDto } from /domain/user/types export default [ // 列表 分页 关键字搜索 { url: /api/users, method: get, response: ({ query }: any) { const page Number(query.page) || 1 const pageSize Number(query.pageSize) || 20 const keyword (query.keyword as string) || let filtered userDb if (keyword) { filtered filtered.filter( (u) u.name.includes(keyword) || u.phone.includes(keyword) ) } const { items, total } paginate(filtered, page, pageSize) return success({ items, total, page, pageSize }) }, }, // 详情 { url: /api/users/:id, method: get, response: ({ query, req }: any) { // path-to-regexp 匹配到的 param 在 req.params const id req.params?.id || query.id const user userDb.find((u) u.id id) if (!user) return fail(用户不存在, 404) return success(user) }, }, // 新增 { url: /api/users, method: post, response: ({ body }: any) { const dto body as CreateUserDto if (!dto.phone) return fail(手机号不能为空) const newUser: User { id: crypto.randomUUID(), name: dto.name || 新用户, phone: dto.phone, email: dto.email || , role: dto.role || user, status: active, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), } userDb.unshift(newUser) return success(newUser, 创建成功) }, }, // 编辑 { url: /api/users/:id, method: put, response: ({ body, req }: any) { const id req.params?.id const idx userDb.findIndex((u) u.id id) if (idx -1) return fail(用户不存在, 404) userDb[idx] { ...userDb[idx], ...body, updatedAt: new Date().toISOString() } return success(userDb[idx], 更新成功) }, }, // 删除 { url: /api/users/:id, method: delete, response: ({ req }: any) { const id req.params?.id userDb userDb.filter((u) u.id ! id) return success(null, 删除成功) }, }, // 批量删除 { url: /api/users/batch-delete, method: post, response: ({ body }: any) { const { ids } body as { ids: string[] } userDb userDb.filter((u) !ids.includes(u.id)) return success(null, 批量删除成功) }, }, ] as MockMethod[]统一入口供 mockPath 自动扫描也可手动 import// mock/index.ts // 如果只是让插件扫描 modules/* 可留空导出 // 如需手动注册或有额外逻辑可在这里聚合 export {}七、package.json 启动脚本{ scripts: { dev: vite --mode development, dev:mock: vite --mode mock } }运行pnpm dev:mock→ 读取.env.mock→VITE_USE_MOCKtrue→ mock 启动运行pnpm dev→ 读取.env.development→ mock 关闭 → 请求走 proxy 到真实后端八、可选生产环境演示用 Mock慎用vite-plugin-mock 支持打包进生产构建仅用于演示/展示环境// mockProdServer.ts — 项目根目录 import { createProdMockServer } from vite-plugin-mock/client import userMock from ./mock/modules/user import orderMock from ./mock/modules/order export function setupProdMockServer() { createProdMockServer([...userMock, ...orderMock]) }// src/main.ts — 顶部注入 if (import.meta.env.PROD import.meta.env.VITE_USE_MOCK true) { import(../mockProdServer).then(({ setupProdMockServer }) { setupProdMockServer() }) }⚠️不建议常规生产开启会增加首屏体积且无法热更新仅用于内网演示服务器。九、常见坑位排查清单现象原因解决mock 不生效请求 404 / 直连后端AxiosbaseURL是绝对路径mock 模式baseURLmock 不生效Vite 日志无 Loaded mockmockPath配错或文件未export default []确认 TS 文件as MockMethod[]且 default 导出数组query 参数取不到handler 里要从{ query, req }解构req.params取路径参数query取?a1修改 mock 文件不热更新watchFiles: false或文件被 ignore确认watchFiles: true不被.gitignore忽略proxy 和 mock 冲突/api被 Vite proxy 先匹配mock 开启时注释掉对应 proxy或确保 mock url 先注册十、一句话总结vite-plugin-mock 最佳实践 按模块拆分 与 Axios baseURL 解耦 环境变量控制开关 复用 Domain 类型 Mock.js 生成数据 内存 DB 模拟 CRUD

相关新闻

深度学习中常见的三大“超参”
2026/7/4 4:00:45

深度学习中常见的三大“超参”

如果说参数是机器自己摸索出来的,那么超参数,就是人类在训练开始前,强行给机器定下的“规矩”和“大前提”。 我们继续用最通俗的语言,把“参数”和“超参数”彻底区分开来。 一、 通俗解释:超参数是“教练的战术板” …

阅读更多
2026年中AI工程十大趋势:从Agent爆发到推理优化的全景复盘
2026/7/4 3:00:45

2026年中AI工程十大趋势:从Agent爆发到推理优化的全景复盘

2026 年已经过半,AI 工程领域的热度不但没有减退,反而在 Agent、推理优化、安全治理等方向上出现了更多值得关注的工程拐点。与 2025 年大模型"百模大战"不同,今年的主战场已经从"谁的模型更强"转向了"谁能把模型真…

阅读更多
影刀RPA新手教程:货拉拉滴滴自动化完全指南——运单数据汇总、费用核算与异常处理
2026/7/4 3:00:45

影刀RPA新手教程:货拉拉滴滴自动化完全指南——运单数据汇总、费用核算与异常处理

影刀RPA新手教程:货拉拉滴滴自动化完全指南——运单数据汇总、费用核算与异常处理 物流公司每天要处理几百上千个运单,货拉拉和滴滴货运的运单数据分散在司机App、商户后台、对账系统里。以前财务人员要手工导出、合并、核算,月底对账加班到…

阅读更多
Deepseek-V4与Claude-Opus-4.7编程实战对比:谁更懂中国开发者
2026/7/4 5:00:45

Deepseek-V4与Claude-Opus-4.7编程实战对比:谁更懂中国开发者

1. 项目概述:这不是一场参数竞赛,而是一次真实编码场景的“压力测试”最近两周,我连续在三个不同复杂度的真实项目中交叉使用Deepseek-V4和Claude-Opus-4.7,不是跑 benchmark,不是比 token 速度,而是把它们…

阅读更多
第167章 公开(墨子)
2026/7/4 5:00:45

第167章 公开(墨子)

Raft协议作为分布式共识领域的工业标准,其领导者选举、日志复制和安全性保证等核心机制已被广泛验证。在标准实现中,节点状态机、任期号、日志条目(含索引、任期和数据)、心跳维持等基础构件均有规范定义,因此不同实现…

阅读更多
5步打造专属漫画浏览体验:E-Viewer高效使用指南
2026/7/4 5:00:45

5步打造专属漫画浏览体验:E-Viewer高效使用指南

5步打造专属漫画浏览体验:E-Viewer高效使用指南 作为Windows平台备受欢迎的UWP应用,E-Viewer为漫画爱好者提供了一站式的e-hentai.org浏览解决方案。这款开源工具不仅界面美观,还支持多语言切换和个性化配置,让你轻松探索海量同人…

阅读更多
【dnd-kit】react前端做一个可以垂直拖动的无序列表
2026/7/4 5:00:45

【dnd-kit】react前端做一个可以垂直拖动的无序列表

背景和效果 需要做一个垂直拖动的无序列表。因项目中其他模块已经使用了 dnd-kit , 为保持一致,使用的也是 dnd-kit。效果如下: 可拖拽列表示例资料 React生态中主流拖拽库的深度对比与选型指南 选型决策矩阵 代码 import React, { useState } from r…

阅读更多
国产大模型选型误区:别选参数,要选适配水温
2026/7/4 5:00:45

国产大模型选型误区:别选参数,要选适配水温

1. 为什么“选模型”这件事,从一开始就想错了?你点开这篇文章,大概率正被一个问题反复折磨:GLM-5、Kimi 2.5、Minimax M2.5、千问、豆包、通义千帆……国产大模型名字多得像奶茶店新品,参数榜单刷得比朋友圈还勤&#…

阅读更多
“希尔排序”是什么呢?什么原理?怎么用?有什么优势?
2026/7/4 4:00:45

“希尔排序”是什么呢?什么原理?怎么用?有什么优势?

一、为什么会有希尔排序? 在希尔排序诞生之前(1959年),主流简单排序(冒泡、选择、插入)的时间复杂度均为 O(n)。计算机科学家发现了一个痛点: 插入排序在数据基本有序时效率极高,可…

阅读更多
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告
2026/7/3 19:49:14

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

阅读更多
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?
2026/7/3 2:39:23

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

阅读更多
Axure RP中文界面终极解决方案:3分钟告别英文困扰
2026/7/4 0:00:44

Axure RP中文界面终极解决方案:3分钟告别英文困扰

Axure RP中文界面终极解决方案:3分钟告别英文困扰 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英…

阅读更多
STM32F745VG与MC6470 IMU的高性能姿态控制系统设计
2026/7/4 0:00:44

STM32F745VG与MC6470 IMU的高性能姿态控制系统设计

1. MC6470与STM32F745VG的黄金组合解析在工业自动化和机器人控制领域,传感器与微控制器的协同工作能力直接决定了系统的响应速度和定位精度。MC6470作为一款6自由度惯性测量单元(6DOF IMU),与STM32F745VG这款基于ARM Cortex-M7内核的高性能微控制器组合&…

阅读更多
本地部署SAM Audio音频语义分割模型完整指南
2026/7/4 0:00:44

本地部署SAM Audio音频语义分割模型完整指南

1. 项目概述:为什么要在本地跑 SAM Audio?这不只是“能用”,而是“必须用”SAM Audio——全称是 Segment Anything Model for Audio,不是 Meta 那个视觉领域的 SAM(Segment Anything Model)的简单移植&…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/3 2:40:23

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/3 4:59:02

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/3 11:08:19

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多