You no longer need to use yarn in Rails projects
19.02.2024 - Andy PfisterWith the introduction of the webpacker gem in Rails 6.0, Rails chose yarn as the package manager for Node. Yarn was generally faster than NPM at the time due to using parallel downloads, so the choice made sense. However, NPM has caught up over the years, and newer JavaScript projects are generally created with NPM now. But Rails kept their hard-coded dependency on yarn until recently.
Starting with jsbundling-rails v1.2.2 and cssbundling-rails v1.4.0, different package managers other than yarn are supported. Both gems use a simple algorithm probing files and commands to determine which package manager should be used:
def tool
case
when File.exist?('bun.lockb') then :bun
when File.exist?('yarn.lock') then :yarn
when File.exist?('pnpm-lock.yaml') then :pnpm
when File.exist?('package-lock.json') then :npm
when tool_exists?('bun') then :bun
when tool_exists?('yarn') then :yarn
when tool_exists?('pnpm') then :pnpm
when tool_exists?('npm') then :npm
end
end
As you can see, your choices are Bun, Yarn, PNPM, and NPM.
We are moving our projects to NPM since it makes the setup of an application easier if you do not need an additional package manager. Bun also looks promising but requires extra steps for migration.
Switching from yarn to NPM is simple:
- Delete the yarn.lock file
- Run
npm install
. - Check your code base for commands that invoke yarn and replace them with
npm
.
For example, you might have a Procfile.dev
to run the Rails server and the JS / CSS build process simultaneously. Or you have a CI script where you run yarn install
.
Rails also generates a yarn
file in the bin
folder. We usually delete it instead of adapting it to invoke npm
, as there is not much value added by this script.
That’s all to it! Switching from yarn to NPM should simplify your setup while not losing out on performance anymore.