# PocketMocker

NPM 版本 开源协议 CI 状态

🚀 在线演示 · 安装 · 快速开始 · 贡献与联系 · 讨论 · 💬 Discord

English · 中文

## PocketMocker 是什么? **PocketMocker 是一款前端开发专用的页面内 HTTP 控制器。** 简单来说,让你直接决定接口返回什么——无需改后端,无需起 Mock Server。 它提供了一个**可视化控制面板**直接嵌入浏览器,让你实时拦截和操作 HTTP 响应,通过**即时看到变化**来快速构建健壮的 UI。 --- ## 为什么选择 PocketMocker? ### 轻松 Mock 告别手写 Mock 代码。自动拦截请求,智能生成数据,一键导入 API 文档。 ### 完全掌控 * **时序控制**:模拟网络延迟、竞态条件 * **状态控制**:强制 500 错误、401 未授权、空响应 * **载荷注入**:测试边界数据和异常情况 ### 即时调试 在浏览器中实时编辑响应,立即看到 UI 更新。无需切换工具,保持开发心流。 --- ## 实际应用场景 ### 即时状态切换 一键切换**成功**、**错误(500/404)**或**空数据**状态。验证您的 UI 如何处理加载动画或错误提示,无需修改任何代码。 ### 实时数据调整 需要测试超长用户名?缺失的头像?或特定的价格格式?直接在面板中编辑响应 JSON,立即看到 UI 更新。 ### 边界情况验证 模拟网络延迟、超时错误或未授权(401)响应,确保您的应用优雅地处理异常情况。 https://github.com/user-attachments/assets/e7501191-7ef1-4bd4-bd21-6500585fe4ad ## 何时使用 PocketMocker? **使用 Postman 进行:** * API 设计与文档 * 后端契约测试 * 团队级 API 管理 **使用 PocketMocker 进行:** * **快速 UI 开发**:"我现在就需要让这个列表为空。" * **可视化调试**:"为什么我的错误边界没有显示?" * **零上下文切换**:留在浏览器中,保持心流状态。 * **Git 友好**:通过配置文件共享 Mock 规则,就像您的代码一样。 --- ## 安装 ```bash npm install pocket-mocker --save-dev # 或者 yarn add pocket-mocker -D # 或者 pnpm add pocket-mocker -D ``` --- ## 快速开始 ### 方式一:零配置使用(本地模式) 适合个人开发或快速尝试。直接在项目的入口文件中引入并启动: ```javascript import { pocketMock } from 'pocket-mocker'; // 仅在开发环境中启动 if (process.env.NODE_ENV === 'development') { pocketMock(); } ``` 启动项目后,页面右下角会出现 **PocketMocker** 浮窗。 ### 方式二:团队协作模式(Vite 插件)🔥 推荐 适合生产级项目。通过 Vite 插件打通文件系统,将 Mock 规则保存为配置文件,方便团队共享。 **1. 在入口文件引入** ```javascript import { pocketMock } from 'pocket-mocker'; if (process.env.NODE_ENV === 'development') { pocketMock(); } ``` **2. 配置 `vite.config.ts`** ```typescript import { defineConfig } from 'vite'; import pocketMockPlugin from 'pocket-mocker/vite-plugin'; export default defineConfig({ plugins: [ pocketMockPlugin() ] }); ``` **3. 启动开发** 运行 `npm run dev`。PocketMock 会自动检测插件环境并切换到 **服务器模式**。 --- ## 进阶功能 ### URL 模式匹配 PocketMock 支持强大的 URL 模式来模拟复杂的 API: - **路径参数**: `/api/users/:id` → 匹配 `/api/users/123`, `/api/users/john` - **通配符**: `/api/*` → 匹配 `/api/users`, `/api/users/123/posts` - **混合模式**: `/api/:version/users/*/profile` → 匹配 `/api/v1/users/123/profile` 在模拟函数中获取捕获的参数: ```javascript (req) => { const { id, version } = req.params; const { include } = req.query; return { id: parseInt(id), version, includeAuthor: include === 'true' }; } ``` ### 智能 Mock 数据生成 PocketMock 内置强大的智能生成器,使用简单语法即可生成逼真的测试数据。 #### 快速体验 ```javascript { "user": { // → 生成用户数据 "id": "@guid", // → "550e8400-e29b-41d4" "name": "@name", // → "张三" "username": "@username", // → "brightpanda" "email": "@email", // → "zhangsan@example.com" "avatar": "@image(100x100)", // → "https://via.placeholder.com/100x100" "age": "@integer(18,60)", // → 25 "role": "@pick(管理员,用户)", // → "管理员" "ip": "@ip()", // → "192.168.1.1" "ipv6": "@ip(v6)" // → "2001:0db8:85a3:0000:0000:8a2e:0370:7334" } } ``` #### 常用生成器 | 语法 | 功能 | 示例 | |------|------|------| | `@guid` | 唯一标识 | `"f47ac..."` | | `@name` | 随机姓名 | `"张三"` | | `@username` | 随机用户名 | `"cool_coder"` | | `@email` | 邮箱地址 | `"user@example.com"` | | `@ip` | 随机 IP (v4/v6) | `@ip` → `192.168.1.1` | | `@integer(min,max)` | 随机整数 | `@integer(1,100)` → `42` | | `@pick(A,B,C)` | 随机选择 | `@pick(苹果,香蕉)` → `"苹果"` | | `@image(100x100)` | 占位图片 | `"https://via.placeholder.com/100x100"` | #### 更多功能
查看完整生成器列表 | 分类 | 语法 | 说明 | |------|------|------| | **基础类型** | | `@float(min,max,decimals)` | 随机浮点数 | `@float(0,1,2)` → `0.57` | | `@boolean` | 随机布尔值 | `true` | | `@string(length)` | 随机字符串 | `@string(8)` → `"aX9bK2pQ"` | | **个人信息** | | `@username(separator, randomDigits, maxLength, dictType)` | 用户名 | `@username("-", 2, 20)` | | `@phone(countryCode)` | 电话号码 | `@phone(+86)` | | **网络** | | `@ip(version)` | IP 地址 | `@ip(v6/v4/6/4)` → IPv(x), `@ip` → IPv4 | | **日期时间** | | `@date(start,end)` | 随机日期 | `@date(2023-01-01,2024-12-31)` | | **其他** | | `@color` | 随机颜色 | `"#a3f4c2"` | | `@text(wordCount)` | 随机文本 | 生成指定词数的文本 | | `@address(countries)` | 地址对象 | `@address(中国,美国)` | | `@company(industries)` | 公司对象 | `@company(科技,金融)` | | `@url(tlds)` | 随机 URL | `@url(com,cn)` | **数组语法:** ```javascript { "users|5": { // 生成5个用户 "id": "@guid", "name": "@name" }, "scores|3-5": "@integer(60,100)" // 生成3到5个分数 } ```
### 动态响应(函数 Mock) 不再局限于静态 JSON!你可以编写 JavaScript 函数来根据请求动态生成响应。 ```javascript (req) => { // 根据 Query 参数动态返回 if (req.query.id === '1') { return { id: 1, name: '管理员', role: 'admin' }; } // 根据 Body 内容判断 if (req.body?.type === 'error') { return { status: 400, body: { message: '参数错误' } }; } // 默认返回 return { id: 2, name: '访客' }; } ``` ### 有状态接口联动 动态 Mock 函数还会接收第二个参数 `ctx`。你可以通过 `ctx.state` 在不同接口之间共享数据,从而模拟真实的增删改查流程。 **新增用户:** ```javascript (req, ctx) => { const user = { id: Date.now(), ...req.body }; ctx.state.update('users', (users = []) => [user, ...users]); return { code: 0, message: 'created', data: user }; } ``` **获取用户列表:** ```javascript (req, ctx) => { const users = ctx.state.get('users') || []; return { code: 0, data: users, total: users.length }; } ``` 配置这两条规则后,`POST /api/users` 会写入共享 Mock State,后续 `GET /api/users` 会返回更新后的用户列表。 控制台提供 **State** 标签页,可查看、编辑、导入、复制、清空并持久化共享状态。 ### 导入与导出 无缝集成现有的 API 工作流。 - **导入**: 支持从 **Postman Collection (v2.1)** 和 **OpenAPI 3.0 (Swagger)** 文件直接导入 Mock 规则。 - 智能转换将自动映射字段,如 `user_id` 映射为 `@guid`。 - **导出**: 支持直接从规则编辑器将任意 Mock 规则导出为 **Postman JSON** 格式,方便分享或在其他工具中测试。 **使用方法**: 点击控制台顶部的"导入"按钮,选择 JSON 文件即可。 ### 功能全面的网络面板 内置的网络面板将实时记录所有网络请求(包括 Mocked 和真实请求),提供强大的调试功能: - **查看详情**: 点击日志查看完整的 Request/Response Body。 - **右键菜单**: 在任意日志上右键单击即可: - **复制 URL/响应**: 快速复制数据到剪贴板。 - **复制为 cURL**: 生成 cURL 命令以便在终端重现请求。 - **添加到 Mock 规则**: 即时将真实请求转换为 Mock 规则。 - **筛选**: 支持按 URL、方法、Mock 状态筛选。 ### Mock State 面板 **State** 面板用于管理接口联动所需的共享状态: - **查看/编辑 JSON**: 可以直接维护 `{ "users": [] }` 这类初始数据。 - **Persist 开关**: 控制状态是否在刷新页面后保留。 - **导入/复制/清空**: 方便快速准备或重置测试场景。 - **服务器模式同步**: 使用 Vite 插件时,状态会保存到 `pocket-mock-state.json`。 --- ## 技术原理 - **猴子补丁**: 通过重写 `window.fetch` 和扩展 `XMLHttpRequest` 原型链来拦截请求 - **Mock State**: 为动态 Mock 函数提供跨接口共享的 JSON 状态容器 - **Shadow DOM**: 使用 Shadow Root 封装调试 UI,实现样式完全沙箱化 - **Vite 库模式**: 使用 Vite 的库模式和 `css: 'injected'` 策略,将 CSS 内联到 JS 中,实现**单文件导入**体验 --- ## 项目路线图 查看我们的 [项目路线图](ROADMAP.zh-CN.md),了解 PocketMocker 的未来规划以及如何参与贡献! --- ## 贡献与联系 我们欢迎所有对 PocketMocker 的贡献!无论是报告 Bug、提出新功能建议、改进文档还是提交代码,您的帮助都将使 PocketMocker 变得更好。 请阅读我们的 [贡献指南](CONTRIBUTING.zh-CN.md) 了解如何参与项目。 ### 联系我 如果您有任何疑问、建议或想加入交流,欢迎通过以下方式联系: - **Twitter (X)**: [https://x.com/tiancha79267301](https://x.com/tiancha79267301) - **微信**
我的微信
--- ## License MIT © [tianchangNorth](https://github.com/tianchangNorth) ---
**掌控 HTTP,主宰你的前端!**