停止等待后端 API:推出 Fakelab,TypeScript-First Mock Server

发布: (2025年12月30日 GMT+8 01:07)
12 min read
原文: Dev.to

Source: Dev.to

如果你是前端开发者,你一定遇到过这种情况:你已经准备好开发一个功能,但后端 API 还没有准备好。或者它已经准备好,但速度慢、不可靠,或者需要在本地设置的身份验证非常麻烦。你需要真实的数据来进行开发,但又不想花几个小时编写 mock 处理程序或维护与类型不同步的 JSON 固件。

我也有同样的经历。这就是我创建 Fakelab 的原因——一个直接从你的 TypeScript 接口生成真实数据的 mock API 服务器。经过数月的开发和真实场景测试,我现在发布 v1.0

Mock API 的真实问题

我认识的大多数前端开发者都使用以下一种方式:

选项 1:硬编码 JSON 文件

  • 启动快,但维护起来会变成噩梦
  • 没有类型安全
  • 数据会变陈旧
  • 难以生成多种变体

选项 2:使用 json-server 或 MSW 等工具

  • json-server 很好用,但仍需手动编写 JSON
  • MSW 功能强大,但需要为每个端点编写处理器
  • 两者都要求你将模拟数据与类型分开维护

选项 3:等待后端

  • 如果想要交付功能,这根本不是选项

核心问题是 重复:你在 TypeScript 中定义类型,然后在别处定义模拟数据。类型一变,模拟就会出错;模拟一改,类型可能就不对了。这始终是摩擦的来源。

为什么现有工具不够

我尝试了所有办法。json-server 很可靠,但我厌倦了编写与我的类型不匹配的 JSON。MSW 在测试时表现出色,但在开发时我想要更简单的方案——只要指向我的 TypeScript 文件就能得到一个 API。

MirageJS 接近我的需求,但对我来说显得有些笨重,且 API 感觉有点过时。我想要一种与现代 TypeScript 工作流天然契合的工具。

我真正想要的是:

  • 一次定义类型,自动生成 mock 数据
  • 类型安全的 mock 数据生成
  • 无需手动编写即可得到真实感的数据
  • 用于测试有状态操作的持久化数据库
  • 用于测试边缘情况的网络模拟
  • 零样板代码

于是我创建了 Fakelab

Fakelab 是什么?

Fakelab 是一个基于 Node.js 的 mock API 服务器,它读取你的 TypeScript 接口并生成带有真实感假数据的 REST 端点。你可以使用 JSDoc 注释在类型上添加 Faker.js 指令,剩下的交给 Fakelab 来处理。

亮点

  • TypeScript‑first – 您的类型是真实数据的唯一来源。无需单独的 mock 定义。
  • Zero boilerplate – 为接口添加注解,启动服务器,即可获得端点。
  • Persistent database – 内置数据库模式让您可以测试创建、更新和删除操作。
  • Snapshot real APIs – 捕获真实 API 的响应并将其转化为可复用的 mock。
  • Network simulation – 在不修改代码的情况下测试加载状态、重试和错误处理。
  • Runtime API – 使用简洁的 API 在前端代码中访问 mock。

功能要点说明

TypeScript‑First 与 Faker 注解

与其手动编写模拟数据,不如在 TypeScript 接口上添加注解:

// fixtures/user.ts
export interface User {
  /** @faker string.ulid */
  id: string;

  /** @faker person.fullName */
  name: string;

  /** @faker location.streetAddress */
  address: string;

  /** @faker phone.number */
  phone: string;

  /** @faker number.int({ min: 10, max: 80 }) */
  age: number;
}

Fakelab 会解析这些注解并使用 Faker.js 生成逼真的数据。当你请求 /api/User 时,会得到一个包含真实姓名、地址和电话号码的用户数组,而不是 "test""asdf"

Snapshot:捕获真实 API

我最喜欢的功能之一是 snapshot 命令。有时你想从已有的 API 快速生成模拟数据:

npx fakelab snapshot https://jsonplaceholder.typicode.com/todos --name Todo

Fakelab 会抓取响应,推断出 TypeScript 类型,并将其保存为模拟源。以后可以刷新,或在配置中定义多个源。这在从真实 API 迁移或需要离线开发时冻结响应特别有用。

数据库模式

默认情况下,Fakelab 会在每次请求时生成全新的数据。若要测试有状态的操作,可以启用数据库模式:

// fakelab.config.ts
export default defineConfig({
  database: { enabled: true },
});

这样就可以种子数据、查询、更新记录,并测试应用的数据流。数据库在服务器重启之间保持持久(底层只是使用 lowdb 的 JSON 文件)。

网络模拟

当你的模拟始终瞬间成功时,测试错误状态和加载指示器会非常烦人。Fakelab 让你模拟真实的网络条件:

network: {
  delay: [300, 1200],      // 随机延迟 300‑1200 ms
  errorRate: 0.1,          // 10 % 的请求失败
  timeoutRate: 0.05,       // 5 % 的请求超时
  errors: {
    statusCodes: [400, 404, 500],
  },
}

