不仅仅是 Mock 服务:mock-h3,让前端也能优雅拥有后端能力

在前端开发中,Mock 服务几乎是不可或缺的:

  • 需要快速搭建 Demo;
  • 后端接口还没准备好;
  • 或者需要模拟一些特殊场景的数据。

然而,现有的方案往往不够优雅,要么需要复杂配置,要么和实际部署环境脱节。

于是,我们基于 Vite + h3 ,实现了一款轻量、灵活的 Mock 插件 ------ mock-h3。


背景与需求

在设计之初,我们明确了几个核心目标:

  1. Vite 插件化:即插即用;
  2. 完全自定义 :支持 js/ts,接口灵活可控;
  3. 同端口运行:无跨域问题;
  4. 生产可用:打包后可直接用 Node 启动,无需额外 Nginx;
  5. 支持 TS/ESM:抛弃 CJS;
  6. 文件路由:一个文件即一个接口,结构清晰;
  7. 扩展能力 :保留 h3 的 中间件/插件 生态;
  8. 数据库支持:可以在 Mock 服务中轻松接入数据库。

技术选型

在 Node 服务端框架中,我们重点考虑了 轻量、易用、类型友好 。

最终选择了 h3 v2:

  • 内置 defineHandleEvent、readBody 等 API;
  • TypeScript 友好,类型提示完整;
  • 比 express / koa 更轻量,配置更简洁。

基于此,我们开发了 mock-h3 插件 。

它是一个 与前端框架无关的服务端插件 ------ 无论你用 Vue、React 还是其他框架,都能直接集成。


常见 Mock 方案对比

特性 / 方案 mockjs vite-plugin-mock mock-h3(本项目)
实现方式 纯前端拦截,模拟数据 基于 express 基于 h3,轻量 Node 服务
类型支持 无类型提示 TS支持,但无类型提示 完全支持 TS/ESM,支持类型提示
文件路由 不支持,需要手动注册 支持(配置稍有复杂) 天然支持,一个文件一个接口配置简单
跨域问题 存在(需额外配置) 无跨域问题 无跨域,共享 Vite 端口
生产可用性 不可用 不推荐生产使用 满足小项目,生产可运行,打包部署
扩展能力 - - 支持 h3 插件 & 中间件系统
数据库交互 - - 支持,可直接接入数据库

可以看到,mock-h3 不仅覆盖了开发阶段的 Mock 需求,还能平滑过渡到生产环境,避免了「开发环境能跑,生产环境需要重写」的尴尬。


适用场景

mock-h3 并不是要替代所有 Mock 工具,而是针对以下场景特别合适:

  • 快速原型 / Demo 搭建

    不依赖后端接口,前端能独立完成演示,交付更快。

  • 中小型项目 / 内部系统

    前后端接口都由 Node 服务统一启动,不用单独配置网关或 nginx,部署简单。

  • 长期需要 Mock 的项目

    不仅能在开发阶段使用,还能在生产环境继续运行,避免重复造轮子。

  • 需要简单数据库交互

    可以直接在 Mock 服务中读写数据库,模拟更接近真实的业务逻辑。

如果你的需求只是前端临时造一些假数据(例如单纯的 UI 演示),可能用 mockjs 更简单;

但如果你希望 Mock 服务能 稳定、可维护,并最终走向生产环境 ,那么 mock-h3 会更合适。


快速上手

安装

bash 复制代码
pnpm add mock-h3 h3@beta -D

配置 vite.config.ts:

ts 复制代码
import { mockH3 } from 'mock-h3/vite'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [
    mockH3()
  ]
})

默认目录结构

csharp 复制代码
servers/
├── middleware/              # 中间件
├── plugins/                 # 插件
└── routes/                  # 路由
    ├── user.get.ts          # GET 请求
    ├── edit.post.ts         # POST 请求
    └── ...

一个文件就是一个接口,结构直观,不会混乱。


高级能力

中间件

中间件按文件顺序依次加载,可通过命名控制顺序。

👉 参考:h3 中间件文档

插件

基于 h3 的插件机制,推荐使用 definePlugin 定义:

ts 复制代码
// logger.ts
import { definePlugin } from 'h3'

export default definePlugin((h3) => {
  if (h3.config.debug) {
    h3.use((req) => {
      console.log(`[${req.method}] ${req.url}`)
    })
  }
})

👉 参考:h3 插件文档

配置项

  • prefix :接口前缀,默认 /api;
  • srcDir :扫描目录,默认 servers;
  • build :是否在生产环境启用,默认 true;
  • outputDir :构建输出目录,默认 dist/servers。

部署方案

构建完成后,会在 dist/servers 下生成完整服务:

bash 复制代码
node dist/servers/app.mjs

此时,前端工程与 Mock 服务即可一同启动,静态站点与接口无需额外配置。

推荐方式:使用 Docker 部署,Node.js 版本 ≥ 22。


示例与开源地址

目前我们已在 Antdv Pro 中,将原有 nitro 服务替换为 mock-h3。

👉 项目地址:mock-h3

如果你喜欢这个项目,欢迎给 Antdv Pro 和 mock-h3 点个 ⭐️。

也非常欢迎提交 Issue 和 PR,让我们一起让这个插件更好用! 🚀

相关推荐
程序员老赵37 分钟前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot38 分钟前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot38 分钟前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI1 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance1 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写1 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端
大文说跨境1 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
hunter_0761 小时前
iOS 首页复杂嵌套滚动技术方案:头部固定 + 网格滚动 + Tab 吸顶 + 每 Tab 独立下拉刷新
前端
CoderYanger1 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
用户2788607285671 小时前
fallback 会盖掉平台提示词:system、空数组和 systemAppend 的差别
前端·后端