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

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

曾拥有 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 地址

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

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
29天前
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
104 48
|
28天前
|
JavaScript 前端开发
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
|
28天前
|
CDN
如何在项目中使用Moment.js库?
如何在项目中使用Moment.js库?
|
29天前
|
JavaScript 前端开发
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
|
28天前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
29天前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
34 1
|
1月前
|
JavaScript 前端开发 搜索推荐
Moment.js、Day.js、Miment,日期时间库怎么选?
【10月更文挑战第29天】如果你需要一个功能强大、插件丰富的日期时间库,并且对性能要求不是特别苛刻,Moment.js是一个不错的选择;如果你追求极致的轻量级和高性能,那么Day.js可能更适合你;而如果你有一些特定的日期时间处理需求,并且希望在性能和功能之间取得平衡,Miment也是可以考虑的。
|
1月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
1月前
|
存储 JavaScript 前端开发
decimal.js库的安装和使用方法
【10月更文挑战第24天】decimal.js 是一个非常实用的高精度计算库,通过合理的安装和使用,可以在 JavaScript 中实现精确的数值计算和处理。你可以根据具体的需求和项目情况,灵活运用该库来解决数字精度丢失的问题。
|
2月前
|
前端开发 JavaScript
JS-数据筛选
JS-数据筛选
35 7