Which Categories Have the Most Package Churn?
·PkgPulse Team
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)
Track package health, download trends, and category dynamics at PkgPulse.
See the live comparison
View vite vs. webpack on PkgPulse →