Skip to main content

Accelerator for npm, the Node.js package manager

Project description

https://travis-ci.org/xolox/python-npm-accel.svg?branch=master https://coveralls.io/repos/xolox/python-npm-accel/badge.svg?branch=master

The npm-accel program is a wrapper for npm (the Node.js package manager) that was created to optimize one specific use case: Creating a node_modules directory from a package.json file as quickly as possible.

It works on the assumption that you build node_modules directories more frequently then you change the contents of package.json files, because it computes a fingerprint of the dependencies and uses that fingerprint as a cache key, to cache the complete node_modules directory in a tar archive.

The program is intended to be used in environments that always or frequently start with an empty node_modules directory and need to populate the complete directory from scratch (e.g. continuous integration builds and deployments). I’m specifically not claiming that you will see any speed improvements if you’re updating existing node_modules directories.

The npm-accel program is currently tested on Python 2.7, 3.5, 3.6, 3.7, 3.8 and PyPy (yes, it’s written in Python, deal with it 😉). It’s intended to work on UNIX systems like Linux and Mac OS X and specifically won’t work on Windows (see supported operating systems for details).

Installation

The npm-accel package is available on PyPI which means installation should be as simple as:

$ pip install npm-accel

There’s actually a multitude of ways to install Python packages (e.g. the per user site-packages directory, virtual environments or just installing system wide) and I have no intention of getting into that discussion here, so if this intimidates you then read up on your options before returning to these instructions 😉.

Alternatively if you are running Arch Linux, npm-accel is available in AUR.

Usage

There are two ways to use the npm-accel package: As the command line program npm-accel and as a Python API. For details about the Python API please refer to the API documentation available on Read the Docs. The command line interface is described below.

Usage: npm-accel [OPTIONS] [DIRECTORY]

The npm-accel program is a wrapper for npm (the Node.js package manager) that optimizes one specific use case: Building a “node_modules” directory from a “package.json” file as quickly as possible.

It works on the assumption that you build “node_modules” directories more frequently then you change the contents of “package.json” files, because it computes a fingerprint of the dependencies and uses that fingerprint as a cache key, to cache the complete “node_modules” directory in a tar archive.

Supported options:

Option

Description

-p, --production

Don’t install modules listed in “devDependencies”.

-i, --installer=NAME

Set the installer to use. Supported values for NAME are “npm”, “yarn”, “pnpm” and “npm-cache”. When yarn is available it will be selected as the default installer, otherwise the default is npm.

-u, --update

Don’t read from the cache but do write to the cache. If you suspect a cache entry to be corrupt you can use --update to ‘refresh’ the cache entry.

-n, --no-cache

Disallow writing to the cache managed by npm-accel (reading is still allowed though). This option does not disable internal caching performed by npm, yarn, pnpm and npm-cache.

-c, --cache-directory=DIR

Set the pathname of the directory where the npm-accel cache is stored.

-l, --cache-limit=COUNT

Set the maximum number of tar archives to preserve. When the cache directory contains more than COUNT archives the least recently used archives are removed. Defaults to 20.

The environment variable $NPM_ACCEL_CACHE_LIMIT provides a convenient way to customize this option in CI and build environments.

-b, --benchmark

Benchmark and compare the following installation methods:

  1. npm install

  2. yarn

  3. pnpm

  4. npm-accel

  5. npm-cache

The first method performs no caching (except for the HTTP caching that’s native to npm) while the other four methods each manage their own cache (that is to say, the caching logic of npm-accel is only used in step 4).

Warning: Benchmarking wipes the caches managed by npm, yarn, pnpm, npm-accel and npm-cache in order to provide a fair comparison (you can override this in the Python API but not on the command line).

-r, --remote-host=SSH_ALIAS

Operate on a remote system instead of the local system. The SSH_ALIAS argument gives the SSH alias of the remote host.

-v, --verbose

Increase logging verbosity (can be repeated).

-q, --quiet

Decrease logging verbosity (can be repeated).

--version

Report the version of npm-accel.

-h, --help

Show this message and exit.

Status

