一个有故事的按需生成虚拟数据JS库,Faker

2,096 阅读4分钟

曾拥有 2.8 万 star 的流行库,原作者却"删库跑路",现在由社区维护。8名开发者参与其中,赋予其新的生命,同时也想让这个项目,从此变得更酷。

什么是Faker?

Faker 是一个用于生成虚拟数据的库。你可以用它来模拟数据,能极大方便测试、开发Mock数据等,广泛应用于以下场景:

  • 单元测试
  • 性能测试
  • 构建演示
  • 在没有完整后端的情况下工作

Faker 于 2004 年由 Jason Kohles 首次在 Perl 中实现,此后被移植到多种语言,包括RubyPythonJavaClojurePHPC#

后来 Marak Squires 实现了 NodeJs 版本,并投入了大量精力和时间来维护 Faker.js,该项目直至出事前在 npm 上每周有超过 280 万次下载,并有数以千计的开源库依赖它。

它曾发生了什么?现在又如何?#

Faker.js 项目由 Marak Squires 维护,他是早期有影响力的 Node 爱好者和专业人士,但由于其个人原因,2022 年 1 月 4 日 发生了 流氓和恶意行为简单讲就是作者资金出了问题,他觉得这个项目为许多公司甚至世界500强企业提供了帮助,所以希望大家能给他打款或者大公司能为他提供一份六位数年薪的工作,否则他不再维护该项目,结果最终还是向该库提交了恶意代码来作为收场),该事件引起了开源界不小的讨论,但无论该作者出于什么原因,此行为的结果直接导致了无数代码库崩溃,随即该包被删除,该项目被放弃。

后来一群工程师打算将 Faker 变成一个社区控制的开源项目,当主包被删除时,他们在 prod(生产环境)中使用 Faker,幸而没有受到波及,这八名工程师来自不同背景不同公司,共同参与着项目维护。

目前项目也已经有 7.2k Star,似乎正在渐渐步入正轨了,更新与issues处理上表现非常活跃,6天前才刚刚发布了新版本(7.5.0)。

到目前为止,团队做了什么?

  1. 创建了一个新的 Github 仓库:@faker-js/faker
  2. 组建一个由八名维护人员组成的团队。
  3. @faker-js/fakernpm 上发布了所有以前版本的 Faker。
  4. 发布了第 6 版 Alpha
  5. 几乎完成了向 TypeScript 的迁移,因此 definitelyTyped 不再需要维护其外部 @types/faker 包。
  6. 创建了一个公共 Twitter 帐户,用于与社区进行交流。
  7. 发布了第一个官方 Faker 文档 网站。
  8. 清理了 Prettier、CI、Netlify Deploy Previews 和 GitHub Actions 等工具。
  9. 完成了大量的问题分类和许多许多 PR 审查。

这无疑是庞大的工作量,可以看出团队是真心热爱这个项目,而他们也提到了另一位老哥 Jeff Beltran,他在过去 3 年中一直在维护一个非官方 faker.js 的文档项目,这也是 Faker 新官网的由来。

打开了 64 个拉取请求。 合并了34个。 44个问题被打开。 25个被关闭。

项目发展计划

目前开发团队表示完全打算扩展 Faker,不断发展它,让它不断变得更好

  1. ESM 的支持!
  2. Browserify => Rollup / Vite
  3. 改进测试基础设施
  4. typegen 类型生成文档
  5. 与 Faker 生态系统的现有维护者互动,在文档中建立交流广场
  6. 兼容 Node 18

可以看出团队打算对这个重生的库引入各种新技术,目前来看初步取得的成果不错,项目有不少贡献者,TypeScript 代码也几乎全覆盖了:

image.png

关于项目的资金安排等其他计划看不太懂,这里就不过多展开了。

下面简单讲讲项目如何使用吧。

安装

可以使用任意你喜欢的方式引入包:

npm install @faker-js/faker --save-dev

yarn add @faker-js/faker --dev

pnpm add @faker-js/faker --save-dev

用法

NodeJs 端:

import { faker } from '@faker-js/faker';
// or, if using CommonJS
// const { faker } = require('@faker-js/faker');

const randomName = faker.name.fullName(); // Rowan Nikolaus
const randomEmail = faker.internet.email(); // Kassandra.Haley@erich.biz

浏览器端:

<!-- Since v6 only type=module is supported -->
<script type="module">
  import { faker } from 'https://cdn.skypack.dev/@faker-js/faker';

  // Caitlyn Kerluke
  const randomName = faker.name.fullName();

  // Rusty@arne.info
  const randomEmail = faker.internet.email();
</script>

使用浏览器非常适合进行实验 👍。但是,由于 Faker 用于生成假数据的所有字符串,Faker 是一个大包。它被> 5 MiB缩小了。应该避免在 Web 应用程序中部署完整的 Faker。

CDN / Deno

js

import { faker } from 'https://cdn.skypack.dev/@faker-js/faker';

const randomName = faker.name.findName(); // Willie Bahringer
const randomEmail = faker.internet.email(); // Tomasa_Ferry14@hotmail.com

强烈建议在 Deno 中导入库时使用版本标签,例如:import { faker } from "https://cdn.skypack.dev/@faker-js/faker@v7.4.0". 添加?dts到带有类型定义的导入:import { faker } from "https://cdn.skypack.dev/@faker-js/faker@v7.4.0?dts".

某些第三方 CDN 链接:

esm:

cjs:

TypeScript

需要检查这些compilerOptions是否在你的tsconfig文件中正确设置:

json

{
  "compilerOptions": {
    "esModuleInterop": true,
    "moduleResolution": "Node"
  }
}

然后像其他所有内容一样简单地导入它:

ts

import { faker } from '@faker-js/faker';

如果出于任何原因想要之前的版本v6,您可以使用例如 src 文件夹中的文件@types/faker将声明重新绑定到@faker-js/faker包中。faker.d.ts

ts

// faker.d.ts
declare module '@faker-js/faker' {
  import faker from 'faker';
  export default faker;
}

stackblitz 在线试用 Demo | 官方网址 | Github 地址

开源不易,在这里对所有做社区维护工作的作者们表示敬意,也希望他们能越来越好,坚持怀揣那份对技术的热情!