Upgrading a Legacy Monorepo to React 18: What Nobody Warns You About
React 18 shipped in March 2022. We merged our upgrade in April 2026. If you do that math, yes — we were four years behind. This is a post about what that upgrade actually looked like across a large, multi-generational codebase, and the specific issues that ate most of the time. Spoiler: the "breaking changes" in the official React 18 migration guide are the easy part. The Starting Point Our frontend is not one app — it's four generations of React code living in the same monorepo, accumulated over years of product growth: assets/js/ — the oldest layer, Alt.js Flux architecture app/ — second generation, class components everywhere web/ — Chakra UI-based, mostly hooks frontend/ — newest, Elastic EUI, greenfield The upgrade touched the first two generations: assets/js/ and app/ . That's the part of the codebase with the heaviest accumulation of legacy patterns — class components, Immutable.js collections in JSX, and some HOC patterns that had never seen a ...