If you’re looking for an easy to follow guide to install Node.js and npm on OS X, the default method is to download a pre-built installer for your platform, install it, and make sure it’s on your $PATH.

As of July 21st, 2017 this guide is deprecated.

But, if you’re a Homebrew fan like me and prefer to install all of your packages with it, ensuring your packages are installed using the same commands and directories and allowing Homebrew to manage updates, this guide will help you get started:

Install Node.js and npm with Homebrew

First, install Homebrew: (If you wan’t to install it the right way, here’s how to do it!)

Note: The best way to install Homebrew is to get the link directly from their website. (It can change over time)

Then, brew update to ensure your Homebrew is up to date.

brew update

As a safe measure, run brew doctor to make sure your system is ready to brew. Follow any recommendations from brew doctor.

brew doctor

Next, if you haven’t already add the Homebrew location to your $PATH and source your bash or zsh profile file after adding/saving this:

export PATH="/usr/local/bin:$PATH"

Next, install Node (npm will be installed with node):

brew install node

To test out your Node and npm install, try installing Grunt (you might be asked to run with sudo):

npm install grunt-cli -g

If that worked, congrats, you’re good to go with Node.js, npm, and Grunt. If not, the following are a few troubleshooting steps:

If you see an error like this:

$ npm update npm -g npm http GET https://registry.npmjs.org/npm npm http 304 https://registry.npmjs.org/npm npm http GET https://registry.npmjs.org/npm/1.4.4 npm http 304 https://registry.npmjs.org/npm/1.4.4 npm ERR! error rolling back Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm npm ERR! error rolling back at clobberFail (/usr/local/Cellar/node/0.10.26/lib/node_modules/npm/lib/utils/gently-rm.js:57:12) npm ERR! error rolling back at next (/usr/local/Cellar/node/0.10.26/lib/node_modules/npm/lib/utils/gently-rm.js:43:14) npm ERR! error rolling back at /usr/local/Cellar/node/0.10.26/lib/node_modules/npm/lib/utils/gently-rm.js:52:12 npm ERR! error rolling back at Object.oncomplete (fs.js:107:15) npm ERR! error rolling back npm@1.4.4 { [Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm] code: 'EEXIST', path: '/usr/local/bin/npm' } npm ERR! Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm File exists: /usr/local/bin/npm Move it away, and try again. npm ERR! System Darwin 13.1.0 npm ERR! command "/usr/local/Cellar/node/0.10.26/bin/node" "/usr/local/bin/npm" "update" "npm" "-g" npm ERR! cwd /Users/dan/Google Drive/Projects/dotfiles npm ERR! node -v v0.10.26 npm ERR! npm -v 1.4.3 npm ERR! path /usr/local/bin/npm npm ERR! code EEXIST npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /Users/dan/Google Drive/Projects/dotfiles/npm-debug.log npm ERR! not ok code 0

Run! Ha.

Explanation of the issue

There’s an npm bug for this exact problem. The bug has been “fixed” by Homebrew installing npm in a way that allows it to manage itself once the install is complete. However, this is error-prone and still seems to cause problems for some people. The root of the the issue is really that npm is its own package manager and it is therefore better to have npm manage itself and its packages completely on its own instead of letting Homebrew do it.

Also, using the Homebrew installation of npm will require you to use sudo when installing global packages. Since one of the core ideas behind Homebrew is that apps can be installed without giving them root access, this is a bad idea.

Solution

This solution fixes the error caused by trying to run npm update npm -g. Once you’re finished, you also won’t need to use sudo to install npm modules globally.

Before you start, make a note of any globally installed npm packages. These instructions will have you remove all of those packages. After you’re finished you’ll need to re-install them.

Run the following commands to remove all existing global npm modules, uninstall node & npm, re-install node with the right defaults, install npm as its own pacakge, and configure the location for global npm modules to be installed.

rm -rf /usr/local/lib/node_modules brew uninstall node brew install node --without-npm echo prefix=~/.node >> ~/.npmrc curl -L https://www.npmjs.com/install.sh | sh

Node and npm should be correctly installed at this point. The final step is to add ~/.node/bin to your PATH so commands you install globally are usable. I added this line to my ~/.path script, which gets run via ~/.bash_profile.

export PATH="$HOME/.node/bin:$PATH"

Now you can re-install any global packages with the command below, replacing the npm modules with whatever global packages you need.

npm install -g http-server node-inspector forever nodemon

If you need to install multiple versions of node, do yourself a favor and use nvm. It helps you manage node versions and you won’t need root privileges (sudo command) to use it.

Install nvm:

brew install nvm

Add the following to your $PATH and source your bash or zsh profile file:

export NVM_DIR=$(brew --prefix)/var/nvm source $(brew --prefix nvm)/nvm.sh

The first line tells nvm where to install versions of node. Since you are already using brew to manage these binaries, it makes sense to use that directory.

Now use nvm to install the latest stable release of node, and the most up to date version in the branch for all your older node packages.

nvm install stable nvm install [Latest Version]

If you need to install io.js you can do it safely along with node.js:

brew update brew upgrade nvm nvm install iojs

Don’t be lazy and read some nvm documentation. Cheers!