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:

js
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:

text
Jumlah core module publik: 58
assert, assert/strict, async_hooks, buffer, child_process, cluster, console, constants

Method 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.

js Specifier polos: masih bekerja untuk module lama
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:

js Gaya import yang dipakai Course ini
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.

ModulePeran utamaPembahasan
node:pathMerangkai dan mengurai path berkas lintas sistem operasiSection ini
node:urlParsing dan penyusunan URLSection ini
node:utilUtilitas umum: argumen CLI, promisify, format stringSection ini
node:eventsPola publish-subscribe lewat EventEmitterSection ini
process (global)Argumen CLI, environment variable, siklus prosesSection ini
node:osInformasi sistem operasi: platform, CPU, memoriSection ini
node:fsMembaca dan menulis berkasSection Filesystem
node:bufferMenampung data biner mentahSection Buffers dan Streams
node:httpMembangun server dan klien HTTPSection HTTP dan Web Servers
node:cryptoHash, enkripsi, dan angka acak yang amanSection 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:

js
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:

text
Berkas laporan: laporan/2026/ringkasan.csv
Nama berkas    : ringkasan.csv
Berjalan di    : linux

Mari kita telaah baris-baris kode di atas:

  1. Baris 1-3 (import): Baris pertama dan kedua memakai named import untuk mengambil join, basename, dan format dari module masing-masing. Baris ketiga memakai default import karena os diakses sebagai satu object utuh.
  2. Baris 5 (const berkas = join(...)): Function join() merangkai tiga segmen menjadi satu path — peran persis module node:path yang akan kita bedah pada chapter berikutnya.
  3. Baris 7 (format("Berkas laporan: %s", berkas)): Function format() dari node:util menggantikan %s dengan nilai berkas — pola format string yang juga dipakai console.log.
  4. Baris 8-9: basename() mengambil nama berkas tanpa foldernya, dan os.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:

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.