JavaScript
1 min read
Updated 4 Aug 2026
Part 22 — Node.js Basics
Core modules, HTTP server, Events (EventEmitter), Streams & buffers, process & timers
Node = V8 + libuv (async I/O) + core modules. Great for servers, tooling, CLIs.
Core modules#
import { readFile, writeFile } from "node:fs/promises"; // promise-based fs 🟢
import path from "node:path";
import http from "node:http";
import { EventEmitter } from "node:events";
const text = await readFile("data.txt", "utf8");
path.join("/a", "b", "c.txt"); // OS-correct path
path.extname("x.js"); // ".js"
HTTP server#
http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify({ ok: true }));
}).listen(3000);
Events (EventEmitter)#
class Bus extends EventEmitter {}
const bus = new Bus();
bus.on("login", (user) => console.log(user, "logged in"));
bus.emit("login", "ada");
Streams & buffers#
Streams process data in chunks (don't load whole files into memory). Buffer holds raw bytes.
import { createReadStream, createWriteStream } from "node:fs";
createReadStream("big.csv")
.pipe(transform)
.pipe(createWriteStream("out.csv")); // backpressure handled for you
process & timers#
process.argv; // CLI args
process.env.NODE_ENV;
process.cwd();
process.on("SIGINT", () => { /* graceful shutdown */ process.exit(0); });
setImmediate(fn); // runs after I/O callbacks (Node-only macrotask)
process.nextTick(fn); // runs before other microtasks (Node-specific)
⚠️ Node's event loop phases (timers → pending → poll → check → close) differ subtly from the browser; process.nextTick runs before the promise microtask queue.