Faker 贡献指南:提交高质量 Pull Request 的完整流程(从分支同步到合并)
【免费下载链接】fakerGenerate massive amounts of fake data in the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/faker/faker
Faker(@faker-js/faker)是一个用于在浏览器与 Node.js 中批量生成假数据的开源库,其核心开发分支为next。本文基于官方《Submit a Pull Request》贡献文档,完整梳理从分支同步、代码修改、preflight 全量检查、语义化 PR 标题,到合并标准的八步流程,并结合仓库源码(如 package.json、CHANGELOG.md、测试支撑文件)给出可验证的实操细节。读完本文,你将掌握一套可直接照搬的 Faker 贡献工作流,并理解为什么 PR 标题必须遵循 Conventional Commits 规范。
贡献流程总览
提交一个 PR 的完整链路如下:
| 步骤 | 动作 | 关键命令 |
|---|---|---|
| 1 | 保持分支与上游同步 | git fetch upstream/git switch next/git merge upstream/next |
| 2 | 创建独立开发分支 | git switch -c my-branch-name |
| 3 | 修改代码并同步文档 | 遵循项目编码规范,补充 JSDoc 与文档 |
| 4 | 运行 preflight 全量检查 | pnpm run preflight |
| 5 | 提交并推送 | git commit -m "feat: ..."/git push origin my-branch-name |
| 6 | 打开 Pull Request | 面向next分支,标题遵循type(scope): subject |
| 7 | 根据维护者反馈迭代 | 耐心回复并持续更新 PR |
| 8 | 满足合并条件后合入 | 见文末合并标准 |
下面按步骤展开。
Step 1:确保分支与上游同步
Faker 的所有开发都发生在next分支(本仓库当前默认分支即为next)。在开始改动前,必须保证你的 fork 与上游仓库同步,官方推荐的三条命令是:
git fetch upstream git switch next git merge upstream/next其中upstream是你为 fork 添加的上游 remote。如果你尚未配置开发环境,请先参考 Set Up a Development Environment:先 fork 并 clone 仓库,然后执行git remote add upstream <上游地址>与git fetch upstream,完成原生 Node.js 环境或 VSCode Devcontainer 环境的搭建。
Faker 对运行环境有明确要求,见 package.json 中的engines与packageManager字段:
- Node.js:
^22.13.0 || ^23.5.0 || >=24.0.0 - 包管理器:
pnpm@11.25.0
使用正确版本的 pnpm 可以避免大量由依赖树不一致引发的问题。
Step 2:创建新分支
同步完成后,为你的改动创建一个独立分支:
git switch -c my-branch-name描述性的分支名(例如feat/add-casing-option、fix/location-postcode-zh)能让评审者更快理解 PR 意图,也方便你在多次贡献后快速识别每个分支的历史原因。
Step 3:修改代码并同步更新文档
按需修改源码文件,并确保它们符合 Faker 的编码标准。Faker 的所有数据生成器都按模块(namespace)组织在 src/modules 目录下,当前包含airline、animal、book、color、commerce、company、database、datatype、date、finance、food、git、hacker、helpers、image、internet、location、lorem、medical、music、number、person、phone、science、string、system、vehicle、word等 28 个模块。
需要注意两点:
- 如果 PR 引入了新功能,必须同步更新文档(文档站点由 VitePress 构建,见 docs 目录),否则会被评审打回。
- 所有对外暴露的方法都需要编写规范的 JSDoc(包含描述、
@param、@example、@since等标签),因为 API 文档由generate:api-docs脚本自动从 JSDoc 生成。
Step 4:运行 preflight 全量检查
提交之前,务必在仓库根目录运行一次 Faker 团队提供的"一键式"检查命令:
pnpm run preflight这是一条非常有用的综合命令,作用是让本地环境始终与分支状态保持一致。它在切换分支后特别有帮助——可以一次性地把依赖、生成产物、格式、构建与测试全部对齐。
preflight是以下脚本按顺序执行的总和(package.json 中定义):
| 顺序 | 命令 | 作用 |
|---|---|---|
| 1 | pnpm install | 安装 package.json 中声明的 npm 包 |
| 2 | pnpm run generate:locales | 重新生成本地化(locale)数据文件 |
| 3 | pnpm run generate:api-docs | 生成 API 文档 |
| 4 | pnpm run format | 运行 oxfmt 格式化代码 |
| 5 | pnpm run lint | 运行 oxlint 强制项目代码规范 |
| 6 | pnpm run build:clean | 清理上一次构建的产物 |
| 7 | pnpm run build:code | 构建代码 |
| 8 | pnpm run test:update-snapshots | 运行全部测试(vitest),并在需要时更新快照 |
| 9 | pnpm run ts-check | 检查所有文件无 TypeScript 类型错误 |
在 package.json 中可以看到实际的脚本组合方式:
"generate": "run-s generate:locales generate:api-docs", "build": "run-s build:clean build:code", "preflight": "pnpm install && run-s generate format lint build test:update-snapshots ts-check"即generate聚合了第 2、3 步,build聚合了第 6、7 步,最终由run-s(npm-run-all2)按顺序串行执行。值得注意的是,preflight中test:update-snapshots使用的是vitest run -u,即测试失败时会直接更新快照文件——这正是它适合"切换分支后同步环境"的原因,但提交 PR 前请务必仔细 review 快照的 diff,确认没有意外的行为变化被"顺手"写死进快照(详见下方测试小节)。
Step 5:提交并推送你的改动
一切检查通过后,提交并推送:
git commit -m "feat: Add support for XYZ functionality" git push origin my-branch-nameFaker不强制任何特定的提交信息规范——因为 PR 合并时,所有 commit 会被 squash 成一个提交,最终进入历史的是 PR 标题。但官方仍然建议写有意义的提交信息,这既能让你在提交时自我审视改动内容,也能让评审者从提交历史中快速获得高层理解。
Step 6:打开 Pull Request
推送完成后,在你的 fork 仓库页面打开一个指向 Faker 仓库next分支的 Pull Request。官方 PR 指南要求:
- 清晰解释你的改动内容以及为什么需要它;
- 尽可能关联相关的 issue;
- 保持 PR 聚焦,避免把多个无关改动捆绑在一起;
- 如果适用,为新增功能补充测试。
PR 标题必须遵循 Conventional Commits
PR 标题之所以重要,是因为它会在合并时被用作最终的 commit message,而这些消息会被自动用于每个版本发布时的 CHANGELOG.md 更新(当前仓库通过commit-and-tag-version自动生成变更日志)。因此标题必须遵循 Conventional Commits 语义化提交规范,统一格式为:
type(scope): subjecttype:必填,表示 PR 意图
| type | 说明 | 是否出现在 CHANGELOG |
|---|---|---|
feat | 引入新功能 | ✅ |
fix | 修复了一个 bug | ✅ |
chore | 没有影响用户的代码改动 | ❌ |
refactor | 影响了用户的重构(如打印弃用警告) | ✅(带localescope 时显示为### Changed Locales) |
docs | 文档新增或修改 | ❌ |
test | 测试新增或修改 | ❌ |
ci | CI 配置新增或修改 | ❌ |
build | 构建脚本新增或修改 | ❌ |
infra | 基础设施相关改动(如更新 issue 模板) | ❌ |
revert | 通过 git 触发回滚 | ❌ |
补充说明:feat与fix会分别以### Features、### Bug Fixes出现在 CHANGELOG 中;带localescope 的refactor会以### Changed Locales出现;其余类型默认不展示,除非是带!的破坏性变更(breaking change)。查看 CHANGELOG.md 可以直观看到这些分组。
scope:可选,表示改动范围
| scope | 说明 |
|---|---|
<module-name> | 受影响的模块名(如location、person) |
locale | 仅新增/更新/删除本地化数据 |
module | 涉及多个模块或模块相关改动 |
revert | 通过 git 回滚 |
deps | 依赖更新(主要由 Renovate 机器人使用) |
release | 由发布流程设置 |
scope 会以粗体显示在 CHANGELOG 的 subject 前面,且提交按字母排序,因此相同 scope 的提交会自然聚合成类目。需要留意的是:scope不能通过 Semantic Pull Request 动作自动校验——因为如果把 scope 限制为现有模块,那么新增模块(如新增color模块)时作者就无法使用新模块名作为 scope。因此 Faker 团队会人工审查并保留按需编辑标题的权利。
subject:必填,描述 PR 做了什么
- 不要以
(#123)之类的 PR 编号作为标题后缀,GitHub 合并时会自动附加。 - 破坏性变更要在
:前加!,如refactor!: remove faker default export。
官方给出的一系列合法标题示例:
feat: add casing option feat(locale): extend Hebrew (he) fix: lower target to support Webpack 4 chore: add naming convention rule refactor(location): deprecate streetPrefix and streetSuffix docs: remove unused playground test: validate @see contents ci: allow breaking change commits build: add node v18 support infra: rework bug-report template revert: add more arabic names dataset (#362) # Breaking changes refactor!: remove faker default export build!: remove node v12 support # A release PR will look like this chore(release): 7.4.0 # Renovate automatically generates these chore(deps): update devdependencies chore(deps): update typescript-eslint to ~5.33.0此外,官方还列举了若干"本可以写得更好"的对比案例,核心教训是避免 scope 与 subject 的信息冗余:
- feat: `datatype.hexadecimal` signature change + feat(datatype): hexadecimal signature change datatype 是已有模块,可以作为 scope 使用 - feat(image): add image via.placeholder provider + feat(image): add via.placeholder provider subject 中不需要重复 "image" - feat(system.networkInterface): add networkInterface faker + feat(system): add networkInterface method networkInterface 在 scope 中冗余,且 "method" 更能说明这是什么 - chore(bug-report-template): new design + infra: rework bug-report template infra 类型表示没有实际代码改动,subject 说明具体做了什么 - chore: rename Gender to Sex + refactor(name): rename Gender to Sex 这影响了终端用户(运行时代码),不是 chore;scope 表明只影响 name 模块为改动补充测试
如果 PR 涉及新功能,官方强烈建议补充测试。Faker 的测试体系分为两类(详见 CONTRIBUTING.md 与 test 目录):
- 固定种子测试(Fixed Seeded Tests):使用固定随机种子,保证结果可复现、确定性输出,并配合自动生成的快照进行回归校验。种子定义在 test/support/seeded-runs.ts 中(当前为
[42, 1337, 1211]),实际用例可参考 test/modules/location.spec.ts 中的seededTests(faker, 'location', ...)用法。快照文件可通过pnpm run test -u更新。 - 随机种子测试(Random Seeded Tests):每次迭代随机输出,用于覆盖边界情况与通用结果校验,通常用正则或 validator.js 断言返回值合法性。
Step 7:根据反馈迭代
Faker 维护者可能会要求修改。请保持开放心态,及时更新你的 PR。需要理解的是,Faker 团队(见 Team 页面)由利用业余时间贡献的志愿者组成,如果你的 PR 没有立即获得评审,请耐心等待。
Step 8:合并条件与庆祝
你的改动一般在满足以下任一条件后会被合并进next分支:
- 1 位团队成员批准,且 7 天内没有其他成员提出新的修改请求;
- 2 位团队成员批准,且 24 小时内没有其他成员提出新的修改请求;
- 至少 3 位团队成员批准。
合并后,你的改动将进入 Faker 代码库,并通过语义化标题自动沉淀进下一版本的 CHANGELOG.md,惠及成千上万的开发者。
仓库关键文件速查
- package.json:
preflight等全部脚本定义、Node 版本与 pnpm 版本要求 - CONTRIBUTING.md:贡献规范总览(测试编写、弃用流程、JSDoc 约定、文档开发)
- docs/contributing/set-up-a-development-environment.md:开发环境搭建(fork、clone、原生 Node 或 Devcontainer)
- CHANGELOG.md:由 PR 标题自动生成的变更日志,可反查各类标题的实际展示效果
- src/modules:全部 28 个数据生成模块
- test/support/seeded-runs.ts:固定种子测试的种子定义与
seededTests辅助函数 - src/internal/deprecated.ts:弃用警告实现,对应
refactor类型 PR 的运行时行为
对照本文的八步流程,配合 preflight 脚本 与 Conventional Commits 标题规范,你就可以顺畅地完成一次面向 Fakernext分支的高质量贡献。
【免费下载链接】fakerGenerate massive amounts of fake data in the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/faker/faker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考