Which Categories Have the Most Package Churn? 2026
TL;DR
CSS tooling and build tools have the highest churn rates in the JavaScript ecosystem — almost every major category has been disrupted 2-3 times in the past 5 years. State management and validation have also seen massive churn. The low-churn categories: HTTP clients (stable incumbents), testing (Vitest consolidating), and utility libraries (lodash-level inertia). High churn means you should look at a category's consolidation trajectory before committing to a package.
Key Takeaways
- CSS tooling: highest churn — styled-components → emotion → Tailwind → Panda CSS
- Build tools: high churn — webpack → Rollup → esbuild → Vite → Rspack/Rolldown
- State management: high churn — Redux → MobX → Recoil → Zustand/Jotai
- HTTP clients: low churn — axios dominant for 10+ years, won't die easily
- High churn categories signal: wait 6-12 months before committing to a new package
High-Churn Categories
CSS Tooling — Extreme Churn
# History of CSS-in-JS churn:
# 2016: styled-components launched → dominated React styling
# 2018: emotion emerged → similar API, better performance
# 2019: Tailwind CSS launched → completely different paradigm
# 2021: Stitches launched → better TS support than styled-components
# 2022: Tailwind overtook CSS-in-JS in new projects
# 2023: RSC broke CSS-in-JS → styled-components/emotion don't work in RSC
# 2023: Panda CSS → CSS-in-JS that works in RSC (build-time)
# 2024: StyleX (Meta) → zero-runtime CSS-in-JS alternative
# 2026: Tailwind v4 (Rust-based) → dominant, but Panda CSS growing
# Currently declining:
# styled-components: -40% YoY
# emotion: -35% YoY
# Stitches: stagnant (maintainer moved on)
# Growing:
# Tailwind CSS: +25% YoY
# Panda CSS: +340% YoY (from smaller base)
# UnoCSS: +120% YoY
# Prediction: CSS tooling will churn again when:
# - Web standard (CSS @scope, @layer) makes frameworks less necessary
# - Next major paradigm shift after RSC stabilizes
Build Tools — High Churn
# Build tool churn history:
# 2013: Grunt / Gulp → task runners
# 2014: Webpack → first bundler everyone used
# 2017: Parcel → zero-config alternative
# 2018: Rollup → tree-shaking pioneer
# 2020: Snowpack → ESM-native dev server
# 2020: esbuild → 100x faster, Go-based
# 2021: Vite → ESM dev server + Rollup for production
# 2022: Turbopack (Next.js) → Rust-based for Next.js
# 2023: Rspack → Rust-based Webpack replacement
# 2024: Rolldown → Rust-based Rollup replacement (Vite's future core)
# 2026: Vite (using Rolldown) + Rspack duopoly forming
# What's stable:
# Vite: has won for new projects
# Rspack: has won for Webpack migrations
# Webpack: still huge install base, not dying
# Pattern: churn happens when:
# 1. A 10x performance improvement is achievable (Rust > JS)
# 2. A paradigm shift occurs (ESM native > bundled)
# 3. Platform requirements change (Edge runtime, RSC)
State Management — High Churn
# State management churn history:
# 2015: Flux architecture → too complex
# 2015: Redux → dominant, battle-tested
# 2017: MobX → OOP reactive state
# 2019: Context API → React built-in, "Redux killer" (wasn't)
# 2019: Recoil (Facebook) → atomic state
# 2021: Zustand → simple, no boilerplate
# 2021: Jotai → atomic, Recoil replacement
# 2021: Valtio → proxy-based, automatic subscriptions
# 2022: XState v5 → state machines for complex flows
# 2023: TanStack Store → new from TanStack team
# 2024: nanostores → framework-agnostic atomic state
# Current landscape:
# Redux Toolkit: still dominant in enterprise
# Zustand: growing fast, winning new projects
# Jotai: stable, well-liked
# MobX: declining but stable base
# Recoil: Facebook deprioritized, slowly dying
# Why churn happens here:
# No "right" way to manage state
# Each new library is 10-50% simpler than its predecessor
# Churn will continue as RSC changes what "client state" means
Low-Churn Categories
HTTP Clients — Stable
# HTTP client landscape is remarkably stable:
# 2015: request → dominant
# 2015: axios → slowly replaced request
# 2018: node-fetch → lightweight for simple use
# 2023: native fetch built into Node.js
# What happened: native fetch absorbed the new project use case
# axios: still 35M/week downloads, not dying
# ky: growing as the "modern axios" for fetch-based clients
# But no massive upheaval — the category is solved
# Why low churn:
# "Make HTTP request" is a well-defined problem
# The APIs aren't changing radically
# Axios works fine; no 10x improvement available
# Native fetch reduced pressure to find alternatives
Testing Frameworks — Consolidating
# Testing churn history:
# 2014: Mocha + Chai + Sinon → the "build your own" era
# 2014: Jasmine → BDD-style testing
# 2016: Jest → batteries-included, from Facebook
# 2020: Testing Library → behavior-first testing
# 2021: Vitest → Vite-native, ESM-first, Jest-compatible
# Current state: consolidating around Vitest + Testing Library
# Jest: massive install base, not dying but growth slowing
# Vitest: taking all new Vite projects
# Playwright / Cypress: E2E duopoly (Playwright growing)
# Mocha/Jasmine: declining legacy
# Why lower churn now:
# Vitest solved the "Jest is slow on ESM projects" problem
# Testing Library solved the "test implementation not behavior" problem
# No obvious next disruption coming
Utility Libraries — Very Low Churn
# Lodash launched in 2012 and is still one of the most downloaded packages
# Why:
# - Feature-complete: does exactly what utility libraries need to do
# - Breaking change free: v4 API has been stable since 2016
# - Every project that uses it: migrating away requires active effort
# - The utility being replaced exists in lodash "forever"
# What IS slowly eating lodash's lunch:
# - Native JS (Array.flat, Object.entries, optional chaining)
# - Smaller specific-function alternatives
# But lodash itself: stable at 28M+ weekly downloads
# Other stable utility categories:
# - String utilities (case-changing)
# - Number formatting
# - Date parsing (day.js/date-fns duopoly)
# These are "solved" domains with stable APIs
Reading Churn as a Buying Signal
How to use category churn data when evaluating packages:
High churn category → caution:
→ Ask: Is this category still in flux?
→ Ask: Is there a "Vite moment" coming that will displace this?
→ Strategy: Choose the current clear winner, not an aspirational alternative
→ Or: Wait for consolidation if you're not locked in yet
Medium churn category → normal evaluation:
→ Standard health score check
→ Compare top 2-3 alternatives
→ Choose the one with best trajectory, not just best features today
Low churn category → stable:
→ Incumbent is likely fine
→ Only switch if a 10x improvement package exists
→ Don't fix what isn't broken
Current status:
→ CSS tooling: high churn, Tailwind has won but Panda CSS growing
→ Build tools: consolidating, Vite won for new, Rspack for migrations
→ State management: consolidating, Zustand winning new projects
→ Testing: consolidating, Vitest winning
→ HTTP: stable
→ ORM: churning (Prisma vs Drizzle)
→ Auth: churning (Clerk vs Auth.js vs Lucia)
→ AI tooling: early high churn (Vercel AI SDK winning)
The Consolidation Curve
How npm categories evolve over time:
Phase 1: Proliferation
→ Problem recognized
→ 5-15 packages emerge trying to solve it
→ No clear winner
→ Example: CSS-in-JS 2016-2019
Phase 2: Early consolidation
→ 1-3 packages emerge as clear leaders
→ Smaller packages lose momentum
→ Example: CSS-in-JS 2019-2021 (styled-components + emotion leading)
Phase 3: Paradigm shift
→ External factor changes the rules (RSC broke CSS-in-JS)
→ Or a dramatically better approach emerges (Vite vs webpack)
→ Previous leaders disrupted
→ Example: CSS-in-JS 2022-2024 (Tailwind disruption)
Phase 4: New consolidation
→ New winner emerges for the new paradigm
→ Previous winner still has install base (legacy)
→ Example: CSS 2024+ (Tailwind dominant)
Phase 5: Stability
→ Category solved
→ Leader has high lock-in
→ New entrants can't disrupt easily
→ Example: lodash, semver
Reading the phase:
→ Buy in Phase 4 or 5 (winner is clear, risk is low)
→ Be careful in Phase 1-3 (you might bet on the wrong horse)
Ecosystem Consolidation as a Downstream Effect of Toolchain Changes
The npm ecosystem does not churn in categories independently — there are causal chains between toolchain changes and downstream category disruption that are worth mapping explicitly. When a foundational tool changes, it selectively disrupts the categories that depend on its implementation assumptions while leaving categories that depend on stable abstractions mostly untouched.
React Server Components is the clearest current example of this cascade effect. RSC's core constraint — server components cannot use React state, hooks, or browser APIs — forced a re-evaluation of every React library that relied on those primitives. CSS-in-JS libraries that injected styles via JavaScript at render time stopped working in server components. Animation libraries that depended on useEffect for timing needed architectural changes to remain relevant. State management libraries had to reconceptualize what "client state" means when part of the component tree renders exclusively on the server. The cascade from one platform model change — RSC — drove simultaneous churn in at least four major library categories.
Build tool evolution cascades differently. When esbuild's speed advantage made Vite viable, the disruption was primarily in the dev tooling category itself. But it had a secondary effect on testing: Jest's approach to module transformation was tightly coupled to Babel's plugin model, and Vite projects wanted a test runner that understood ESM natively without the Babel transformation step. Vitest emerged specifically to fill this gap. The churn in the testing category from Jest to Vitest is a downstream consequence of the build tool churn from webpack/Babel to esbuild/Vite — the categories are linked through the module transformation layer.
Understanding these cascade chains is practically useful: when a foundational tool is about to change — when a new React model is adopted, when a runtime environment changes its module handling, when TypeScript introduces a new type system feature — you can predict which library categories will experience disruption before the disruption is visible in download data. The categories most at risk are those whose implementation assumptions depend on the specific behavior of the changing tool, not those that merely coexist with it.
What Package Churn Costs Your Team
The real cost of depending on packages in high-churn categories is not the initial selection — it's the migration tax paid every time the dominant package in a category is replaced. That tax is substantial and recurring.
Consider the history of just three categories. Projects that adopted Moment.js as their date handling solution (the dominant choice from roughly 2012 through 2020) eventually had to migrate to Day.js or date-fns when Moment was officially deprecated. Projects that standardized on Create React App (the dominant project scaffold from 2016 through 2022) had to migrate to Vite or similar tooling as CRA's maintenance slowed to a halt. Projects that relied on Enzyme for React component testing (the clear choice from 2016 through 2020) had to migrate to Testing Library — a migration that goes beyond a syntax change because the two tools embody fundamentally different testing philosophies. Testing Library tests behavior, Enzyme tests implementation. Rewriting your test suite is not a find-and-replace; it requires rethinking what each test is actually asserting.
The accumulation effect is significant. A codebase maintained for five or more years in a high-churn ecosystem has likely undergone three to five major dependency migrations in the most volatile categories. The time cost varies by package and codebase size, but ballpark estimates are telling: a large Moment.js to date-fns migration in a complex codebase takes one to two weeks of focused engineering time. An Enzyme to Testing Library migration in a mature React app with extensive test coverage can take months, spread across sprints, because no migration script can handle the philosophical shift automatically.
The mitigation strategy is straightforward in principle but requires discipline in practice. For high-churn categories, choose the tool with the longest expected lifespan rather than the most exciting new entrant — today's obvious winner, defined by the clearest ecosystem backing and a decisive download velocity lead over its nearest competitor. For utility functions, prefer stdlib alternatives wherever they exist, since native language and runtime features carry zero churn by definition. An app that uses crypto.randomUUID() instead of the uuid package will never need to migrate away from that choice.
Using Churn Data in Your Technology Decisions
Churn patterns emit readable signals before a category turns over. Learning to interpret those signals lets you make dependency choices that age well rather than choices that saddle your codebase with future migration work.
The signals that predict high future churn in a category: First, when multiple tools compete with similar download numbers and no package has achieved more than twice the weekly downloads of its nearest competitor, the category has not yet produced a clear winner. Competition at near-parity indicates that developers themselves are divided, which is a leading indicator that the category will keep churning. Second, when a dominant tool's download growth has plateaued or turned negative while the category itself is still growing, that incumbent is at risk. The overall demand exists, but users are routing around the established option. Third, when a category is directly adjacent to rapid platform change — state management as React's server component model evolves, CSS tooling as new platform primitives land — external disruption can invalidate existing winners regardless of their current quality.
The signals that predict low future churn: First, a tool that has achieved clear dominance, defined here as three to five times the weekly downloads of its nearest competitor, has built enough inertia that displacing it requires a genuinely better approach, not just a marginally improved API. Second, tools with major corporate backing tied to platform usage — Meta and React, Google and Angular, Vercel and Next.js — are structurally unlikely to be abandoned because the companies depend on them for their own products. Third, categories that are "solved" from a platform perspective, where the fundamental problem is well-understood and no approaching paradigm shift is visible, are stable. Build tool formatters, linting rulesets, and semver utilities fall into this bucket.
The practical application for daily decisions: for high-churn categories, prefer an abstraction layer when one exists. Using TanStack Query rather than a specific imperative data-fetching pattern gives you an abstraction that is less likely to churn than the underlying framework primitive it wraps, because TanStack Query's surface area is the abstraction itself rather than any single platform's implementation detail.
What Causes Category-Level Churn: The Root Mechanisms
Package churn in a category rarely originates from one package being better than another. That can explain why individual developers switch; it cannot explain why an entire category turns over and the previous dominant package loses meaningful download share. Category-level churn has identifiable structural causes, and recognizing which cause is driving a given category's churn predicts how long it will last and which successor is most likely to win.
Framework migration is the most powerful driver. When the dominant application framework in an ecosystem shifts its defaults or constraints, every category of tools serving that framework faces re-evaluation. The React Server Components rollout is the clearest current example: CSS-in-JS tools that ran JavaScript at runtime — styled-components, emotion — became architecturally incompatible with the server rendering model that RSC requires. The churn in CSS tooling from 2022 onward is not primarily about Tailwind being better (though developers have strong opinions on that); it is about runtime CSS-in-JS becoming incompatible with the direction the dominant framework chose. When the framework moves, every satellite category experiences forced churn.
Ecosystem consolidation driven by a 10x performance improvement is the second major driver. The build tool churn from webpack to Vite is the prototype case: esbuild's Go-based compiler was genuinely one to two orders of magnitude faster than any JavaScript-based alternative. When a performance improvement is that large, it is not a matter of preference — it structurally changes what workflows are feasible. Hot module replacement that takes five hundred milliseconds is a different developer experience from hot module replacement that takes fifty milliseconds. Categories driven by ecosystem consolidation around a performance winner tend to stabilize relatively quickly because the performance leader is hard to displace without an equally dramatic architectural change.
Standard platform absorption is the third driver, and it produces a different pattern from the first two. When the platform absorbs the problem a category was solving — fetch in Node.js absorbing node-fetch and much of axios's use case, native crypto.randomUUID() making the uuid package unnecessary for most uses — the category does not churn into a new winner. It contracts. The packages that survive are the ones serving use cases the platform absorbed imperfectly: axios survives because native fetch error handling behavior differs from axios's, and axios's interceptor model has no platform equivalent. Understanding whether platform absorption is incomplete or complete predicts whether a contracting category will stabilize or eventually hollow out entirely.
How Churn Affects Maintenance Burden Across Your Stack
The maintenance burden imposed by depending on packages in high-churn categories is not evenly distributed across your codebase. It concentrates at integration points — the places where your application code directly calls the library's API, where the library's mental model shapes how your code is structured, and where the library's conventions propagate into adjacent code decisions.
A CSS-in-JS library's churn is expensive specifically because its integration is pervasive. If you adopted styled-components as your styling solution, its component-level style definition model influenced how you structured components, what props you accepted, what your design token implementation looked like, and potentially how your component library was organized. Migrating from styled-components to Tailwind is not a refactor; it is a different mental model for every component in the codebase. The surface area of the change is proportional to how deeply the original library's patterns penetrated your design.
A validation library's churn is less expensive because its integration points are more localized. Replacing Yup with Zod requires touching every schema definition, but schema definitions tend to be concentrated in a small number of files — API handlers, form definitions, environment variable validation. The migration does not require rethinking how your components are structured; it requires translating schema syntax. For most codebases, this is a bounded weekend task rather than a multi-sprint project. Understanding the difference between pervasive-integration and localized-integration libraries determines how much risk is acceptable when choosing a package in a high-churn category.
The maintenance burden also manifests in downstream decisions. A team that adopted Moment.js for date formatting likely used Moment across utility functions, display components, API serialization, and possibly database query construction. When Moment reached end-of-life, every one of those use sites required evaluation. Teams that had gone through the discipline of confining Moment usage to a single date utility module — so all format and parse calls went through one file — could migrate in a day. Teams that had let Moment propagate freely through the codebase spent weeks on the same migration. The high-churn risk mitigation strategy of choosing an abstraction layer over a direct integration is effectively a bet that localization today reduces migration cost later, and the historical evidence strongly supports that bet.
The Monorepo Effect on Category Churn Visibility
Monorepos have changed how category churn manifests across large codebases because they aggregate many projects' dependency choices into a single repository where consistency requirements are enforced. In a polyrepo setup, different applications within an organization can use different state management libraries, different styling solutions, or different ORM choices without the friction being immediately visible. Each project makes its own dependency decision, and divergence accumulates silently. In a monorepo, the pressure toward consistency is structural: shared components, shared utilities, and shared tooling configuration mean that the entire organization effectively makes one choice per category, and changing that choice requires coordinating across every consumer.
The consequence for churn sensitivity is that monorepos amplify the cost of choosing a package in a high-churn category. A polystyled organization with fifteen applications, some using styled-components and some using Tailwind, pays the migration cost incrementally per application as teams find time. A monorepo organization must coordinate a single migration across the entire codebase, which requires engineering time proportional to usage breadth rather than per-application depth. The higher the coordination cost, the more conservative the initial choice needs to be — which is why large-monorepo organizations systematically favor incumbents in high-churn categories over exciting new entrants, even when the new entrant is technically superior.
Turborepo and Nx have internalized this dynamic in how they structure their templates and recommendations. Both default to the most stable incumbents in each category rather than the most technically advanced packages because their primary users are organizations building long-lived monorepos where migration cost is the dominant concern. The bundle of choices embedded in a Turborepo or Nx default setup is a reasonable prior about which packages are unlikely to require painful migrations in the near term, filtered for the monorepo context specifically.
Predicting Which Categories Will Stabilize Next
Using the consolidation curve framework, the current ORM category in the JavaScript ecosystem is in late Phase 2 or early Phase 3. Prisma was the clear winner for TypeScript ORMs from roughly 2020 through 2023, but Drizzle ORM's growth trajectory — four hundred percent year-over-year in download velocity — is a textbook Phase 3 signal. Drizzle's architecture is genuinely different from Prisma's: SQL-first rather than schema-first, no code generation step, a lighter query builder that does not abstract over the relational model. The architectural difference matters because Drizzle solves real frustrations with Prisma's approach rather than being a marginal improvement, which means the churn is not superficial preference shift.
The authentication category is in active Phase 1 to Phase 2 transition. Clerk, Auth.js, Lucia, and Supabase Auth all have meaningful market positions in different deployment contexts, and no package has achieved the kind of dominant download lead that signals category consolidation. The category will consolidate when one solution achieves clear enough lead in the most common deployment context — Vercel-hosted Next.js applications — that the others are relegated to specialized alternatives. That has not happened yet, which means the auth category carries Phase 1 churn risk for any choice made today.
The AI SDK category is the most obviously pre-consolidation category in the current JavaScript ecosystem. The Vercel AI SDK has a significant lead in Next.js-integrated projects, but LangChain.js has deeper feature coverage for agent and RAG workflows, and new entrants continue to appear as the underlying model landscape shifts faster than any library can chase. The churn in this category is structural: until the fundamental model interaction primitives stabilize, the SDKs that abstract them will keep churning. For AI tooling choices specifically, the abstraction layer recommendation is stronger than for any other category — invest in wrapping AI library calls behind your own abstraction layer, because the probability of needing to replace the underlying library within eighteen months is high regardless of which library is currently leading.
Track package health, download trends, and category dynamics at PkgPulse.
See also: AVA vs Jest and 20 Fastest-Growing npm Packages in 2026 (Data-Backed), The 20 npm Packages Losing Downloads the Fastest 2026.
See the live comparison
View vite vs. webpack on PkgPulse →