拥有高质量且社区驱动的库定义(“libdefs”)对于获得 Flow 的出色体验至关重要。今天,我们推出了 **flow-typed**:一个 仓库 和一个 CLI 工具,它们代表了构建、共享和分发 Flow libdefs 的新工作流程的第一部分。
该项目的目的是发展一个 libdefs 生态系统,让 Flow 的类型推断大放异彩,并与 Flow 的使命保持一致:从真实世界的 JavaScript 中提取精确且 *准确* 的类型。我们从类似的努力中吸取了很多教训,比如 TypeScript 的 DefinitelyTyped,我们希望将我们学到的经验带到 Flow 生态系统中。
以下是该项目的一些目标
- Libdefs 应该 **版本化** - 针对它们描述的库 *以及* 它们兼容的 Flow 版本进行版本化。
- Libdefs 应该满足 **高质量标准**,包括 **libdef 测试**,以确保其质量随着时间的推移而持续。
- 必须有一种简单的方法来 **随着时间的推移贡献 libdef 改进**,以及让开发人员 **随着时间的推移从这些改进中受益**。
- 管理 Flow 项目的 libdefs 的过程应该是 **自动化的、简单的,并且易于正确执行**。
版本化和测试的 Libdefs
任何人都可以贡献一个 libdef(或改进现有的 libdef),但在这样做时,重要的是我们必须保持高质量标准,以便所有开发人员对他们使用的 libdefs 有信心。为了解决这个问题,flow-typed 要求所有 libdef 贡献都明确地针对它们描述的库的版本以及 libdef 兼容的 Flow 版本进行版本化。
此外,所有 libdefs 都必须附带测试,这些测试会对 API 的重要部分进行测试,并断言它们会产生正确的类型。通过在每个 libdef 中包含版本信息和测试,我们可以在 Travis 中自动验证测试是否按预期对 libdef 兼容的所有 Flow 版本起作用。测试还有助于确保对 libdef 的未来更改不会随着时间的推移而降低其功能。
自动执行 Libdef 安装
我们构建了一个名为 flow-typed
的简单 CLI 工具,它有助于自动化在 Flow 项目中查找、安装和升级 libdefs 的过程。它使用与每个 libdef 关联的显式版本信息来查找基于项目 package.json
依赖项的所有必要 libdefs。这最大限度地减少了您需要做的工作,以便在项目中拉取和更新 libdefs。
您可以使用 yarn(yarn global add flow-typed
)或 npm(npm install -g flow-typed
)来获取 flow-typed CLI。
安装 Libdefs
从 flow-typed 仓库安装 libdefs 只需在安装依赖项后在项目上运行一个命令即可
> yarn install # Or `npm install` if you're old-school :)
> flow-typed install
flow-typed install
命令会读取项目的 package.json
文件,查询 flow-typed 仓库以查找与依赖项匹配的 libdefs,并将正确版本的 libdefs 安装到您的 flow-typed/
目录中。默认情况下,Flow 知道在 flow-typed/
目录中查找 libdefs - 所以不需要额外的配置。
请注意,必须在运行 yarn
或 npm install
*之后* 运行此命令。这是因为此命令还会为您生成存根 libdefs,如果您的依赖项之一没有类型。
安装 libdefs 后,**我们建议您将它们签入项目的仓库中**。flow-typed 仓库中的 libdefs 可能会随着时间的推移而改进(修复错误、更精确的类型等)。如果发生这种情况,您依赖的 libdef 会发生这种情况,您将希望控制何时将该更新应用到您的项目。您可以定期运行 flow-typed update
来下载任何 libdef 更新,验证项目是否仍然进行类型检查,然后提交更新。
为什么不直接使用 Npm 来分发 Libdefs?
随着时间的推移,flow-typed 仓库中的 libdefs 可能会更新以修复错误、提高准确性或使用新的 Flow 功能来更好地描述库的类型。因此,实际上有 3 个版本适用于每个 libdef:被描述的库的版本、flow-typed 仓库中 libdef 的当前版本以及 libdef 兼容的 Flow 版本。
如果您在已经安装 libdef 后对项目中使用的某个 libdef 进行更新,那么该更新很可能在您的项目中找到以前未知的新的类型错误。虽然找到以前遗漏的错误无疑是一件好事,但您将希望控制何时将这些更改拉入您的项目。
这就是我们建议您将已安装的 libdefs 提交到版本控制中,而不是依赖 npm+semver 之类的系统从 npm 下载和安装非确定性 semver 范围版本的原因。签入您的 libdefs 可确保项目中的所有协作者在版本历史记录中的任何给定提交中都从 Flow 获得一致的输出。
构建社区
这首先是一个社区项目。它是由社区成员(嘿 @splodingsocks!)启动的,并且已经从许多其他人的工作中受益匪浅。此外,这将继续是一项社区努力:任何人都可以为任何 npm 库创建和/或帮助维护 libdef。作者可以在发布时为他们的包创建 libdefs,或者消费者可以在其他人尚未创建时创建 libdefs。无论哪种方式,每个人都将从中受益!
我们想向 @marudor 表示衷心的感谢,感谢他贡献了如此多的自己的 libdefs,并花时间帮助其他人编写和贡献 libdefs。此外,我们还要感谢 @ryyppy 帮助设计和迭代 CLI 和安装工作流程,以及管理 libdef 审查。
Flow 核心团队打算继续投资于开发和改进这个项目,但为了让它真正取得成功,我们需要您的帮助!如果您已经为正在使用的 Flow 项目编写了一些 libdefs,我们鼓励您 贡献 它们,以便其他人也能从中受益。通过在社区驱动的仓库中管理 libdefs,整个社区可以共同努力将 Flow 的功能扩展到显式类型化的 JS 之外。
现在还处于早期阶段,还有很多工作要做,所以我们很高兴听到您的想法/反馈并阅读您的拉取请求!:)
祝您打字愉快!