What are Yarn and NPM?
Npm and Yarn are two package managers developers swear by. Both these package managers are at the top in this space. They are constantly and aggressively trying to one-up each other in the battle for supremacy over this space. Both provide similar features. However, they have some essential differences that you should know before deciding to go with either one.
This is part of a series of articles about software supply chain security.
In this article:
- What Is a Package Manager?
- What Is npm?
- What Is Yarn?
- Yarn vs. npm Feature Comparison
- Yarn vs. NPM: How to Choose
What Is a Package Manager?
A package manager is a software tool that automates the process of installing, upgrading, configuring, and removing software packages for a computer system. It simplifies the process of acquiring and maintaining software by downloading and installing packages from a central repository, making it easy for users to install and use new software.
Package managers also help to ensure that software is compatible with the computer’s operating system, resolve dependencies, and keep track of installed packages. They also provide an easy way to upgrade software, ensuring that the latest version is installed and that the system is up-to-date. Examples of package managers include apt-get for Linux systems, Homebrew for macOS, and Chocolatey for Windows. Package managers play a critical role in software management and are essential for keeping a computer system up-to-date and secure.
What Is npm?
npm stands for node package manager. npm ships with every Node.js installation as the default package manager and gets installed along with it. npm first came out in 2010 and has since evolved into a comprehensive package manager. npm has three components: an online portal, an inventory of public and paid packages, and the most commonly used npm CLI.
What Is Yarn?
Yet Another Resource Negotiator, abbreviated as Yarn, is an alternative to npm. Yarn can be installed as a package through npm. Developed by Facebook in 2016, Yarn addressed many security and performance issues that riddled npm then. Yarn was quickly adopted by developers and became extremely popular. Since then, Yarn has seen a steady climb in adoption. Packaged with a lock file that automatically locks package versions across all systems, Yarn was considered more secure and reliable. And, with faster installation speed, it has been able to take the fight to npm.
Yarn and npm are in a cutthroat battle against each other. npm has done reasonably well in maintaining its reign over the package management space by innovating and providing similar features that made Yarn appealing to developers. npm has been able to keep up with Yarn by releasing updates to quicken package installation and stabilize dependencies. Since both these tools are pretty similar and can be used as alternatives to each other.
Yarn vs. npm Feature Comparison
Let’s dive into key differences that could make you choose one of these package managers over the other.
Installation
While npm is installed by default with Node.js, to install Yarn, you can use the npm install command just like you’ll use it to install any other package.
You begin by installing yarn globally using the following command.
npm install -g yarn
Alternatively, you can use any native package manager to install Yarn.
Once installed globally, you can install desired yarn versions on each project by running the following command in your project’s root folder.
yarn set version [version_name]
The version can then be updated when needed using the following command.
yarn set version latest
To use different versions of npm in different projects, you will need nvm (node version manager).
Package and Dependency Installation
Yarn and npm have many identical commands like npm init | yarn init
for creating a new package, npm run | yarn run
for running scripts defined in the package.json, and npm test | yarn test
for testing a package, etc.
However, package and dependency installation is where the commands somewhat differ. In npm, you can install a package using npm install [package name]
, and to install dependencies, you can use npm install.
In Yarn, to install a package, you have to use yarn add [package name]
, and to install dependencies, you can use yarn
.
Apart from the tangible differences, there is also a significant difference in how both package managers install dependencies. While npm installs package dependencies sequentially, which slows down package installation, yarn installs them in parallel, speeding up the process. Yarn also provides more comprehensive and readable output logs that help developers understand package dependencies, whereas npm output logs can be hard to read.
Available Commands
The following table includes some of the most common commands for Yarn and npm:
Command | Yarn | NPM |
Look for outdated packages | yarn outdated | npm outdated |
Publish a new package | yarn publish | npm publish |
Start (initialize) a project | yarn init | npm init |
Test a given package | yarn test | npm test |
Run a given script | yarn run | npm run |
Manage the local package cache | yarn cache clean | npm cache clean |
Log in and out | yarn login/logout | npm login/logout |
Install package dependencies | yarn | npm install |
Install a package | yarn add [package name] | npm install [package name] |
Uninstall a package | yarn remove [package name] | npm uninstall [package name] |
Install a package globally | yarn global add [package name] | npm install --global [package name] |
Uninstall a global package | yarn global remove [package name] | npm uninstall --global [package name] |
Run a package remotely | yarn dlx | |
Update the manager | yarn upgrade | npm update |
Update a package | yarn upgrade [package name] | npm update [package name] |
Update interactive dependencies | yarn upgrade-interactive | npm run upgrade-interactive |
Check the package licenses | yarn licenses ls |
Performance
Performance is an essential factor in deciding which tool to choose. Yarn was developed to address the performance issues that npm was plagued with. Over time, npm was able to bridge the performance gap with updates and new releases. However, Yarn is still faster, and in a development environment, even seconds matter.
The difference in performance is mainly due to the mechanics behind the scenes of how these package managers work. As mentioned previously, npm installs packages and dependencies in sequential order. That means if you had to install five packages and the first package took a lot of time to install, it would delay the installation of all the packages. This is less than ideal. Yarn, however, installs packages in parallel, which means the ones that install quicker will be available for developers to use. In contrast, the ones that are a tad slower will be made available a bit later.
Although both npm and yarn enable offline caching for quicker installation, Yarn does this better than npm. Yarn comes with a feature called zero installs. Zero installs helps store packages in your project directory. When you run the command to install a package, yarn creates a .pnp.cjs file containing dependency hierarchies used by Node-js to install the packages, making package installation extremely fast.
Lock File Generation
Both yarn and npm offer lock file generation. A lock file helps you define the versions of all the dependencies required as part of your project and ensures that all the new installations of said dependencies adhere to the versions mentioned inside the package.json file. This way, teams can encourage collaboration and reduce the chances of code failure due to the installation of newer, untested versions. This file is called yarn.lock in yarn while its npm counterpart is called package-lock.json.
Both yarn and npm similarly manage dependencies. However, it’s ill-advised to use both of them together. Using both package managers together can lead to inconsistencies due to two different lock files. Yarn has recently introduced a feature that allows you to run yarn import
in the repository containing the package-lock.json, thereby creating a yarn.lock file using the resolution parameters defined in the npm lock file. This can help teams use both package managers in their environment and to migrate to yarn altogether. npm is working on a similar feature.
Security
A few years ago, npm wasn’t considered secure as it could not address vulnerabilities that could sneak into your system via malicious packages. Since npm wasn’t very good at scanning the dependency tree for all packages, it was easier for attackers to exploit vulnerabilities in one of the many packages. Yarn was an answer to these security pitfalls. However, npm has evolved over the last couple of years and is now much more secure. npm has a new command called npm audit
, allowing developers to scan the dependency tree recursively and look for any anomaly. npm can now also flag packages with known vulnerabilities.
Both npm and Yarn use checksum to ensure any package being installed is secure. The checksum of a package will be stored in the lock file and referred to upon future installation of the same package to ensure integrity.
Yarn vs. NPM: How to Choose
When it comes to choosing between Yarn and npm, there is no definitive answer, as the right package manager depends on your project’s specific needs and requirements. Yarn offers better performance, more comprehensive output logs, and was initially designed with a stronger focus on security. On the other hand, npm has continuously evolved and improved over time, bridging the performance gap and significantly enhancing its security features.
If you prioritize speed, offline caching, and a more user-friendly interface, Yarn might be the better choice for you. However, if you prefer a package manager that is bundled with Node.js, has a larger community, and is continuously improving, npm could be your preferred choice.
In conclusion, both Yarn and npm are excellent package managers that cater to different preferences and use cases. It’s crucial to evaluate your project’s requirements, team preferences, and the specific features that matter most to you before making a decision.