Npm is known to be non-deterministic. This means that depending on the order you install dependencies in, your
node_modules folder can look very different. Debugging a dependency issue often consists of throwing away your
node_modules and running
npm install again. With the average JS project nowadays having hundreds of dependencies this can be pretty scary.
“Life calls the tune, we dance.” - John Galsworty
Yarn offers an easily accessible deterministic alternative to npm. It uses your existing
package.json and installs dependencies to the familiar
With Yarn you can feel safe installing your dependencies knowing that your
node_modules folder structure will end up exactly the same every time. Yarn adds a
yarn.lock file to your project locking the exact versions of your dependencies. It keeps checksums so the installed package is guaranteed to be the same.
I can't count the number of times I've ran
npm install <package> only for my code to fail minutes later on the CI. Turns out typing
--save is hard for me. Yarn makes me sane again:
yarn add <packagename>
Dependencies are stored in
package.json by default. Makes sense.
Running Yarn on a (small) project shows a speed improvement as well.
» rm -rf node_modules » time npm install npm install 44.51s user 18.75s system 114% cpu 55.335 total
yarn (first run):
» rm -rf node_modules » time yarn install yarn install 33.01s user 23.81s system 128% cpu 44.204 total
» rm -rf node_modules » time yarn install yarn install 18.83s user 14.72s system 130% cpu 25.612 total
Starting with Yarn couldn't be easier. Install Yarn with npm:
npm install -g yarn
Now you can start a new project with
yarn init or migrate your existing project by simply running
yarn install. This will generate a
yarn.lock file. Don't forget to check this in to version control!
There's a lot more to like about Yarn. It's generally faster than npm, supports multiple registries (like Bower) and offers an Offline mode.