Node.js menyediakan banyak built-in modules yang tidak perlu diinstall. Tiga yang paling sering dipakai: fs, path, dan os.
fs — File System
Ada 3 varian untuk hampir semua operasi fs:
1. Callback (cara lama, masih banyak di kode legacy):
import fs from "fs";
fs.readFile("data.txt", "utf-8", (err, data) => {
if (err) return console.error(err);
console.log(data);
});
2. Promise — fs.promises (recommended untuk kode modern):
import { readFile } from "fs/promises";
const data = await readFile("data.txt", "utf-8");
console.log(data);
3. Sync — fs.readFileSync (MEMBLOKIR event loop):
import { readFileSync } from "fs";
const data = readFileSync("data.txt", "utf-8"); // blocking!
console.log(data);
Kapan sync OK?
- Saat startup aplikasi (sebelum server menerima request) — misal baca file config
- CLI script satu-kali pakai
- Build scripts
Kapan sync JANGAN dipakai?
- Di dalam route handler / request handler — akan memblokir semua request lain
- Server production yang melayani banyak user
path — Cross-platform path manipulation
Windows pakai \, Linux/Mac pakai /. Module path menangani ini untukmu.
import path from "path";
// JANGAN concat string sendiri — akan rusak di Windows
const badPath = "uploads" + "/" + "foto.jpg"; // hati-hati
// AMAN — path.join menyesuaikan separator OS
const goodPath = path.join("uploads", "foto.jpg");
// Linux: "uploads/foto.jpg"
// Windows: "uploads\foto.jpg"
// path.resolve → absolute path
path.resolve("src", "app.js"); // "/Users/budi/proj/src/app.js"
// Ekstraksi bagian path
path.extname("foto.jpg"); // ".jpg"
path.basename("/a/b/c.txt"); // "c.txt"
path.dirname("/a/b/c.txt"); // "/a/b"
os — Informasi sistem operasi
import os from "os";
os.platform(); // "darwin" (Mac), "linux", "win32"
os.cpus().length; // jumlah CPU core → berguna untuk clustering
os.tmpdir(); // folder temp OS, misal "/tmp"
os.homedir(); // "/Users/budi"
os.totalmem(); // RAM total (bytes)
__dirname / __filename vs ESM
CommonJS punya dua variabel global:
console.log(__dirname); // folder file ini
console.log(__filename); // path lengkap file ini
ES Modules tidak punya ini — harus pakai import.meta.url:
import { fileURLToPath } from "url";
import path from "path";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
Contoh realistis
import { readFile, writeFile } from "fs/promises";
import path from "path";
async function uppercaseFile(input, output) {
const content = await readFile(input, "utf-8");
const upper = content.toUpperCase();
const outPath = path.join(path.dirname(input), output);
await writeFile(outPath, upper);
}