Faker 使用指南:从 Node.js 到浏览器,掌握 @faker-js/faker 的完整用法
【免费下载链接】fakerGenerate massive amounts of fake data in the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/faker/faker
本指南以 faker 仓库 docs/guide/usage.md 为核心,系统讲解@faker-js/faker在各种运行环境下的接入方式、TypeScript 配置要点、可复现随机结果的种子机制,以及如何用工厂函数生成复杂业务对象。读完本文,你将能在 Node.js、浏览器控制台、Deno/CDN 场景中正确引入并使用 Faker,写出稳定可复现的测试数据生成代码,并掌握simpleFaker轻量生成与seed/refDate复现技巧。
环境要求与安装
Faker 支持在浏览器与 Node.js 中运行。当前仓库package.json声明engines.node: "^22.13.0 || ^23.5.0 || >=24.0.0",因此请确保 Node.js 版本满足要求。安装时推荐作为开发依赖(devDependency)引入:
# npm npm install @faker-js/faker --save-dev # pnpm pnpm add @faker-js/faker --save-dev # yarn yarn add @faker-js/faker --dev # deno deno add --dev @faker-js/faker安装完成后即可从@faker-js/faker导入使用,下面的章节覆盖各个运行环境。
在 Node.js 中使用
Faker 同时提供 ESM 与 CommonJS 两种导入方式,包本身"type": "module",但通过构建产物同时支持require与import(见 package.json 的exports与main/module字段)。
ESM(推荐):
import { faker } from '@faker-js/faker'; // 或,若想要不同语言环境 // import { fakerDE as faker } from '@faker-js/faker'; const randomName = faker.person.fullName(); // Rowan Nikolaus const randomEmail = faker.internet.email(); // Kassandra.Haley@erich.bizCommonJS:
const { faker } = require('@faker-js/faker'); // 或,若想要不同语言环境 // const { fakerDE: faker } = require('@faker-js/faker'); const randomName = faker.person.fullName(); // Rowan Nikolaus const randomEmail = faker.internet.email(); // Kassandra.Haley@erich.biz关于语言环境的选用、自定义与回退策略,请参阅 本地化指南。从源码看,fakerDE这类预构建实例来自 src/locale/ 目录下各语言定义(如de.ts),每个实例都基于 Faker 主类 构造;而默认的faker实例使用en数据。
在浏览器中使用
你可以直接打开浏览器控制台(Ctrl + Shift + J/F12)体验 Faker:
- 在官方文档网站上,可以通过
await enableFaker()注入; - 或者直接在控制台运行:
const { faker } = await import('https://esm.sh/@faker-js/faker'); const randomName = faker.person.fullName(); // Amber Keebler const randomEmail = faker.internet.email(); // Norma13@hotmail.com部分网站可能有防护策略阻止加载外部代码,通常本地开发服务器(dev server)没有问题。作为替代方案,你可以创建一个简单的 HTML 文件并用浏览器打开:
<script type="module"> import { faker } from 'https://esm.sh/@faker-js/faker'; // Caitlyn Kerluke const randomName = faker.person.fullName(); // Rusty@arne.info const randomEmail = faker.internet.email(); document.getElementById('name').value = randomName; document.getElementById('email').value = randomEmail; </script> <input id="name" /> <input id="email" />注意:在浏览器中实验非常方便 👍,但由于 Faker 携带大量用于生成数据的字符串,它是一个体积很大的包(压缩后
> 5 MiB)。请避免在你的 Web 应用中部署完整的 Faker 包,浏览器场景只适合实验与演示。如果只是需要少量非本地化数据,请优先使用后文介绍的simpleFaker。
CDN 与 Deno
在 Deno 或纯 CDN 场景,直接通过 URL 导入即可:
import { faker } from 'https://esm.sh/@faker-js/faker'; const randomName = faker.person.fullName(); // Willie Bahringer const randomEmail = faker.internet.email(); // Tomasa_Ferry14@hotmail.com注意:在 Deno 中强烈建议为导入加上版本标签,例如
import { faker } from "https://esm.sh/@faker-js/faker@v10.6.0",以避免后续版本升级导致输出数据变化(详见下文“可复现结果”中的版本说明)。当前仓库版本为10.6.0,见 package.json。
其他可用 CDN 链接:
- ESM:
https://cdn.jsdelivr.net/npm/@faker-js/faker/+esm - CJS:
https://cdn.jsdelivr.net/npm/@faker-js/faker
TypeScript 支持
Faker 默认假定你使用 TypeScript(严格模式)。不使用 TS 也可以,但错误的参数类型不会得到专门的报错信息。要让类型提示正常工作,请在tsconfig中检查以下compilerOptions:
{ "compilerOptions": { "moduleResolution": "Bundler", // 或 "Node10"、"Node16"、"Node20"、"NodeNext" "strict": true // 可选,但推荐 } }{ "compilerOptions": { "moduleResolution": "Bundler", // 或 "Node20" 或 "NodeNext" "strict": true // 可选,但推荐 } }仓库的package.json中types指向./dist/index.d.ts,且通过typesVersions对 TypeScript >= 5.0 提供locale/*子路径类型(见 package.json),因此各语言实例(如fakerDE)也有完整的类型推导。仓库自身的 tsconfig.json 可作为工程化参考。
可复现结果:seed 与默认参考日期
默认情况下,Faker 每次调用都会返回不同的随机值:
faker.music.genre(); // "Soul" faker.music.genre(); // "Reggae"如果希望结果一致,可以设置自己的种子(seed):
faker.seed(123); const firstRandom = faker.number.int(); // 再次设置相同的种子会重置随机序列。 faker.seed(123); const secondRandom = faker.number.int(); console.log(firstRandom === secondRandom);seed 的底层实现
从源码看,seed()定义在 src/simple-faker.ts:它接受一个number或number[]作为参数,内部调用this.fakerCore.randomizer.seed(seed)并将种子返回;不传参时使用randomSeed()生成随机种子——其实现为Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER)(见 src/internal/seed.ts)。默认随机器是基于梅森旋转(Mersenne Twister)的伪随机数生成器(见 src/core.ts 中generateMersenne53Randomizer)。由于生成的值同时依赖种子与设置种子以来的调用次数,在测试中建议使用硬编码种子;若想保持“真随机但可复现”,可以console.log('Running test with seed:', faker.seed())打印种子,需要复现时再显式传入。
注意:升级到 Faker 新版本后,同一种子可能产生不同结果,因为底层数据(姓名、单词等列表)可能发生了变化。这也是 Deno 场景建议锁定版本号的原因。
相对日期方法与参考日期
有一类方法使用相对日期,仅设置随机种子不足以复现,例如:faker.date.past、faker.date.future、faker.date.recent、faker.date.soon、faker.git.commitEntry和faker.string.uuid({ version: 7 })。原因在于这些方法默认以“今天”为基准生成之前或之后的日期,而“今天”取决于代码运行时刻。解决方法是指定固定的参考日期(refDate),支持Date或字符串:
// 生成 2023-01-01 之后不久的一个日期 faker.date.soon({ refDate: '2023-01-01T00:00:00.000Z' });也可以为所有这些方法设置一个全局默认参考日期:
// 影响之后所有 faker.date.* 调用 faker.setDefaultRefDate('2023-01-01T00:00:00.000Z');setDefaultRefDate的实现在 src/utils/set-default-ref-date.ts:若传入函数则直接作为defaultRefDate源;否则包装为() => new Date(dateOrSource)。它接受string | Date | number | (() => Date),还可以传入一个每次调用返回新Date实例的函数,实现“按需推进时钟”的效果(例如每次调用 +1 秒),默认值为() => new Date()。完整示例见 src/simple-faker.ts 的 JSDoc。
简单数据生成:simpleFaker
Faker 提供了一个simpleFaker,用于生成不依赖任何语言环境的数据,如数字与字符串;helpers中的arrayElement、multiple等工具方法同样可用。这在仅需为测试环境生成 UUID 等数据、但不想初始化/加载完整 Faker 实例时非常有用——完整实例会包含至少 500KB 的本地化数据。
import { simpleFaker } from '@faker-js/faker'; const uuid = simpleFaker.string.uuid();从 src/simple-faker.ts 的源码注释可见,SimpleFaker只包含以下模块:
datatypedate(不含month和weekday)helpers(不含fake)location(仅latitude、longitude、nearbyGPSCoordinate)numberstring
SimpleFaker也支持seed()、setDefaultRefDate()与自定义构造(new SimpleFaker({ seed })),详见 SimpleFaker API 文档。核心构造逻辑在 src/core.ts 的createFakerCore:未提供 locale 时核心没有任何本地化数据,凡依赖本地化数据的方法调用会抛出错误,这正符合“省内存、只生成通用数据”的定位。
创建复杂对象:工厂函数模式
Faker 主要生成基础类型的值——现实世界中对象 schema 往往千差万别。因此,要生成一个对象,通常需要为它编写工厂函数(factory function)。
以下示例使用 TypeScript 强类型定义模型:
import type { SexType } from '@faker-js/faker'; type SubscriptionTier = 'free' | 'basic' | 'business'; interface User { _id: string; avatar: string; birthday: Date; email: string; firstName: string; lastName: string; sex: SexType; subscriptionTier: SubscriptionTier; }注意两点:
subscriptionTier不是普通字符串,而只能是'free'、'basic'、'business'三者之一;- 真实业务中,模型不应依赖第三方库的类型(这里的
SexType即属此类),本示例仅为演示。
第一个工厂函数
import { faker } from '@faker-js/faker'; interface User { ... } function createRandomUser(): User { return { _id: faker.string.uuid(), avatar: faker.image.avatar(), birthday: faker.date.birthdate(), email: faker.internet.email(), firstName: faker.person.firstName(), lastName: faker.person.lastName(), sex: faker.person.sexType(), subscriptionTier: faker.helpers.arrayElement(['free', 'basic', 'business']), }; } const user = createRandomUser();这个版本已经可以满足大多数需求。但所有属性都是独立随机生成的,可能产生不合理的组合,例如sex为'female'而firstName却是'Bob'。
重构:让属性之间产生关联
import { faker } from '@faker-js/faker'; function createRandomUser(): User { const sex = faker.person.sexType(); const firstName = faker.person.firstName(sex); const lastName = faker.person.lastName(); const email = faker.internet.email({ firstName, lastName }); return { _id: faker.string.uuid(), avatar: faker.image.avatar(), birthday: faker.date.birthdate(), email, firstName, lastName, sex, subscriptionTier: faker.helpers.arrayElement(['free', 'basic', 'business']), }; } const user = createRandomUser();关键变化在于生成顺序:
- 先取
sex,作为firstName的输入参数,保证性别与名字一致; - 再取
lastName(本例中男女姓氏无差异,故不传sex;若有差异也可传入); - 最后把
firstName与lastName一并传入faker.internet.email({ firstName, lastName }),使邮箱基于真实姓名生成,更加合理。
与_id使用的 UUID 实现(碰撞概率极低)不同,email在参数相似时更容易产生重复值。关于生成唯一值的专门方案,请参阅 唯一值生成指南。
支持 overwrites 与 options
为了对特定属性获得更多控制,可以引入overwrites、options之类的参数:
import { faker } from '@faker-js/faker'; function createRandomUser(overwrites: Partial<User> = {}): User { const { _id = faker.string.uuid(), avatar = faker.image.avatar(), birthday = faker.date.birthdate(), sex = faker.person.sexType(), firstName = faker.person.firstName(sex), lastName = faker.person.lastName(), email = faker.internet.email({ firstName, lastName }), subscriptionTier = faker.helpers.arrayElement([ 'free', 'basic', 'business', ]), } = overwrites; return { _id, avatar, birthday, email, firstName, lastName, sex, subscriptionTier, }; } const user = createRandomUser(); const userToReject = createRandomUser({ birthday: new Date('2124-10-20') });解构默认值(destructuring defaults)模式让调用方可以只覆盖关心的字段。一个潜在的options参数可用于:
- 控制哪些可选属性被包含;
- 控制嵌套元素与数组如何合并或替换;
- 指定嵌套列表要生成的项目数量。
工厂函数背后的 helpers 支撑
示例中的faker.helpers.arrayElement(['free', 'basic', 'business'])对应 src/modules/helpers/array-element.ts,随机返回数组中的一个元素。若需一次性生成多个元素,可用faker.helpers.arrayElements(array, count)或faker.helpers.arrayElements(array, { min, max });批量执行任意生成函数则用faker.helpers.multiple(() => faker.person.firstName(), { count: 3 })(见 src/modules/helpers/module.ts 的示例)。这些工具让工厂函数既能控制数量,又能保持类型安全。
进阶指引
- 想了解如何选择、组合与自定义语言环境,参见 本地化指南;
- 需要保证生成的邮箱、用户名等不重复,参见 唯一值生成指南;
- 需要自定义随机数生成器(Randomizer),参见 随机器指南;
- 完整的模块与 API 清单,可在 API 文档 中检索;
simpleFaker的专属 API 见 SimpleFaker 文档。
至此,你已经掌握了 Faker 在 Node.js、浏览器、CDN/Deno 中的接入方式、TypeScript 配置要点、种子与参考日期复现机制、轻量级simpleFaker,以及用工厂函数生成任意复杂对象的完整方法论。Happy faking 🥳
【免费下载链接】fakerGenerate massive amounts of fake data in the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/faker/faker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考