The Node Package Manager, commonly known as npm, serves as the de facto standard for package management in the JavaScript ecosystem. For developers working with Node.js or front-end frameworks that rely on npm, understanding how to install packages is a fundamental skill. This guide will walk you through the essential commands and considerations for installing software from the npm registry.
Understanding npm and its Role
npm is more than just an installer; it’s a comprehensive ecosystem that includes a vast registry of open-source packages, a command-line interface (CLI) for interacting with the registry, and a manifest file (package.json) for managing project dependencies.

The npm Registry
The npm registry is a public repository where developers share reusable JavaScript code. These packages range from small utility functions to complex frameworks and libraries, covering virtually every aspect of web development. By leveraging these pre-built components, developers can significantly accelerate their development process, avoid reinventing the wheel, and benefit from the collective intelligence of the open-source community.
The npm CLI
The npm CLI is the primary tool for interacting with the registry. It allows you to search for packages, install them into your project, manage their versions, and even publish your own packages. The CLI is typically installed automatically when you install Node.js.
package.json: The Heart of Your Project’s Dependencies
Every Node.js project that utilizes npm will have a package.json file. This JSON-formatted file serves as the project’s manifest. It contains crucial metadata about your project, including its name, version, description, entry point, scripts, and most importantly, its dependencies. When you install a package, npm records it in this file, ensuring that anyone who works on your project can easily install the exact same set of dependencies.
Installing Packages: The Basics
The most common operation with npm is installing packages. This process involves using the npm install command, often abbreviated as npm i.
Global vs. Local Installations
Before diving into the command, it’s essential to understand the difference between global and local installations.
Local Installations
By default, npm install performs a local installation. This means the package is installed within your project’s node_modules directory and is linked to your package.json file.
- Purpose: Primarily for packages that your project directly uses as dependencies, such as libraries (e.g., React, Lodash), frameworks, or build tools.
- Visibility: Accessible only within the project where it’s installed.
package.json: Dependencies are added to thedependenciesordevDependenciessection.
To perform a local installation:
Navigate your terminal to the root directory of your project (where your package.json file is located, or where you intend to create one). Then, run:
npm install <package-name>
For example, to install the popular utility library Lodash:
npm install lodash
This command will:
- Download the
lodashpackage from the npm registry. - Create a
node_modulesdirectory in your project’s root if it doesn’t already exist. - Place the
lodashpackage and its own dependencies withinnode_modules/lodash. - Add
lodashto thedependenciessection of yourpackage.jsonfile. Ifpackage.jsondoesn’t exist, npm will prompt you to create one or you can initialize it first.
Global Installations
Global installations make packages available on your system’s command line, regardless of which project directory you are currently in.
- Purpose: Primarily for command-line tools that you want to use across multiple projects or system-wide, such as build tools (e.g., Gulp, Webpack CLI), linters (e.g., ESLint), or task runners.
- Visibility: Accessible from any terminal on your system.
package.json: Not typically recorded in a project’spackage.jsonas they are system-level utilities.
To perform a global installation:
Use the -g or --global flag:
npm install -g <package-name>
For example, to install the Gulp command-line tool globally:
npm install -g gulp-cli
Note: Global installations often require administrator privileges. On Linux and macOS, you might need to use sudo:
sudo npm install -g <package-name>
On Windows, you might need to run your terminal as an administrator.
Installing Specific Versions
Often, you’ll need to install a specific version of a package. This is crucial for maintaining compatibility and reproducibility in your projects.
To install a specific version:
Append an @ symbol followed by the version number to the package name:
npm install <package-name>@<version-number>
For example, to install version 4.17.21 of Lodash:
npm install lodash@4.17.21
You can also specify version ranges using semantic versioning (SemVer) notation:
^4.17.21: Installs the latest minor or patch version within major version 4 (e.g., 4.18.0, 4.17.22).~4.17.21: Installs the latest patch version within minor version 4.17 (e.g., 4.17.22).>4.0.0: Installs any version greater than 4.0.0.1.x: Installs the latest version in the 1.x series.
Installing Development Dependencies
Some packages are only needed during development and are not required for the application to run in production. These include testing frameworks, build tools, and linters. npm allows you to distinguish between regular dependencies and development dependencies.
To install a development dependency:
Use the --save-dev or -D flag:
npm install <package-name> --save-dev
or
npm install <package-name> -D

