node app.tsruns TS natively (type-stripping, stable in 24); it does NOT type-check — use tsc --noEmit.
CJS vs ESMrequire/module.exports (.cjs) vs import/export (.mjs or "type":"module").
__dirnameCJS-only; in ESM use import.meta.dirname / import.meta.url.
event-loop ordersync → process.nextTick → Promises → timers → I/O → setImmediate → close.
don't blockavoid *Sync fs/crypto in servers; offload CPU to worker_threads.
node: prefiximport core as node:fs — unambiguous, can't be shadowed by an npm pkg.
fs has 3 flavoursfs.readFile (cb) · fs.readFileSync · fs/promises (await).
prefer pipelinestream.pipeline() over .pipe() — it handles errors + cleanup.
EventEmitter.on/.once/.emit; always handle 'error' or it throws.
globals, no importfetch, WebSocket, Blob, FormData, structuredClone, AbortController.
node --runruns a package.json script without npm · --watch · --env-file=.env.
node --testbuilt-in runner + node:assert — no jest · --test-coverage.
permission modelnode --permission --allow-fs-read=./ --allow-net — deny by default (Node 24).
process basicsprocess.argv · .env · .cwd() · .exitCode · Buffer for binary.
npm ≠ Nodenpm is the package manager; commit package-lock.json, git-ignore node_modules.
Node 24 LTS“Krypton” · V8 13.6 · npm 11 · Undici/HTTP3. Node 26 Current adds Temporal by default.