Stefan Baumgartner

Web ops, performance and front-end

The best thing about NPM scripts

25 January 2016 by @ddprrt | Posted in: npm, tools

TL;DR: NPM Scripts render global installations of NPM command line tools useless.

For quite some while people love to echo the amazing power of NPM’s package scripts. With a view additions to package.json, you are able to run shell commands and other tools with NPM, without needing any build tools at all. See Substack’s article on that topic. A good one.

And yes, NPM scripts are wonderful. The Grunt and Gulp and whatnot killer? Maybe, depends on your use case. Decide for yourself.

There is one little thing about NPM scripts that is awesome. I would even consider it the best feature of them. It adds the local node_modules binary folder to your execution path.

What does that mean? When you install Node modules locally, you get a node_modules folder containing everything you’ve installed. You know that. If you install a tool locally that has some executable, this executable will be added in a hidden .bin folder in node_modules.

That means if you install command line tools like Gulp, Grunt or Browserify not with a -g flag, but as a dependency and local, you still get the command line tool in your node_modules folder. Without explicitly adding it to your execution path, this won’t do anything. But if you run NPM scripts, this path is exactly what’s included. For example:

  "scripts": {
    "gulp": "gulp"

So npm run gulp would be the same as running a globally installed “Gulp CLI”. You can even pass parameters:

$ npm run gulp -- build

is the same as

$ gulp build

This allows you to run any command line tool in continuous integration or on your system without polluting your global node_modules directory. This helps also when you are regularly switching Node versions with nvm. This also helps if you have to handle multiple versions of one command line tool. For example running Gulp 3.x and Gulp 4 in parallel.

Cool stuff! I wouldn’t want to work without it. I’d even say: Never install Node tools globally again!

Comments? Shoot me a tweet!