2 个版本

使用旧的 Rust 2015

0.1.1 2018年9月25日
0.1.0 2018年9月25日

#25 in #yarn

MIT 许可证

2KB

codecov Build Status

这是什么?

例如,假设你有一个 express 项目,其中有一个 server.js 脚本。你不必运行 node ./server.js,只需运行 nd ./server.jsnd 将仅代理命令到 node。然而,如果 package.json 中指定的任何依赖项未安装或不在正确的版本(或 package-lock.jsonyarn.lock)中,nd 将首先获取它们并更新锁定文件,然后再运行。

为什么它这么快?

nd 很可能是 Node.js 项目的最快包管理器。在支持的文件系统(包括 MacOS 上的 APFS 或 Linux 上的 btfs)上,我们利用写时复制行为来创建 node_modules 目录。所有文件都从全局缓存目录重新链接,因此您的机器上的任何其他项目都将重用相同的文件,节省磁盘空间,大大提高安装时间并显著减少磁盘使用。

如果您删除了您的 node_modules 目录或已从另一个项目缓存了特定依赖项版本,nd 能够在不到一秒内构建具有许多依赖项的项目。

您不再需要为每个 react 项目创建庞大的 node_modules 目录。

这根本不同于硬链接或符号链接(这些通常会导致 node 项目出现奇怪的问题)。这些文件是普通文件,您可以编辑它们而不会影响其他项目。如果您手动修改了 node_modules 目录中的文件(例如,通过添加一个 console.log() 语句进行调试),当它被修改时,它将在磁盘上创建一个文件的副本。这意味着您可以在一个项目中进行修改,而不会影响其他项目。

对于 nd 的用户来说,这种方法将非常透明。它的行为与 npm 或 yarn 完全相同。在不支持此功能的文件系统上,我们简单地回退到类似于 npm 和 yarn 的传统缓存。即使没有写时复制,nd 的性能也优于 yarn 和 npm。

与其他工具兼容性好

兼容 yarn 和 npm 锁文件。无需任何自定义配置。您可以在团队项目中使用 nd,而不需要整个团队都接受它。

刷新流程

当您运行 nd 时,它首先执行的是“刷新”项目。这类似于 npm install,但速度要快得多,所以我们会在运行任何脚本之前执行它。

流程遵循以下步骤

  1. initialize - 读取本地 node_modules 树,package.json,锁文件(yarn.lockpackage-lock.json)以检查是否存在任何缺少的依赖项或版本错误。
  2. resolve - 获取包元数据以找到适当的 semver 版本和 tarball URL
  3. cache - 将包 tarball 下载到全局缓存目录以供任何项目使用
  4. reflink - 一旦从步骤 #2 解析了所有内容,现在我们可以构建理想的 node_modules

步骤 1-3 一旦执行 nd 就会并行发生。这意味着一旦它发现了一个缺少的依赖项,它就会立即开始解析和缓存它,同时继续搜索更多包。

兼容性

兼容性是 nd 的一个主要设计目标。尽管存在写时复制行为。

  • Windows - 除非 ReFS 变得更加流行,否则写时复制行为目前尚不可行。

依赖项

~3–12MB
~131K SLoC