I hit yarn install
, waited for the spinner and the terminal splashed red. If you’ve just had the same gut-punch in react JS, let me walk you through exactly what happened, the quick rescue steps, and a few extras I now drop into every project so this never bites me again.
The Code
$ yarn install
yarn install v1.19.1
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn…
[1/5] Validating package.json...
error app@0.3.0: The engine "node" is incompatible with this module. Expected version ">=10.17.0". Got "10.15.2"
error Found incompatible module.
getting the errors while installing the yarn in react js project.
error app@0.3.0: The engine "node" is incompatible with this module. Expected version ">=10.17.0". Got "10.15.2"
error Found incompatible module.
Two red flags jump out:
Line | What Yarn tells me | Why I care |
---|---|---|
warning package-lock.json found… | Both yarn.lock (Yarn) and package-lock.json (npm) live in the repo. | Mixed locks can drag in two different dependency trees—bug casino. |
The engine "node" is incompatible… | package.json demands Node ≥ 10.17.0; I’m on 10.15.2. | Yarn bails to stop runtime errors that would surface later. |
Fix The Code
Upgrade Node
# Using nvm (recommended)
nvm install 18 # any current LTS is fine
nvm use 18
Why jump to v18? It covers every feature 10.x lacked, adds ES-modules, and ships with security patches using react JS.
Keep a Single Lock File
Because my team already uses Yarn:
package-lock.json
yarn install
If yours lives on npm, delete yarn.lock
instead and run npm install
. Mixing them only guarantees fresh drama.
Hard Wiring the Guard Rails
I add a tiny pre-install script so future installs fail fast when someone’s Node is too old.
package.json
{
"engines": { "node": ">=18.0.0" },
"scripts": {
"check-node": "node scripts/check-node.js",
"preinstall": "npm run check-node" // fires in both npm and Yarn
}
}
scripts/check-node.js
semver = require('semver');
const required = require('../package.json').engines.node;
if (!semver.satisfies(process.version, required)) {
console.error(
`\n Your Node version is ${process.version}.` +
` This project needs ${required}.\n`
);
process.exit(1);
}
Now the install dies with a clean message before Yarn’s own engine check, saving seconds (and sighs).
Project Coding Extras I Lean On
Script | Why it exists | Snippet |
---|---|---|
.nvmrc | One-liner with the Node version. Anyone can run nvm install and get the right binary. | 18.17.0 |
clean-install | Wipes modules, pulls fresh graph—handy after merging lock-file PRs. | "clean-install": "rm -rf node_modules && yarn install" |
postinstall | Quick sanity ping in CI. | "postinstall": "node -e \\"console.log(' Install completed')\\"" |
Drop those into package.json
, commit, and your future self will thank you.
Practice Corner
Task | What you learn | Hint |
---|---|---|
A — Break it on purpose | nvm use 10.15.2 , run yarn install , watch the guard yell. | nvm ls shows installed versions. |
B — Lock the version visually | Add .nvmrc , push to repo—new devs type nvm install and match you. | Works on any CI runner that supports nvm. |
C — Clean-room install | Run npm run clean-install before committing a lock bump. | Catches “works on my machine” ghosts. |
D — CI sanity ping | The postinstall script prints a green tick; missing output means the hook never ran. | Great for GitHub Actions logs. |
Do each one once; they stick in muscle memory forever.
Final Thought
Most Yarn install meltdowns trace back to dueling lock files or an out-of-date Node. Fix those two roots, wire in a tiny version check, and your terminal stays green.