Update: This post is based on using Yarn 1. A major update Yarn 2 has been released. I use Yarn 1.x.
In the comments of my post about things I do everytime I start a Gatsby site, there was a really good comment asking why I switch the scripts from npm to Yarn. Great question, different topic, so I wrote this post to share a few reasons I switched.
Historically, the npm CLI is the most common tool for managing dependencies and scripting in a node project. But, there are other CLIs that expect the same package.json schema, for example Yarn or pnpm.
Three Reasons I Like Yarn More Than npm
Before I get to the advantages to my workflow, I have to say part of this is beacuse of the company npm. Last year they braught in a new CEO and laid off a several long-term employees to stop union organizing, which is gross. I'm not going to recount the whole story, but it doesn't make me feal great about a key component of the JavaScript ecosystem.
But, I think it's important to support alternative package managers like Yarn. Yarn and npm default to npm's registry, but also support alternative package registries. I think these problems will be solved with more decentralized registries and multiple CLIs like Yarn.
Anyway, that aside, I think Yarn is very good software for a few reasons.
Run Scripts Slightly Easier
Honestly, this was the first reason I started using Yarn. If package.json has a registered script called "build" you can run it with npm like this:
npm run build
Or with Yarn:
yarn build
Small difference, but I think the time savings adds up. Simpler is better.
Upgrade Interactive
Got a project that is pinned to a bunch of out of date dependencies? While have I got the CLI command for you. Yarn's upgrade-interactive is the hottest command in automated upgrades.
To upgrade one, some or all of your dependencies to the latest version.To bring up a set of prompts to determine which dependencies to upgrade, just type:
yarn upgrade-interactive --latest
Make your selections and watch it install.
Workspaces
Monorepos allow you to develop multiple packages in one git repo. If the packages are related or fairly interdependent, this can speed up development. Depending on the needs, I like to do this with Yarn workspaces or Yarn workspaces and Lerna.
A yarn workspace is a folder in your package with its own package.json. you can use the workspace command to run a script
Yarn Is Good
I've experienced less frustration with dependency resolution, and other errors since switching to Yarn. Also, it makes working with monorepos easier, for me.
Have you switched? If so, did you have a different reason? Disagree? Comments section is below 👇 or @ me on Twitter.
Top comments (16)
living in a country with expensive internet data, I feel like Yarn was made for me🙂.
Say for example, I forgot that I have a package installed, trying to reinstall with yarn will exit with it telling me it's been installed, also, if I had a network error while installing packages, it doesn't reinstall all the packages, it installs the specific one needed, I could go on and on about this. But the BOC is Yarn >>>>>>>>>> NPM😁
Hello-world in gatsby is a quarter of a gigabyte. I understand that having to download that again on a metered connection would be annoying, but I think the bigger problem is that HELLO WORLD IS A QUARTER OF A GIGABYTE.
WHAT?! WHY???!!
node_modules
what I can't quite figure out is why don't node_modules work like python modules, just download what is needed. no more
Partly I think the problem is that when things go wrong, the recommended solution for most problems is to delete
node_modules
and run setup again.It's the old "have you tried turning it off and on again?" solution.
Maybe you'd like to try
pnpm
, then. It's big advantage is that it only ever keeps one copy of each package in your computer. So if you're using dependencies that you already use in other projects, you don't need to download them again.Good point. Worth trying.
I used verdaccio for awhile. It proxies npm registry with a cache.. I was able to run
npx create-react-app
without an internet connection. I never figured out how to avoid writing localhost urls in my lockfile though.maybe it could be in the docs?
Its a shame, because npm is just as fast as yarn nowadays. ;)
good thoughts about yarn, have your tried pnpm?
Not yet. Have you?
Yeap, it's really cool only that in some vue projects it breaks HMR due to the symlink
Personally, I prefer use pnpm :)
I use yarn because project doesn't show bugs :V