NPM – the Node Package Manager
The Node Package Manager, or npm
, is one of the most useful utilities downloaded with NodeJS. It is used to install various Javascript tools and libraries, including web frameworks like Connect
and Express
. In this tutorial segment, we’ll show you how to set up tools and libraries, and we’ll end by creating a simple web server with the Node Express web framework using only a handful of lines of code.
Node command-line tools – Linting your code with jslint
One useful utility available via npm
is jslint
– a linter (syntax checker) for Javascript. let's use npm
to install the JSLint linter, globally (adding it to the OS path):
$ npm install -g jslint (output) npm http GET https: //registry .npmjs.org /jslint npm http 200 https: //registry .npmjs.org /jslint npm http GET https: //registry .npmjs.org /jslint/-/jslint-0 .2.6.tgz npm http 200 https: //registry .npmjs.org /jslint/-/jslint-0 .2.6.tgz npm http GET https: //registry .npmjs.org /nopt npm http 304 https: //registry .npmjs.org /nopt npm http GET https: //registry .npmjs.org /abbrev npm http 304 https: //registry .npmjs.org /abbrev /Users/kenrimple/ .nvm /v0 .10.22 /bin/jslint -> /Users/kenrimple/ .nvm /v0 .10.22 /lib/node_modules /jslint/bin/jslint .js |
There, it’s set up. Now, to run it:
$ jslint silly.js (output) silly.js #1 Expected 'var' at column 1, not column 4. var x = 1, y, z; // Line 1, Pos 4 #2 Expected 'var' at column 1, not column 4. var q = 123; // Line 3, Pos 4 #3 Expected 'console' at column 1, not column 7. console.log( "give me a break!!!" ); // Line 5, Pos 7 |
Pretty nifty, eh? There are over 50,000 npm modules out there, and there are a ton of useful command-line utilities to be installed. But you don’t install everything with the global (-g
) flag, because otherwise you’d have a huge, bloated OS and an impossible to reproduce build environment.
Most Javascript server-side projects in NodeJS are configured using npm
. For example, let’s say you want to access a number of Javascript server-side APIs, but you don’t want to check in the script files, just the instructions for fetching them. Project configuration is npm’s key feature.
Let’s set up a simple project. First, configure a project definition using npm init
, answering the questions you’ve been given:
$ npm init (interactive output session) This utility will walk you through creating a package.json file . It only covers the most common items, and tries to guess sane defaults. See <code>npm help json< /code > for definitive documentation on these fields and exactly what they do . Use <code>npm install --save< /code > afterwards to install a package and save it as a dependency in the package.json file . Press ^C at any time to quit. name: (bah) demo-project version: (0.0.0) 0.0.1 description: Demo Project entry point: (index.js) test command : git repository: keywords: author: license: (BSD-2-Clause) About to write to /Users/kenrimple/bah/package .json: { "name" : "demo-project" , "version" : "0.0.1" , "description" : "Demo Project" , "main" : "index.js" , "scripts" : { "test" : "echo \"Error: no test specified\" && exit 1" }, "author" : "" , "license" : "BSD-2-Clause" } |
This interactive session creates a package.json
configuration file. You interact with it using npm
, installing libraries and tools.
Now you can start developing server-side Javascript software using NodeJS.
Let’s use npm
to install the Node Express framework, a great MVC platform, in the current project folder. Execute:
$ npm install express --save-dev |
The npm tool downloads all of the software to ./node_modules
, and adds the following lines to your package.json
project file:
"devDependencies" : { "express" : "~3.4.7" } |
But *only* if you add --save-dev
to the end.
NPM and version management
Now your project can be checked in, sans the node_modules
directory as npm can install it for other developers later. Pretty nifty, eh? And there are many more utilities out there to manage aspects of your platform.
A simple HTTP server in Express
Now that we’ve installed the Express API to node_modules
, let’s write a simple HTTP web server. We’ll configure Express to use a public
folder beneath our package.json
file, and to serve the files using HTTP:
var express = require( 'express' ); var http = require( 'http' ); var path = require( 'path' ); var app = express(); app.set( 'port' , process.env.PORT || 3000); app.use(express. static (path.join(__dirname, 'public' ))); http.createServer(app).listen( app.get( 'port' ), function (){ console.log( 'Express server listening on port ' + app.get( 'port' )); }); |
And that’s it. Create a directory called public
, place an index.html file in that location, and fire up your web browser to http://localhost:3000
. To run the server, use:
$ node server.js |
Express is a powerful web server. To see what else you can do with it, head over to expressjs.com/guide.html for a great tutorial, including using the express
command-line build tool to create a fully-featured MVC platform.
Our next post will feature browser-side dependency management using bower
.