你可以在不手动 mock fetchaxios 的情况下,测试重试逻辑、错误边界和加载状态。

运行时 API

Fakelab 提供了一个运行时 API,前端可以直接使用:

import { fakelab } from "fakelab/browser";

// 获取 10 条用户数据
const users = await fakelab.fetch("User", 10);

// 获取基础 URL
const apiUrl = fakelab.url(); // "http://localhost:50000/api"

当你需要以编程方式生成数据或将 Fakelab 融入开发工作流时,这非常有用。

简短代码示例

下面是一个完整示例。首先,定义类型和配置:

// fakelab.config.ts
import { defineConfig } from "fakelab";

export default defineConfig({
  sourcePath: ["./fixtures"],
  server: { port: 50000 },
  database: { enabled: true },
  network: {
    delay: [200, 800],
    errorRate: 0.05,
  },
});
// fixtures/product.ts
export interface Product {
  /** @faker string.uuid */
  id: string;

  /** @faker commerce.productName */
  name: string;

  /** @faker commerce.price */
  price: number;

  /** @faker commerce.department */
  category: string;
}

启动服务器:

npx fakelab start

现在,你拥有一个运行在 http://localhost:50000/api 的完整功能模拟 API,能够提供真实的 Product 数据、持久化存储以及网络模拟——所有这些都源自单个 TypeScript 接口。

// fakelab.config.ts (alternative minimal config)
import { defineConfig } from "fakelab";

export default defineConfig({
  port: 50101,
  database: { enabled: true },
});

启动服务器

npx fakelab serve

此时你拥有:

  • GET /api/User – 返回用户数组
  • GET /api/User?count=5 – 返回 5 条用户数据
  • POST /api/User – 创建新用户(前提是已启用数据库)

在 React 应用中使用

import { fakelab } from "fakelab/browser";

const users = await fakelab.fetch("User", 10);
// 或者使用普通的 fetch:
const response = await fetch("http://localhost:50000/api/User");

Source:

50101/api/User?count=10");
const users = await response.json();

就是这样。没有处理程序,没有 JSON 文件,没有样板代码。

当你应该使用 Fakelab(以及何时不该使用)

使用 Fakelab 的情形:

  • 你在构建前端,而后端尚未准备好。
  • 你想离线开发或不依赖后端。
  • 需要使用真实的数据变体进行测试。
  • 想要类型安全的 mock,且能与类型保持同步。
  • 正在做原型,需要快速得到一个 API。

不要使用 Fakelab 的情形:

  • 需要在 mock 中实现复杂业务逻辑(此时使用 MSW)。
  • 进行与真实后端的集成测试(使用真实 API)。
  • 需要 GraphQL(Fakelab 目前仅支持 REST)。
  • 需要认证/授权逻辑(Fakelab 故意保持简洁)。

Fakelab 是一种开发工具,而非测试框架。它旨在加快前端开发并提升独立性,而不是取代集成测试。

为谁而建

  • 前端开发者,希望独立工作。
  • React/Next.js 开发者,需要快速获取真实数据。
  • 团队,前后端并行工作。
  • 开发者,重视类型安全并希望模拟符合其类型。

如果你熟悉 MSWjson‑serverMirageJS,Fakelab 应该会感觉熟悉但更简洁。如果你从未使用过模拟服务器,Fakelab 可能是最容易上手的选择。

未来路线图

Fakelab v1 稳定且对大多数用例功能完整,但还有更多功能即将推出:

  • GraphQL 支持 – 根据你的类型生成 GraphQL 架构。
  • 自定义生成器 – 编写超出 Faker 的自定义数据生成器。
  • 关系 – 定义类型之间的关系(例如,User 拥有多个 Posts)。
  • Webhook 改进 – 重试机制和更好的错误处理。
  • 性能 – 为更大的数据集和更快的启动进行优化。

我也欢迎功能请求。如果 Fakelab 没有满足你的需求,请打开 issue 并让我们讨论。

试一试

Fakelab 是开源的,采用 MIT 许可证。使用以下命令安装:

npm install fakelab --save-dev

查看文档或浏览示例以了解实际效果。

如果你尝试后发现它能帮助你更快发布,请告诉我。如果遇到问题或有想法,请提交 issue 或 PR。这是我为自己构建的工具,但我愿意分享,因为我认为其他开发者也会觉得它很有用。

结束语

构建 Fakelab 让我深刻了解了开发者真正需要的工具。我们不需要更多功能——我们需要的是不妨碍我们、让我们专注于构建的工具。Fakelab 并不是想要面面俱到,而是专注于做好一件事:提供一个与你的 TypeScript 类型配合使用的 mock API 服务器,而不是与之冲突。

如果这对你有用,试试看吧。如果不需要,也没关系。但如果你厌倦了等待后端 API 或者维护总是不同步的 mock 数据,Fakelab 可能正是你想要的。

Back to Blog

相关文章

阅读更多 »