npm包管理器加速器,用于Node.js
项目描述
npm-accel程序是npm(Node.js包管理器)的包装器,旨在优化一个特定的用例:尽可能快地从package.json文件中创建node_modules目录。
它基于这样一个假设,即您构建node_modules目录的频率高于您更改package.json文件内容的频率,因为它计算依赖项的指纹,并使用该指纹作为缓存键,将完整的node_modules目录缓存到tar存档中。
本程序旨在用于始终或经常从空白的node_modules目录开始的环境,需要从头开始填充完整的目录(例如,持续集成构建和部署)。我特别不声称如果您正在更新现有的node_modules目录,您将看到任何速度提升。
npm-accel程序目前已在Python 2.7、3.5、3.6、3.7、3.8和PyPy上进行了测试(是的,它是用Python编写的,请见谅😉)。它旨在在UNIX系统(如Linux和Mac OS X)上工作,并且特别不适用于Windows(有关详细信息,请参阅支持的操作系统)。
安装
npm-accel软件包可在PyPI上找到,这意味着安装应该非常简单
$ pip install npm-accel
实际上有无数种安装Python软件包的方法(例如,每个用户site-packages目录、虚拟环境或仅安装到系统范围),我没有打算在这里进行讨论,所以如果您感到害怕,请在返回这些说明之前了解您的选项😉。
或者,如果您正在运行Arch Linux,npm-accel在AUR上有提供。
用法
使用npm-accel软件包有两种方式:作为命令行程序npm-accel和作为Python API。有关Python API的详细信息,请参阅Read the Docs上的API文档。以下是命令行界面的描述。
用法: npm-accel [OPTIONS] [DIRECTORY]
npm-accel程序是npm(Node.js包管理器)的包装器,它优化了一个特定的用例:尽可能快地从“package.json”文件构建“node_modules”目录。
它基于这样的假设,即您构建“node_modules”目录的频率高于您更改“package.json”文件内容的频率,因为它计算依赖项的指纹,并使用该指纹作为缓存键,以将完整的“node_modules”目录缓存到tar存档中。
支持选项
选项 |
描述 |
---|---|
-p,--production |
不安装“devDependencies”中列出的模块。 |
-i,--installer=NAME |
设置要使用的安装程序。对于NAME的支持值是“npm”、“yarn”、“pnpm”和“npm-cache”。当yarn可用时,它将被选为默认安装程序,否则默认为npm。 |
-u,--update |
不读取缓存但写入缓存。如果您怀疑缓存条目已损坏,可以使用--update来“刷新”缓存条目。 |
-n,--no-cache |
不允许写入npm-accel管理的缓存(读取仍然允许)。此选项不会禁用npm、yarn、pnpm和npm-cache执行的内部缓存。 |
-c,--cache-directory=DIR |
设置npm-accel缓存存储的目录路径名。 |
-l,--cache-limit=COUNT |
设置要保留的最大tar存档数量。当缓存目录包含超过COUNT个存档时,最近最少使用的存档将被删除。默认为20。 环境变量$NPM_ACCEL_CACHE_LIMIT提供了一种方便的方法来在CI和构建环境中自定义此选项。 |
-b, --benchmark |
基准测试并比较以下安装方法
第一种方法不进行任何缓存(除了npm本身自带的HTTP缓存),而其他四种方法各自管理自己的缓存(也就是说,npm-accel的缓存逻辑仅在步骤4中使用)。 注意:基准测试会清除npm、yarn、pnpm、npm-accel和npm-cache管理的缓存,以便提供公平的比较(您可以在Python API中覆盖此操作,但不能在命令行中)。 |
-r, --remote-host=SSH_ALIAS |
在远程系统上操作而不是本地系统。参数SSH_ALIAS给出了远程主机的SSH别名。 |
-v, --verbose |
增加日志详细程度(可重复)。 |
-q, --quiet |
减少日志详细程度(可重复)。 |
--version |
报告npm-accel的版本。 |
-h, --help |
显示此信息并退出。 |
状态
npm-accel项目于2016年9月开发并发布,因为我厌倦了等待npm install完成,特别是在持续集成构建和部署的背景下(你经常从一个空的node_modules目录开始)。它在不到一周的时间内完成,几乎没有关于Node.js或npm的知识,这也是为什么它用Python编写的原因 😛。
该项目最初以95%的测试覆盖率发布,我在评估这些工具时非常小心,没有重复我在npm-cache和npm-fast-install中遇到的错误 🙂。
撰写本文时(2020年初),npm-accel在我的雇主处已经活跃使用超过三年,并且它极大地加快了我们的持续集成构建和部署。但不要只听我的话,试一试,看看它是否有助于您的用例!
性能
以下表格列出了对包含在package.json文件中列出的128个依赖项的私有代码库运行npm-accel --benchmark的输出(结果是一个895 MiB的node_modules目录)
方法 |
迭代 |
经过时间 |
百分比 |
---|---|---|---|
npm install |
1 of 2 |
1分钟和16.56秒 |
100% |
npm install |
2 of 2 |
1分钟和4.99秒 |
85% |
yarn |
1 of 2 |
1分钟和6.33秒 |
87% |
yarn |
2 of 2 |
41.7秒 |
54% |
pnpm |
1 of 2 |
55.24秒 |
72% |
pnpm |
2 of 2 |
41.28秒 |
54% |
npm-accel |
1 of 2 |
1分钟和12.1秒 |
94% |
npm-accel |
2 of 2 |
3.25秒 |
4% |
npm-cache |
1 of 2 |
2分钟和14.41秒 |
176% |
npm-cache |
2 of 2 |
22.51秒 |
29% |
有关此基准测试的一些说明
每种安装方法都会运行两次。第一次运行从空的缓存目录开始,目的是“预热缓存”。第二次运行旨在使用缓存,并且应该能够非常有效地使用它,前提是两次运行之间package.json文件没有发生变化。
在基准测试过程中,npm-accel执行的缓存仅在上述表格的第八行中使用。这是因为基准测试的初衷(对我来说)是找出开发和发布npm-accel是否值得。也就是说,如果没有提供速度提升,那我就不值得花费你的时间,更不用说我的时间了 😛。
支持的操作系统
npm-accel程序是为像Linux和Mac OS X这样的UNIX系统开发的。它需要安装几个外部命令(例如mkdir、mv、rm、tar和which)。
我已经尽量使所有外部命令调用与Linux和BSD变体的命令(如tar)兼容,也就是说,npm-accel只使用简短选项,并且即使它们可能很有用,也会跳过更多奇特的特性。如果你发现我在这方面失败了,请随时将其报告为错误。
为了记录在案:出于几个原因,有意识地决定使用tar程序而不是通过Python的tarfile模块操作tar存档。
未来改进
- 处理可选依赖项
我在野外从未见过optionalDependencies,但在浏览package.json文档时遇到了它们。也许这些也应该是计算缓存键的一部分?
联系
最新版本的npm-accel可在PyPI(https://pypi.python.org/pypi/npm-accel)和GitHub(https://github.com/xolox/python-npm-accel)上找到。文档托管在Read the Docs(https://npm-accel.readthedocs.io/en/latest/)。有关错误报告,请在GitHub(https://github.com/xolox/python-npm-accel)上创建一个问题。如果您有任何问题,建议等,请随时通过电子邮件(peter@peterodding.com)发送给我。
许可证
本软件根据MIT许可证授权。
© 2020 Peter Odding。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。