For example, to install the Jest testing framework as a development dependency:
npm install jest -D
This will add jest to the devDependencies section of your package.json file.
Managing Dependencies: Beyond Installation
npm provides several commands to manage your installed packages effectively.
Updating Packages
Keeping your dependencies up-to-date is vital for security, performance, and access to new features.
To update all packages to their latest allowed versions (based on package.json ranges):
npm update
This command checks your package.json and updates all installed packages to the latest versions that satisfy the specified version ranges.
To update a specific package:
npm update <package-name>
If you want to update a package to a specific newer version or a version outside the current range, it’s often better to explicitly install it:
npm install <package-name>@latest
or a specific version.
Uninstalling Packages
If you no longer need a package, you can uninstall it to keep your project clean and reduce its size.
To uninstall a locally installed package:
npm uninstall <package-name>
This command removes the package from your node_modules directory and also removes it from your package.json file (both dependencies and devDependencies).
To uninstall a globally installed package:
npm uninstall -g <package-name>
Installing Dependencies from package.json
When you clone a project from a repository or collaborate with others, you’ll often find a package.json file but no node_modules directory. In such cases, you need to install all the project’s listed dependencies.
To install all dependencies listed in package.json:
Navigate to the project’s root directory (where package.json is located) and run:
npm install
or
npm i
npm will read the dependencies and devDependencies sections of package.json and download and install all the necessary packages.
The package-lock.json File
When you run npm install, npm also generates a package-lock.json file. This file is crucial for ensuring reproducible builds. It locks down the exact versions of every package that was installed, including all of their sub-dependencies.
- Purpose: Guarantees that every developer working on the project, and every deployment environment, installs the exact same dependency tree. This prevents “it works on my machine” issues that can arise from subtle version differences.
- Commitment: It is highly recommended to commit
package-lock.jsonto your version control system (e.g., Git).
Advanced Installation Scenarios
npm offers flexibility for more complex installation needs.
Installing Packages from a Git Repository
You can install packages directly from a Git repository if they are not published to the npm registry or if you need a specific commit or branch.
To install from a Git repository:
npm install <git-url>
Examples:
- GitHub:
npm install github:user/repo#commit-ish - GitLab:
npm install gitlab:user/repo#commit-ish - Bitbucket:
npm install bitbucket:user/repo#commit-ish - Direct URL:
npm install git+ssh://git@github.com:user/repo.git#commit-ishornpm install git+https://github.com/user/repo.git#commit-ish
The #commit-ish can be a branch name, tag, or commit hash.
Installing Packages from a Tarball or Local Path
You can also install packages directly from a compressed tarball (.tgz file) or from a local directory.
From a tarball:
npm install <url-to-tarball>
From a local path:
npm install <path/to/your/local/package>
This is often used when developing a package locally and testing it in another project without publishing it.

Best Practices for npm Installation
- Initialize Your Project: Always start a new Node.js project by running
npm init(ornpm init -yfor defaults) to create apackage.jsonfile. - Commit
package-lock.json: Ensure this file is part of your version control. - Use
npm cifor CI/CD: In continuous integration and continuous deployment pipelines, usenpm ciinstead ofnpm install.npm ciperforms a clean install based strictly onpackage-lock.json, ensuring faster and more reliable builds. It will deletenode_modulesif it exists and install exactly what’s in the lock file. - Understand SemVer: Familiarize yourself with Semantic Versioning to manage dependency versions effectively in your
package.json. - Audit Your Dependencies: Regularly use
npm auditto check for security vulnerabilities in your project’s dependencies.
By mastering these npm installation techniques, you’ll be well-equipped to manage your project’s dependencies efficiently, collaborate effectively with other developers, and build robust JavaScript applications.
