← All posts

JavaScript backends: the full-stack tax

Node.js vs Go/Rust throughput and memory, npm risk, and when a single language stack still wins.

JavaScript backends: the full-stack tax
Contents

In short

“One language for frontend and backend” is a strong pitch — but production Node.js has a bill: throughput, idle memory, and the npm supply chain. A Dev.to piece frames that as the full-stack tax.

What happened

The author contrasts 2026 expectations with JavaScript’s original scope. Cited benchmarks: Express around 20k RPS, Go ~40k, Rust ~60k; on AWS Lambda, Node ~20 ms average latency vs Rust ~1.1 ms for comparable work.

Idle memory: Node 30–50 MB, Go 5–10 MB, Rust 1–2 MB — at scale that drives instance count and cold starts.

Security: a huge npm registry, packages running with full process rights, recurring supply-chain incidents.

Why it matters

A monolingual stack reduces friction for small teams: shared types, hiring, less context switching. For CPU-bound work, tight SLAs, and minimal footprint you pay in hardware and risk, not just “learning a second language.”

Node remains strong for I/O-bound APIs, streaming, BFFs, and prototypes.

In practice

  • Load-test your endpoints, not generic blog numbers.
  • Offload CPU-heavy work to workers, queues, or Go/Rust services.
  • Lockfiles, dependency audit, least privilege at runtime.
  • Public APIs with stable contracts often need OpenAPI/Protobuf more than “all TypeScript.”

Takeaway

JavaScript on the server is a trade-off, not a mistake. Use Node where delivery speed wins; use a systems language where milliseconds and megabytes are the product.