A few days ago, I switched to fnm as my version manager for Node.js.

Before, I installed the default nodejs package that came with Arch Linux. But sometimes I would update my operating system, and thus getting a new Node.js version, and my system would break.

With fnm, I have fine-grained control over which version of Node.js I’m running.

Now, let’s talk about package managers. Node.js ships with npm as the default package manager.

Yarn is a popular alternative to npm. Facebook developed yarn as a streamlined and safer solution to npm.

Nowadays, in 2019, npm has caught up, and both are viable choices.

But there’s a new kid on the block!

In blog posts about yarn and npm, the new pnpm comes up again and again.


  • it’s much faster
  • it uses symlinks to save one version of the module instead of storing new modules in every project
  • support for workspaces (for monorepos)
  • it has strict, non-flat node_modules folder

The API is similar to npm. For most cases, you can just switch from npm to pnpm and everything works fine.

Caveat: global modules:
I minimize what I install globally. But some packages (i.e., reason-cli) require a global installation.

From my experience of the last few days, it’s easier to install global packages with npm or yarn. I got weird errors (for example with reason-cli and neovim-node-host) with pnpm global installations.

Gatsby is another library that doesn’t work.

My advice is to install a few selected packages globally with npm/yarn. Install the rest locally with pnpm. Use Gatsby with npm/yarn.