Node.js tidak hanya menyediakan runtime untuk menjalankan JavaScript — runtime ini juga membawa perpustakaan standar yang luas di dalam pemasangannya. Mulai dari merangkai path berkas, mengurai URL, sampai membaca informasi sistem operasi, semuanya tersedia tanpa satu baris npm install pun. Perpustakaan bawaan tersebut kita kenal sebagai core module. Chapter ini memetakan core module yang paling sering dipakai sehari-hari, menjelaskan konvensi prefix node: yang dipakai di seluruh Course ini, dan menyiapkan bekal untuk enam chapter praktik berikutnya.
Apa itu Core Module #
Core module adalah module yang dikompilasi sebagai bagian dari Node.js itu sendiri; kode sumbernya hidup di folder lib/ pada repositori Node.js dan ikut terpasang ke mana pun Node.js terpasang. Ketika kita menulis import path from "node:path", runtime tidak mencari berkas apa pun di folder node_modules — implementasi module sudah tersedia langsung di dalam biner Node.js. Inilah perbedaan mendasarnya dengan package npm: package harus dipasang dan dikelola sebagai dependency proyek, sedangkan core module selalu siap dipakai pada pemasangan Node.js mana pun.
Kita bahkan bisa menghitung banyaknya core module yang tersedia pada runtime yang sedang berjalan. Module node:module menyimpan daftar lengkapnya pada array builtinModules:
import { builtinModules } from "node:module";
const publik = builtinModules.filter((nama) => !nama.startsWith("_"));
console.log(`Jumlah core module publik: ${publik.length}`);
console.log(publik.slice(0, 8).join(", "));Output yang Dihasilkan:
Jumlah core module publik: 58
assert, assert/strict, async_hooks, buffer, child_process, cluster, console, constantsMethod filter() membuang module internal yang namanya diawali garis bawah — module semacam itu dipakai Node.js sendiri dan tidak dimaksudkan untuk dipakai langsung oleh aplikasi kita. Angka pada baris pertama bertambah seiring Node.js menambahkan module baru dari versi ke versi, jadi angka tersebut tidak perlu dihafal; yang penting adalah pesannya: ada puluhan perkakas siap pakai yang menunggu dieksplorasi di dokumentasi API.
Konvensi Prefix node: #
Sebagian besar core module bisa diimpor dengan dua bentuk specifier: nama polos (fs) atau nama berprefix (node:fs). Course ini selalu memakai bentuk kedua, dan ada tiga alasan praktis di balik kebiasaan tersebut. Alasan pertama adalah kejelasan: prefix node: langsung memberi tahu pembaca kode bahwa module berasal dari runtime, bukan package npm yang kebetulan bernama sama. Alasan kedua adalah jaminan: pemanggilan require("node:http") selalu mengembalikan module inti HTTP karena specifier berprefix melewati require cache sepenuhnya, sehingga hasilnya tidak bisa dipalsukan dari luar. Alasan ketiga berkaitan dengan masa depan: module baru seperti node:test dan node:sqlite justru mewajibkan prefix — Node.js sengaja menamainya begitu agar module inti yang baru tidak menggantikan package lama di npm yang sudah lebih dulu memakai nama test atau sqlite.
import fs from "fs";Blok di atas masih valid, tetapi pada Course ini kita selalu menuliskannya dengan prefix agar sumber module terlihat jelas sejak baris import:
import fs from "node:fs"; // selalu mengarah ke module inti Node.js
Peta Core Module yang Sering Dipakai #
Tidak semua core module dipakai dengan frekuensi yang sama. Tabel berikut memetakan module yang paling sering muncul dalam pekerjaan sehari-hari, dikelompokkan menurut perannya. Enam entri pertama dibahas tuntas pada Section ini, sisanya menunggu di section lain sesuai topiknya masing-masing.
| Module | Peran utama | Pembahasan |
|---|---|---|
node:path | Merangkai dan mengurai path berkas lintas sistem operasi | Section ini |
node:url | Parsing dan penyusunan URL | Section ini |
node:util | Utilitas umum: argumen CLI, promisify, format string | Section ini |
node:events | Pola publish-subscribe lewat EventEmitter | Section ini |
process (global) | Argumen CLI, environment variable, siklus proses | Section ini |
node:os | Informasi sistem operasi: platform, CPU, memori | Section ini |
node:fs | Membaca dan menulis berkas | Section Filesystem |
node:buffer | Menampung data biner mentah | Section Buffers dan Streams |
node:http | Membangun server dan klien HTTP | Section HTTP dan Web Servers |
node:crypto | Hash, enkripsi, dan angka acak yang aman | Section Security |
Enam baris pertama tabel itulah peta jalan kita pada Section ini. Kita mulai dari node:path karena hampir semua aplikasi berurusan dengan berkas, lalu bergerak ke node:url yang menjadi dasar pemahaman import.meta.url, dilanjutkan node:util, node:events, process, dan ditutup node:os.
Gaya Impor yang Kita Pakai #
Setiap core module mengekspor sekumpulan nilai, dan ada dua gaya import yang akan berganti-ganti kita lihat pada Section ini. Gaya pertama adalah named import — mengambil fungsi tertentu langsung dari module, cocok saat kita hanya butuh satu-dua fungsi. Gaya kedua adalah default import — mengambil object utama module sebagai satu kesatuan, seperti path atau os, cocok saat banyak fungsi dari module tersebut dipakai. Berkas contoh-impor.mjs memakai keduanya sekaligus:
import { join, basename } from "node:path";
import { format } from "node:util";
import os from "node:os";
const berkas = join("laporan", "2026", "ringkasan.csv");
console.log(format("Berkas laporan: %s", berkas));
console.log("Nama berkas :", basename(berkas));
console.log("Berjalan di :", os.platform());Output yang Dihasilkan:
Berkas laporan: laporan/2026/ringkasan.csv
Nama berkas : ringkasan.csv
Berjalan di : linuxMari kita telaah baris-baris kode di atas:
- Baris 1-3 (import): Baris pertama dan kedua memakai named import untuk mengambil
join,basename, danformatdari module masing-masing. Baris ketiga memakai default import karenaosdiakses sebagai satu object utuh. - Baris 5 (
const berkas = join(...)): Functionjoin()merangkai tiga segmen menjadi satu path — peran persis modulenode:pathyang akan kita bedah pada chapter berikutnya. - Baris 7 (
format("Berkas laporan: %s", berkas)): Functionformat()darinode:utilmenggantikan%sdengan nilaiberkas— pola format string yang juga dipakaiconsole.log. - Baris 8-9:
basename()mengambil nama berkas tanpa foldernya, danos.platform()melaporkan sistem operasi tempat skrip berjalan.
Nilai linux pada baris terakhir output adalah hasil os.platform() di komputer tempat contoh ini diuji; di Windows hasilnya win32, di macOS darwin. Perilaku seperti inilah yang membuat core module menarik: satu baris kode memberi tahu program kita sedang berjalan di lingkungan mana, tanpa pemeriksaan manual yang rawan salah.
Referensi lanjutan untuk topik chapter ini:
- Dokumentasi API Node.js — indeks semua core module
- Core modules — Node.js
- Globals — Node.js
Peta sudah di tangan dan konvensi impor sudah jelas. Saatnya masuk ke core module pertama yang paling sering dipakai dalam praktik: node:path, penyusun path berkas yang aman untuk lintas sistem operasi.