Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Save more on your purchases! discount-offer-chevron-icon
Savings automatically calculated. No voucher code required.
Arrow left icon
All Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletter Hub
Free Learning
Arrow right icon
timer SALE ENDS IN
0 Days
:
00 Hours
:
00 Minutes
:
00 Seconds

An Overview of the Node Package Manager

Save for later
  • 5 min read
  • 11 Aug 2011

article-image
Node Web Development

npm package format


An npm package is a directory structure with a package.json file describing the package. This is exactly what we just referred to as a Complex Module, except npm recognizes many more package.json tags than does Node. The starting point for npm's package.json is the CommonJS Packages/1.0 specification. The documentation for npm's package.json implementation is accessed with the following command:

$ npm help json




A basic package.json file is as follows:

{ name: "packageName",
version: "1.0",
main: "mainModuleName",
modules: {
"mod1": "lib/mod1",
"mod2": "lib/mod2"
}
}




The file is in JSON format which, as a JavaScript programmer, you should already have seen a few hundred times.

The most important tags are name and version. The name will appear in URLs and command names, so choose one that's safe for both. If you desire to publish a package in the public npm repository it's helpful to check and see if a particular name is already being used, at http://search.npmjs.org or with the following command:

$ npm search packageName




The main tag is treated the same as complex modules. It references the module that will be returned when invoking require('packageName'). Packages can contain many modules within themselves, and those can be listed in the modules list.

Packages can be bundled as tar-gzip tarballs, especially to send them over the Internet.

A package can declare dependencies on other packages. That way npm can automatically install other modules required by the module being installed. Dependencies are declared as follows:

"dependencies":
{ "foo" : "1.0.0 - 2.9999.9999"
, "bar" : ">=1.0.2 <2.1.2"
}




The description and keywords fields help people to find the package when searching in an npm repository (http://search.npmjs.org). Ownership of a package can be documented in the homepage, author, or contributors fields:

"description": "My wonderful packages walks dogs",
"homepage": "http://npm.dogs.org/dogwalker/",
"author": [email protected]


Some npm packages provide executable programs meant to be in the user's PATH. These are declared using the bin tag. It's a map of command names to the script which implements that command. The command scripts are installed into the directory containing the node executable using the name given.

bin: {
'nodeload.js': './nodeload.js',
'nl.js': './nl.js'
},




The directories tag documents the package directory structure. The lib directory is automatically scanned for modules to load. There are other directory tags for binaries, manuals, and documentation.

directories: { lib: './lib', bin: './bin' },




The script tags are script commands run at various events in the lifecycle of the package. These events include install, activate, uninstall, update, and more. For more information about script commands, use the following command:

$ npm help scripts




This was only a taste of the npm package format; see the documentation (npm help json) for more.

Finding npm packages


By default npm modules are retrieved over the Internet from the public package registry maintained on http://npmjs.org. If you know the module name it can be installed simply by typing the following:

Unlock access to the largest independent learning library in Tech for FREE!
Get unlimited access to 7500+ expert-authored eBooks and video courses covering every tech area you can think of.
Renews at AU $19.99/month. Cancel anytime

$ npm install moduleName




But what if you don't know the module name? How do you discover the interesting modules?

The website http://npmjs.org publishes an index of the modules in that registry, and the http://search.npmjs.org site lets you search that index.

npm also has a command-line search function to consult the same index:

$ npm search mp3
mediatags Tools extracting for media meta-data tags =coolaj86 util
m4a aac mp3 id3 jpeg exiv xmp
node3p An Amazon MP3 downloader for NodeJS. =ncb000gt




Of course upon finding a module it's installed as follows:

$ npm install mediatags




After installing a module one may want to see the documentation, which would be on the module's website. The homepage tag in the package.json lists that URL. The easiest way to look at the package.json file is with the npm view command, as follows:

$ npm view zombie
...
{ name: 'zombie',
description: 'Insanely fast, full-stack, headless browser testing
using Node.js',
...
version: '0.9.4',
homepage: 'http://zombie.labnotes.org/',
...
npm ok




You can use npm view to extract any tag from package.json, like the following which lets you view just the homepage tag:

$ npm view zombie homepage
http://zombie.labnotes.org/


Using the npm commands


The main npm command has a long list of sub-commands for specific package management operations. These cover every aspect of the lifecycle of publishing packages (as a package author), and downloading, using, or removing packages (as an npm consumer).

overview-node-package-manager-img-0


Getting help with npm


Perhaps the most important thing is to learn where to turn to get help. The main help is delivered along with the npm command accessed as follows:

overview-node-package-manager-img-1


For most of the commands you can access the help text for that command by typing the following:

$ npm help <command>




The npm website (http://npmjs.org/) has a FAQ that is also delivered with the npm software. Perhaps the most important question (and answer) is: Why does npm hate me? npm is not capable of hatred. It loves everyone, even you.