Frameworks change quarterly; npm, Node APIs, and bundler basics stay relevant across React, Vue, and serverless handlers.
Core concepts
- package.json scripts:
dev,build,test— the contract for CI and teammates. — npm scripts - CommonJS vs ESM: Legacy
requirevsimport— know what your bundler emits. — Node.js ESM docs - Bundlers: Vite, Webpack, esbuild — tree-shaking removes dead ESM exports. — Vite guide
- React/Next.js: Components as functions; server vs client components in Next 13+ — still JavaScript under the hood. — React: learn
- Performance: Bundle size drives parse cost — measure before optimizing images alone. — web.dev: Performance
{
"name": "my-app",
"type": "module",
"scripts": { "dev": "vite", "build": "vite build" }
}Concept videos
YouTube lessons for these topics. On a large screen they open in the reading panel next to the roadmap, same as the article links on each core concept.
- Bundlers — Webpack Explained (Fireship)
- React / Next.js — JavaScript Crash Course (Traversy Media)
Explanation
The ecosystem is the city around your house. React or Next.js is one neighborhood; npm, bundlers, and scripts are the roads and utilities that keep everything connected.
package.json scripts
Scripts are the team handshake: npm run dev means the same thing on every laptop. CI runs test and build on every pull request. Document non-obvious scripts in README so newcomers are not guessing.
CommonJS vs ESM
Older Node used require (CommonJS); modern frontends use import (ESM). Tools translate between them. When a tutorial fails with “require is not defined,” check "type": "module" and file extensions — you are mixing eras.
Bundlers
Browsers do not natively load hundreds of npm files. Bundlers pack your graph into fewer files, minify, and tree-shake unused exports. Vite optimizes dev speed; esbuild powers fast transforms. Understanding bundlers explains why dynamic import() enables code splitting.
React/Next.js
React components are functions that return UI descriptions. Next.js adds routing, server rendering, and deployment glue. Underneath, it is still JavaScript modules, fetch, and state. Learn JS fundamentals first; frameworks become learnable APIs instead of magic spells.
Performance
Users feel parse and compile cost before images load. Measuring bundle size with analyzer tools reveals accidental imports (entire lodash for one function). Optimize the JavaScript budget before chasing image compression alone.
What Is It?
The npm ecosystem hosts millions of packages; Node built-ins cover files, crypto, and HTTP servers.
Bundlers (Vite, webpack, esbuild) transform modules for browsers and optimize bundle size.
Frameworks like React/Next sit on top — they assume you know modules, fetch, and async already.
Why Should I Care?
Supply-chain and bundle-size decisions affect performance and security in real deployments.
Knowing where Node ends and browser APIs begin prevents broken imports in SSR apps.
Real World Analogy
npm is a city library card: you do not rewrite every book — you borrow maintained packages and focus on your app's unique chapters.
Visual Mental Model
package.json --> npm install --> node_modules
bundler (vite) --> browser bundleBeginner Explanation
Understand package.json scripts, semver ranges, and what bundlers do before chasing the latest framework release notes.
Smallest Possible Example
import { readFile } from "node:fs/promises";
const text = await readFile(new URL("./data.txt", import.meta.url), "utf8");
console.log(text.length);Common Mistakes
❌ Installing packages without checking maintenance and download stats.
Abandoned deps become security liabilities. Prefer well-maintained, narrowly scoped libraries.
❌ Importing Node-only modules into client components.
Bundlers may polyfill badly or explode bundle size. Split server vs client code.
❌ Ignoring bundle analyzer output.
Shipping 2 MB of JS hurts mobile users on slow networks — common at startups scaling traffic.
Real Project Example
Next.js on Vercel combines Node/edge runtimes with React — the default full-stack JS path for many teams.
esbuild and Vite speed up dev at companies like Linear and Sanity.
Build This Mini Project
Scaffold a Vite project, add one npm dependency, inspect bundle size with vite build --report, and document what each chunk contains.
Interview Question
What does a bundler actually do?
It starts from entry files, follows static import graph, transforms syntax (TypeScript, JSX), applies plugins, splits chunks, and emits assets browsers can download efficiently — often with hashed filenames for caching.
Key Takeaways
- package.json is the project control panel.
- Node built-ins vs npm packages — know the difference.
- Frameworks ride on language + tooling fundamentals.
- Watch bundle size as a feature.
Resources
The 60-second story
You are opening a second coffee cart. The first cart was one person, one thermos, one file. The second cart needs a morning checklist, a wholesaler, and a way to serve a hundred people without rolling a suitcase of unused syrups to the park.
package.json scripts are the checklist taped to the cart: dev, build, test. Teammates should not need your memory. They run the checklist.
The wholesaler used to deliver boxes labeled require (CommonJS). Newer boxes are labeled import (ESM). Both can hold coffee. They do not stack the same way. A bundler is the person who unpacks only the syrups today’s menu needs and leaves the rest in the warehouse. That unpacking is tree-shaking, and it only works well when the boxes are ESM, because the labels say what is exported before the cart rolls.
React is not a new language. It is a way to describe the cart as functions of data: given this order, paint this cup. Next.js is the cart plus a kitchen in the back. Some work happens before the customer sees the cup (server). Some work happens in their hands (client). Under both, it is still JavaScript deciding what to render.
Map the cart.
- Checklist =
package.jsonscripts. - Old boxes = CommonJS
require. - New labeled boxes = ESM
import/export. - The unpacker = Vite, Webpack, or esbuild.
- Leaving unused syrups behind = tree-shaking.
- Cup descriptions as functions = React components.
- Kitchen plus serving window = Next.js server and client.
- A suitcase you can barely lift = a bundle the browser must parse before the first sip.
{
"scripts": {
"dev": "vite",
"build": "vite build",
"test": "vitest"
}
}That file is the contract. CI runs the same words you run. If the checklist says test and the test script is a lie, the cart opens with a smile and a broken grinder.
Bundlers exist because browsers should not download your entire wholesaler catalog. Frameworks exist because updating the page by hand after every click becomes a novel. Performance work starts with the suitcase, not with a prettier logo. A huge JavaScript file is a long unpacking time. Measure that before you spend a week compressing one hero image.
Mental model: a checklist, labeled boxes, and a suitcase. Scripts are how the team opens the cart. ESM is how the bundler knows what to leave behind. React and Next are serving styles on top of the same language.
You can explain the page this way: we do not hand-carry every dependency, we do not ship every export, and a component is still a function that returns UI. The framework did not repeal JavaScript. It hired it.


