43081j — who's spent years filing PRs to remove unnecessary dependencies from popular packages — is back with a taxonomy of why your node_modules folder weighs more than your application logic. The post identifies three pillars that sustain JavaScript bloat, and at 410 points on HN, it clearly struck a nerve.
The argument isn't new in isolation, but the framing is useful: bloat persists not because of one bad habit, but because multiple reinforcing patterns make it the path of least resistance.
The first pillar is micro-packages — the left-pad legacy. Packages that wrap a single native API or implement something achievable in a few lines of code. The JS ecosystem uniquely incentivizes this: npm makes publishing frictionless, and transitive dependencies compound fast. A package with 3 dependencies that each have 3 dependencies gives you 12 packages for one feature. The cost isn't just disk space — it's supply chain attack surface, version resolution complexity, and install time in CI.
The second pillar is polyfills and compatibility shims that have outlived their usefulness. Packages originally written to paper over browser or Node.js gaps that no longer exist. The ecosystem carries enormous dead weight here because removing a polyfill requires someone to verify the baseline has caught up, update the code, and publish a breaking change. Most maintainers understandably have better things to do. 43081j has personally filed hundreds of PRs addressing exactly this — removing dependencies on packages like `has`, `is-callable`, or `object.assign` where native equivalents have been stable for years.
The third pillar is the culture of wrapping built-in APIs in "nicer" abstractions. Think packages that wrap `fs.readFile` or `path.join` with marginally different ergonomics. Each wrapper is a new dependency, a new maintainer to trust, and a new thing that can break — all to avoid reading MDN for five minutes.
The practical takeaway for teams: audit your dependency tree with tools like `depcheck` or `npm ls --all`. Look for packages that duplicate platform capabilities you already have access to. When evaluating a new dependency, check its own dependency count — a utility with 15 transitive deps is a red flag, not a feature.
The broader lesson is structural. npm's flat dependency model and the cultural norm of "there's a package for that" created a system where bloat is the default and minimalism requires active effort. That's not a problem any single blog post solves, but naming the patterns is a prerequisite to changing them. At minimum, it's ammunition for your next PR review where someone wants to add a 4-line package.
Well-written article, manages not to sound rant-y while describing the problem well.I feel like part of the blame for the situation is that JavaScript has always lacked a standard library which contains the "atomic architecture" style packages. (A standard library wouldn't solve every
Great article, but I think these are all marginal.The main cause of bloat is not polyfills or atomic packages. The cause of bloat is bloat!I love this quote by Antoine de Saint-Exupéry (author of the Little Prince):"Perfection is achieved, not when there is nothing left to add, but nothing to t
A lot of this basically reads to me like hidden tech debt: people aren't updating their compilation targets to ESx, people aren't updating their packages, package authors aren't updating their implementations, etc.Ancient browser support is a thing, but ES5 has been supported everywhe
Everyone trash talking the JS ecosystem without contributing the slightest to the conversation would benefit a lot if they read https://www.artmann.co/articles/30-years-of-br-tags in order to understand the evolution of the language and its tooling.Nobody argues what we currently
Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.
I really think writing dependency-free JavaScript is the way to go nowadays. The standard library in JS/CSS is great. So are static analysis (TypeScript can check JSDoc), imports (ES modules), UI (web components), etc.People keep telling me the approach I am taking won't scale or will be h