Mike Slinn
Mike Slinn

Node.js, NVM, NPM and Yarn

Published 2022-03-01. Last modified 2022-08-04.
Time to read: 3 minutes.

This site is categorized under JavaScript.

Node.js, a JavaScript runtime, is not my favorite programming environment. Its historical disregard for security and stability is problematic. However, it has significant traction, especially amongst younger software technologists, and is used by many Rubyists for asset pipelines. With reluctance, I put together these notes for installing Node on Ubuntu/WSL using a version manager.

NVM

NVM is a node.js version manager. It provides easy installation, the ability to switch between versions of node.js, and retains globally installed packages for each version.

Install node.js with nvm, the Node Version Manager. This allows you to install and maintain many different independent versions of node.js, and their associated packages, at the same time.

Nvm is installed as follows:

Shell
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14926  100 14926    0     0  84806      0 --:--:-- --:--:-- --:--:-- 85291
=> nvm is already installed in /home/mslinn/.nvm, trying to update using git
=> => Compressing and cleaning up git repository

=> nvm source string already in /home/mslinn/.bashrc
=> bash_completion source string already in /home/mslinn/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion 

View the currently installed versions of node.js:

Shell
$ nvm list
->      v17.3.1
default -> node (-> v17.3.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v17.3.1) (default)
stable -> 17.3 (-> v17.3.1) (default)
lts/* -> lts/gallium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.9 (-> N/A)
lts/fermium -> v14.18.3 (-> N/A)
lts/gallium -> v16.13.2 (-> N/A) 

View the very long list of available versions of node.js like this:

Shell
$ nvm list-remote
        v0.1.14
        v0.1.15
        v0.1.16
        v0.1.17
        v0.1.18
        v0.1.19
        v0.1.20
        v0.1.21
        v0.1.22
        v0.1.23
        v0.1.24
        v0.1.25
        v0.1.26
        v0.1.27
        v0.1.28
        v0.1.29
        v0.1.30
        v0.1.31
        v0.1.32
        v0.1.33
        v0.1.90
        v0.1.91
        v0.1.92
        v0.1.93
        v0.1.94
        v0.1.95
        v0.1.96
        v0.1.97
        v0.1.98
        v0.1.99
      v0.1.100
      v0.1.101
      v0.1.102
      v0.1.103
      v0.1.104
        v0.2.0
        v0.2.1
        v0.2.2
        v0.2.3
        v0.2.4
        v0.2.5
        v0.2.6
        v0.3.0
        v0.3.1
        v0.3.2
        v0.3.3
        v0.3.4
        v0.3.5
        v0.3.6
        v0.3.7
        v0.3.8
        v0.4.0
        v0.4.1
        v0.4.2
        v0.4.3
        v0.4.4
        v0.4.5
        v0.4.6
        v0.4.7
        v0.4.8
        v0.4.9
        v0.4.10
        v0.4.11
        v0.4.12
        v0.5.0
        v0.5.1
        v0.5.2
        v0.5.3
        v0.5.4
        v0.5.5
        v0.5.6
        v0.5.7
        v0.5.8
        v0.5.9
        v0.5.10
        v0.6.0
        v0.6.1
        v0.6.2
        v0.6.3
        v0.6.4
        v0.6.5
        v0.6.6
        v0.6.7
        v0.6.8
        v0.6.9
        v0.6.10
        v0.6.11
        v0.6.12
        v0.6.13
        v0.6.14
        v0.6.15
        v0.6.16
        v0.6.17
        v0.6.18
        v0.6.19
        v0.6.20
        v0.6.21
        v0.7.0
        v0.7.1
        v0.7.2
        v0.7.3
        v0.7.4
        v0.7.5
        v0.7.6
        v0.7.7
        v0.7.8
        v0.7.9
        v0.7.10
        v0.7.11
        v0.7.12
        v0.8.0
        v0.8.1
        v0.8.2
        v0.8.3
        v0.8.4
        v0.8.5
        v0.8.6
        v0.8.7
        v0.8.8
        v0.8.9
        v0.8.10
        v0.8.11
        v0.8.12
        v0.8.13
        v0.8.14
        v0.8.15
        v0.8.16
        v0.8.17
        v0.8.18
        v0.8.19
        v0.8.20
        v0.8.21
        v0.8.22
        v0.8.23
        v0.8.24
        v0.8.25
        v0.8.26
        v0.8.27
        v0.8.28
        v0.9.0
        v0.9.1
        v0.9.2
        v0.9.3
        v0.9.4
        v0.9.5
        v0.9.6
        v0.9.7
        v0.9.8
        v0.9.9
        v0.9.10
        v0.9.11
        v0.9.12
        v0.10.0
        v0.10.1
        v0.10.2
        v0.10.3
        v0.10.4
        v0.10.5
        v0.10.6
        v0.10.7
        v0.10.8
        v0.10.9
      v0.10.10
      v0.10.11
      v0.10.12
      v0.10.13
      v0.10.14
      v0.10.15
      v0.10.16
      v0.10.17
      v0.10.18
      v0.10.19
      v0.10.20
      v0.10.21
      v0.10.22
      v0.10.23
      v0.10.24
      v0.10.25
      v0.10.26
      v0.10.27
      v0.10.28
      v0.10.29
      v0.10.30
      v0.10.31
      v0.10.32
      v0.10.33
      v0.10.34
      v0.10.35
      v0.10.36
      v0.10.37
      v0.10.38
      v0.10.39
      v0.10.40
      v0.10.41
      v0.10.42
      v0.10.43
      v0.10.44
      v0.10.45
      v0.10.46
      v0.10.47
      v0.10.48
        v0.11.0
        v0.11.1
        v0.11.2
        v0.11.3
        v0.11.4
        v0.11.5
        v0.11.6
        v0.11.7
        v0.11.8
        v0.11.9
      v0.11.10
      v0.11.11
      v0.11.12
      v0.11.13
      v0.11.14
      v0.11.15
      v0.11.16
        v0.12.0
        v0.12.1
        v0.12.2
        v0.12.3
        v0.12.4
        v0.12.5
        v0.12.6
        v0.12.7
        v0.12.8
        v0.12.9
      v0.12.10
      v0.12.11
      v0.12.12
      v0.12.13
      v0.12.14
      v0.12.15
      v0.12.16
      v0.12.17
      v0.12.18
      iojs-v1.0.0
      iojs-v1.0.1
      iojs-v1.0.2
      iojs-v1.0.3
      iojs-v1.0.4
      iojs-v1.1.0
      iojs-v1.2.0
      iojs-v1.3.0
      iojs-v1.4.1
      iojs-v1.4.2
      iojs-v1.4.3
      iojs-v1.5.0
      iojs-v1.5.1
      iojs-v1.6.0
      iojs-v1.6.1
      iojs-v1.6.2
      iojs-v1.6.3
      iojs-v1.6.4
      iojs-v1.7.1
      iojs-v1.8.1
      iojs-v1.8.2
      iojs-v1.8.3
      iojs-v1.8.4
      iojs-v2.0.0
      iojs-v2.0.1
      iojs-v2.0.2
      iojs-v2.1.0
      iojs-v2.2.0
      iojs-v2.2.1
      iojs-v2.3.0
      iojs-v2.3.1
      iojs-v2.3.2
      iojs-v2.3.3
      iojs-v2.3.4
      iojs-v2.4.0
      iojs-v2.5.0
      iojs-v3.0.0
      iojs-v3.1.0
      iojs-v3.2.0
      iojs-v3.3.0
      iojs-v3.3.1
        v4.0.0
        v4.1.0
        v4.1.1
        v4.1.2
        v4.2.0   (LTS: Argon)
        v4.2.1   (LTS: Argon)
        v4.2.2   (LTS: Argon)
        v4.2.3   (LTS: Argon)
        v4.2.4   (LTS: Argon)
        v4.2.5   (LTS: Argon)
        v4.2.6   (LTS: Argon)
        v4.3.0   (LTS: Argon)
        v4.3.1   (LTS: Argon)
        v4.3.2   (LTS: Argon)
        v4.4.0   (LTS: Argon)
        v4.4.1   (LTS: Argon)
        v4.4.2   (LTS: Argon)
        v4.4.3   (LTS: Argon)
        v4.4.4   (LTS: Argon)
        v4.4.5   (LTS: Argon)
        v4.4.6   (LTS: Argon)
        v4.4.7   (LTS: Argon)
        v4.5.0   (LTS: Argon)
        v4.6.0   (LTS: Argon)
        v4.6.1   (LTS: Argon)
        v4.6.2   (LTS: Argon)
        v4.7.0   (LTS: Argon)
        v4.7.1   (LTS: Argon)
        v4.7.2   (LTS: Argon)
        v4.7.3   (LTS: Argon)
        v4.8.0   (LTS: Argon)
        v4.8.1   (LTS: Argon)
        v4.8.2   (LTS: Argon)
        v4.8.3   (LTS: Argon)
        v4.8.4   (LTS: Argon)
        v4.8.5   (LTS: Argon)
        v4.8.6   (LTS: Argon)
        v4.8.7   (LTS: Argon)
        v4.9.0   (LTS: Argon)
        v4.9.1   (Latest LTS: Argon)
        v5.0.0
        v5.1.0
        v5.1.1
        v5.2.0
        v5.3.0
        v5.4.0
        v5.4.1
        v5.5.0
        v5.6.0
        v5.7.0
        v5.7.1
        v5.8.0
        v5.9.0
        v5.9.1
        v5.10.0
        v5.10.1
        v5.11.0
        v5.11.1
        v5.12.0
        v6.0.0
        v6.1.0
        v6.2.0
        v6.2.1
        v6.2.2
        v6.3.0
        v6.3.1
        v6.4.0
        v6.5.0
        v6.6.0
        v6.7.0
        v6.8.0
        v6.8.1
        v6.9.0   (LTS: Boron)
        v6.9.1   (LTS: Boron)
        v6.9.2   (LTS: Boron)
        v6.9.3   (LTS: Boron)
        v6.9.4   (LTS: Boron)
        v6.9.5   (LTS: Boron)
        v6.10.0   (LTS: Boron)
        v6.10.1   (LTS: Boron)
        v6.10.2   (LTS: Boron)
        v6.10.3   (LTS: Boron)
        v6.11.0   (LTS: Boron)
        v6.11.1   (LTS: Boron)
        v6.11.2   (LTS: Boron)
        v6.11.3   (LTS: Boron)
        v6.11.4   (LTS: Boron)
        v6.11.5   (LTS: Boron)
        v6.12.0   (LTS: Boron)
        v6.12.1   (LTS: Boron)
        v6.12.2   (LTS: Boron)
        v6.12.3   (LTS: Boron)
        v6.13.0   (LTS: Boron)
        v6.13.1   (LTS: Boron)
        v6.14.0   (LTS: Boron)
        v6.14.1   (LTS: Boron)
        v6.14.2   (LTS: Boron)
        v6.14.3   (LTS: Boron)
        v6.14.4   (LTS: Boron)
        v6.15.0   (LTS: Boron)
        v6.15.1   (LTS: Boron)
        v6.16.0   (LTS: Boron)
        v6.17.0   (LTS: Boron)
        v6.17.1   (Latest LTS: Boron)
        v7.0.0
        v7.1.0
        v7.2.0
        v7.2.1
        v7.3.0
        v7.4.0
        v7.5.0
        v7.6.0
        v7.7.0
        v7.7.1
        v7.7.2
        v7.7.3
        v7.7.4
        v7.8.0
        v7.9.0
        v7.10.0
        v7.10.1
        v8.0.0
        v8.1.0
        v8.1.1
        v8.1.2
        v8.1.3
        v8.1.4
        v8.2.0
        v8.2.1
        v8.3.0
        v8.4.0
        v8.5.0
        v8.6.0
        v8.7.0
        v8.8.0
        v8.8.1
        v8.9.0   (LTS: Carbon)
        v8.9.1   (LTS: Carbon)
        v8.9.2   (LTS: Carbon)
        v8.9.3   (LTS: Carbon)
        v8.9.4   (LTS: Carbon)
        v8.10.0   (LTS: Carbon)
        v8.11.0   (LTS: Carbon)
        v8.11.1   (LTS: Carbon)
        v8.11.2   (LTS: Carbon)
        v8.11.3   (LTS: Carbon)
        v8.11.4   (LTS: Carbon)
        v8.12.0   (LTS: Carbon)
        v8.13.0   (LTS: Carbon)
        v8.14.0   (LTS: Carbon)
        v8.14.1   (LTS: Carbon)
        v8.15.0   (LTS: Carbon)
        v8.15.1   (LTS: Carbon)
        v8.16.0   (LTS: Carbon)
        v8.16.1   (LTS: Carbon)
        v8.16.2   (LTS: Carbon)
        v8.17.0   (Latest LTS: Carbon)
        v9.0.0
        v9.1.0
        v9.2.0
        v9.2.1
        v9.3.0
        v9.4.0
        v9.5.0
        v9.6.0
        v9.6.1
        v9.7.0
        v9.7.1
        v9.8.0
        v9.9.0
        v9.10.0
        v9.10.1
        v9.11.0
        v9.11.1
        v9.11.2
        v10.0.0
        v10.1.0
        v10.2.0
        v10.2.1
        v10.3.0
        v10.4.0
        v10.4.1
        v10.5.0
        v10.6.0
        v10.7.0
        v10.8.0
        v10.9.0
      v10.10.0
      v10.11.0
      v10.12.0
      v10.13.0   (LTS: Dubnium)
      v10.14.0   (LTS: Dubnium)
      v10.14.1   (LTS: Dubnium)
      v10.14.2   (LTS: Dubnium)
      v10.15.0   (LTS: Dubnium)
      v10.15.1   (LTS: Dubnium)
      v10.15.2   (LTS: Dubnium)
      v10.15.3   (LTS: Dubnium)
      v10.16.0   (LTS: Dubnium)
      v10.16.1   (LTS: Dubnium)
      v10.16.2   (LTS: Dubnium)
      v10.16.3   (LTS: Dubnium)
      v10.17.0   (LTS: Dubnium)
      v10.18.0   (LTS: Dubnium)
      v10.18.1   (LTS: Dubnium)
      v10.19.0   (LTS: Dubnium)
      v10.20.0   (LTS: Dubnium)
      v10.20.1   (LTS: Dubnium)
      v10.21.0   (LTS: Dubnium)
      v10.22.0   (LTS: Dubnium)
      v10.22.1   (LTS: Dubnium)
      v10.23.0   (LTS: Dubnium)
      v10.23.1   (LTS: Dubnium)
      v10.23.2   (LTS: Dubnium)
      v10.23.3   (LTS: Dubnium)
      v10.24.0   (LTS: Dubnium)
      v10.24.1   (Latest LTS: Dubnium)
        v11.0.0
        v11.1.0
        v11.2.0
        v11.3.0
        v11.4.0
        v11.5.0
        v11.6.0
        v11.7.0
        v11.8.0
        v11.9.0
      v11.10.0
      v11.10.1
      v11.11.0
      v11.12.0
      v11.13.0
      v11.14.0
      v11.15.0
        v12.0.0
        v12.1.0
        v12.2.0
        v12.3.0
        v12.3.1
        v12.4.0
        v12.5.0
        v12.6.0
        v12.7.0
        v12.8.0
        v12.8.1
        v12.9.0
        v12.9.1
      v12.10.0
      v12.11.0
      v12.11.1
      v12.12.0
      v12.13.0   (LTS: Erbium)
      v12.13.1   (LTS: Erbium)
      v12.14.0   (LTS: Erbium)
      v12.14.1   (LTS: Erbium)
      v12.15.0   (LTS: Erbium)
      v12.16.0   (LTS: Erbium)
      v12.16.1   (LTS: Erbium)
      v12.16.2   (LTS: Erbium)
      v12.16.3   (LTS: Erbium)
      v12.17.0   (LTS: Erbium)
      v12.18.0   (LTS: Erbium)
      v12.18.1   (LTS: Erbium)
      v12.18.2   (LTS: Erbium)
      v12.18.3   (LTS: Erbium)
      v12.18.4   (LTS: Erbium)
      v12.19.0   (LTS: Erbium)
      v12.19.1   (LTS: Erbium)
      v12.20.0   (LTS: Erbium)
      v12.20.1   (LTS: Erbium)
      v12.20.2   (LTS: Erbium)
      v12.21.0   (LTS: Erbium)
      v12.22.0   (LTS: Erbium)
      v12.22.1   (LTS: Erbium)
      v12.22.2   (LTS: Erbium)
      v12.22.3   (LTS: Erbium)
      v12.22.4   (LTS: Erbium)
      v12.22.5   (LTS: Erbium)
      v12.22.6   (LTS: Erbium)
      v12.22.7   (LTS: Erbium)
      v12.22.8   (LTS: Erbium)
      v12.22.9   (LTS: Erbium)
      v12.22.10   (Latest LTS: Erbium)
        v13.0.0
        v13.0.1
        v13.1.0
        v13.2.0
        v13.3.0
        v13.4.0
        v13.5.0
        v13.6.0
        v13.7.0
        v13.8.0
        v13.9.0
      v13.10.0
      v13.10.1
      v13.11.0
      v13.12.0
      v13.13.0
      v13.14.0
        v14.0.0
        v14.1.0
        v14.2.0
        v14.3.0
        v14.4.0
        v14.5.0
        v14.6.0
        v14.7.0
        v14.8.0
        v14.9.0
      v14.10.0
      v14.10.1
      v14.11.0
      v14.12.0
      v14.13.0
      v14.13.1
      v14.14.0
      v14.15.0   (LTS: Fermium)
      v14.15.1   (LTS: Fermium)
      v14.15.2   (LTS: Fermium)
      v14.15.3   (LTS: Fermium)
      v14.15.4   (LTS: Fermium)
      v14.15.5   (LTS: Fermium)
      v14.16.0   (LTS: Fermium)
      v14.16.1   (LTS: Fermium)
      v14.17.0   (LTS: Fermium)
      v14.17.1   (LTS: Fermium)
      v14.17.2   (LTS: Fermium)
      v14.17.3   (LTS: Fermium)
      v14.17.4   (LTS: Fermium)
      v14.17.5   (LTS: Fermium)
      v14.17.6   (LTS: Fermium)
      v14.18.0   (LTS: Fermium)
      v14.18.1   (LTS: Fermium)
      v14.18.2   (LTS: Fermium)
      v14.18.3   (LTS: Fermium)
      v14.19.0   (Latest LTS: Fermium)
        v15.0.0
        v15.0.1
        v15.1.0
        v15.2.0
        v15.2.1
        v15.3.0
        v15.4.0
        v15.5.0
        v15.5.1
        v15.6.0
        v15.7.0
        v15.8.0
        v15.9.0
      v15.10.0
      v15.11.0
      v15.12.0
      v15.13.0
      v15.14.0
        v16.0.0
        v16.1.0
        v16.2.0
        v16.3.0
        v16.4.0
        v16.4.1
        v16.4.2
        v16.5.0
        v16.6.0
        v16.6.1
        v16.6.2
        v16.7.0
        v16.8.0
        v16.9.0
        v16.9.1
      v16.10.0
      v16.11.0
      v16.11.1
      v16.12.0
      v16.13.0   (LTS: Gallium)
      v16.13.1   (LTS: Gallium)
      v16.13.2   (LTS: Gallium)
      v16.14.0   (Latest LTS: Gallium)
      v17.0.0
      v17.0.1
      v17.1.0
      v17.2.0
      v17.3.0
->    v17.3.1
      v17.4.0
      v17.5.0
      v17.6.0 

NPM

Npm is a package manager for the JavaScript programming language. It helps install libraries, plugins, frameworks and applications. npm is the default package manager for Node.js. It consists of a command-line client, also called npm, and an online database of public and paid-for private packages called the npm registry.

Npm fetches dependencies from the npm registry for every npm install command.

Npm generates a package-lock.json file. The layout of this file is a trade-off between determinism and simplicity. The same node_modules/ folder will be generated, even from different npm versions. Every dependency will have a version number associated with it in the package-lock file.

Install npm with a node version manager

Follow these instructions.

Shell
$ mkdir ~/.npm-global

$ npm config set prefix ~/.npm-global

$ cat >> ~/.bashrc <<EOF
export PATH="$HOME/.npm-global/bin:$PATH"

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" 1>&2  # Loads nvm
EOF

$ source ~/.bashrc

Install A Global Package

To install a global package, the command template for npm is:

Shell
$ npm install -g package_name[@version_number]

For example:

Shell
$ npm install -g broken-link-checker
npm WARN deprecated calmcard@0.1.1: no longer maintained
npm WARN deprecated nopter@0.3.0: try optionator
npm WARN deprecated uuid@2.0.3: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated urlobj@0.0.11: use universal-url, minurl, relateurl, url-relation

added 104 packages, and audited 105 packages in 5s 

Yarn

Yarn stands for Yet Another Resource Negotiator and it is a package manager like npm. It was developed by Facebook and is now open-source. The intention behind developing yarn was to fix performance and security concerns with npm. Yarn generates a yarn.lock file, which helps easy merges. The merges are predictable. Yarn caches every package it has downloaded, so it never needs to download the same package again. It also does almost everything concurrently to maximize resource utilization. This means faster installs. Yarn guarantees that any installation that works on one system will work exactly the same on another system, unlike npm.

The yarn package on npmjs notes that Yarn was inspired by Bundler, Cargo and npm, so similarities exist.

Yarn introduces the zero-install concept, which means that a project should be able to be used as soon as it is cloned. Use Plug‘n‘Play to resolve dependencies via the cache folder and not from node_modules. The cache folder is by default stored within your project folder, in .yarn/cache

Npm vs. Yarn

When using npm install, dependencies are installed sequentially, one after another. The output logs in the terminal are informative but a bit hard to read. To install the packages with Yarn, run the yarn command. Yarn installs packages in parallel, which is one of the reasons it's quicker than npm.

See the article titled Difference between npm and yarn.

Installing Yarn

The official docs say to add the following to .gitignore for any git project that uses yarn:
.gitignore
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions

Install yarn as follows:

Shell
$ corepack enable

$ npm i -g corepack

$ yarn init -2

Yarn stores dependencies locally, and if the proper version is present locally, it is fetched from the disk during a yarn add command.

To install a global package, the command template for yarn is:

Shell
$ yarn global add package_name@version_number