The npm-accel project was developed and published in September 2016 because I got fed up waiting for npm install to finish, specifically in the context of continuous integration builds and deployments (where you frequently start with an empty node_modules directory). It was developed in about a week without much prior knowledge about Node.js or npm, which explains why it’s written in Python 😛.

The project was initially published with 95% test coverage and I was careful not to repeat the bugs I encountered in npm-cache and npm-fast-install while evaluating those tools 🙂.

At the time of writing (early 2020) npm-accel has been in active use at my employer for more than three years and it has worked wonderfully well to speed up our continuous integration builds and deployments. But don’t take my word for it, try it out and see if it helps your use case!

Performance

The following table lists the output of npm-accel --benchmark against a private code base with 128 dependencies listed in the package.json file (resulting in a 895 MiB node_modules directory):

Approach

Iteration

Elapsed time

Percentage

npm install

1 of 2

1 minute and 16.56 seconds

100%

npm install

2 of 2

1 minute and 4.99 seconds

85%

yarn

1 of 2

1 minute and 6.33 seconds

87%

yarn

2 of 2

41.7 seconds

54%

pnpm

1 of 2

55.24 seconds

72%

pnpm

2 of 2

41.28 seconds

54%

npm-accel

1 of 2

1 minute and 12.1 seconds

94%

npm-accel

2 of 2

3.25 seconds

4%

npm-cache

1 of 2

2 minutes and 14.41 seconds

176%

npm-cache

2 of 2

22.51 seconds

29%

Some notes about this benchmark:

  • Each of the installation methods is run twice. The first run starts with empty cache directories and is intended to “prime the cache”. The second run is intended to use the cache and should be able to do so quite effectively, given that the package.json file does not change between the two runs.

  • During the benchmark, the caching performed by npm-accel is only used in the eight row of the table above. This is because the original point of the benchmark (for me) was to find out whether it was even worth it to develop and publish npm-accel. That is to say, if it wouldn’t have given a speed improvement it wasn’t worth my time, nor yours 😛.

Supported operating systems

The npm-accel program was developed to work on UNIX systems like Linux and Mac OS X. It requires several external commands to be installed (e.g. mkdir, mv, rm, tar and which).

I’ve tried to keep all of the external command invocations compatible with the Linux and BSD variants of commands like tar, that is to say npm-accel uses only short options and skips the more esoteric features even if they would be useful. If you find that I failed in this respect, please feel free to report this as a bug.

For posterity: It was a conscious decision (for several reasons) to use the tar program instead of manipulating tar archives via Python’s tarfile module.

Future improvements

Dealing with optionalDependencies

I’ve never seen optionalDependencies in the wild but encountered them while browsing through the package.json documentation. Maybe these should be part of the computed cache keys aswell?

Contact

The latest version of npm-accel is available on PyPI and GitHub. The documentation is hosted on Read the Docs. For bug reports please create an issue on GitHub. If you have questions, suggestions, etc. feel free to send me an e-mail at peter@peterodding.com.

License

This software is licensed under the MIT license.

© 2020 Peter Odding.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

npm-accel-2.0.1.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

npm_accel-2.0.1-py2.py3-none-any.whl (20.2 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file npm-accel-2.0.1.tar.gz.

File metadata

  • Download URL: npm-accel-2.0.1.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.6.9

File hashes

Hashes for npm-accel-2.0.1.tar.gz
Algorithm Hash digest
SHA256 6ca2044f8d090fd73cf605ec411f435d6885125757cd388f7aea5a6195ff1d05
MD5 723b40b7825f205121f1481abb9e0d5c
BLAKE2b-256 2e1962d963441b74173a1d1e17eb0d25ecf99d07f247fee6c19a80a3a92cbaa0

See more details on using hashes here.

File details

Details for the file npm_accel-2.0.1-py2.py3-none-any.whl.

File metadata

  • Download URL: npm_accel-2.0.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 20.2 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.6.9

File hashes

Hashes for npm_accel-2.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 63c4dc515034e79ccae70e56c8c99887ed9e4e127a0b6ad8d3104c1057636df1
MD5 b60f6b42a2f458e48bf871a2874b814b
BLAKE2b-256 c97f5beaf4755830aa7f6003e438a601f00329b7a5d131b9a4c1412ec6a9d897

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page