Hampir semua program pada akhirnya berurusan dengan berkas: membaca konfigurasi, menyimpan laporan, atau menulis log. Masalahnya, cara menuliskan lokasi berkas tidak sama di semua sistem operasi — Linux dan macOS memakai / sebagai pemisah folder, sedangkan Windows memakai \. Merangkai path dengan penggabungan string biasa membuat program kita rapuh saat dipindahkan antar komputer. Module node:path hadir untuk menyelesaikan masalah itu dengan sekumpulan function yang bekerja konsisten di mana pun kode kita berjalan.

Mengurai Path yang Ada #

Kasus paling dasar adalah memecah sebuah path menjadi bagian-bagiannya. Function dirname() mengembalikan folder induk, basename() mengembalikan nama berkasnya, dan extname() mengembalikan ekstensinya. Berkas urai-path.mjs memperlihatkan ketiganya sekaligus path.parse() yang mengembalikan seluruh bagian dalam satu object:

js
import path from "node:path";

const berkas = "catatan/2026/laporan.txt";

console.log("dirname  :", path.dirname(berkas));
console.log("basename :", path.basename(berkas));
console.log("extname  :", path.extname(berkas));
console.log("tanpa ext:", path.basename(berkas, ".txt"));

const info = path.parse(berkas);
console.log("parse    :", info.dir, "|", info.base, "|", info.ext, "|", info.name);

Output yang Dihasilkan:

text
dirname  : catatan/2026
basename : laporan.txt
extname  : .txt
tanpa ext: laporan
parse    : catatan/2026 | laporan.txt | .txt | laporan

Mari kita telaah baris-baris kode di atas:

  1. Baris 3 (const berkas = ...): Path contoh disimpan sebagai string relatif — tidak diawali / atau huruf drive, sehingga sama amannya dibaca di sistem operasi mana pun.
  2. Baris 5-8: Tiga function pengurai dipakai bergantian. Argumen kedua pada basename() membuang ekstensi dari hasilnya, berguna saat kita ingin mengganti ekstensi sebuah berkas.
  3. Baris 10 (path.parse(berkas)): Function parse() mengembalikan object dengan property root, dir, base, ext, dan name sekaligus — pilihan tepat ketika semua bagian dibutuhkan, misalnya saat membangun nama berkas cadangan.

Satu perilaku extname() yang sering mengejutkan pemula: function ini hanya mengambil titik terakhir. Kita bisa membuktikannya dengan snippet mandiri berikut:

js
import path from "node:path";

console.log(path.extname("arsip.tar.gz"));
console.log(path.extname("catatan"));
console.log(path.extname("berkas."));

Output yang Dihasilkan:

text
.gz

.

Untuk "arsip.tar.gz", hasilnya ".gz" — bukan ".tar.gz" — karena extname() mencari titik pada segmen terakhir saja. Berkas tanpa titik menghasilkan string kosong, sedangkan nama yang berakhir tepat di titik menghasilkan ".".

Merangkai Path: join, resolve, normalize #

Tiga function merangkai dan merapikan path, tetapi masing-masing punya aturan berbeda. Tabel berikut merangkum perbedaan ketiganya sebelum kita lihat contoh nyatanya:

FunctionTugas utamaContoh masukanSifat hasil
path.join()Menggabungkan segmen lalu merapikannya"a", "b", "c.txt"Relatif bila segmen awal relatif
path.resolve()Menggabungkan segmen di atas direktori kerja"data", "c.txt"Selalu absolut
path.normalize()Merapikan .., ., dan pemisah berlebih"a/../b/./c.txt"Mengikuti masukan

Berkas gabung-path.mjs membandingkan ketiganya dalam satu program:

js
import path from "node:path";

console.log(path.join("catatan", "2026", "januari", "daftar.txt"));
console.log(path.join("catatan", "..", "tugas", "daftar.txt"));
console.log(path.normalize("catatan/../tugas/./daftar.txt"));

// resolve() menghasilkan path absolut; kita cetak bagian akhirnya saja
const absolut = path.resolve("data", "tugas.json");
console.log(path.basename(absolut));
console.log(path.relative(process.cwd(), absolut));

Output yang Dihasilkan:

text
catatan/2026/januari/daftar.txt
tugas/daftar.txt
tugas/daftar.txt
tugas.json
data/tugas.json

Mari kita telaah baris-baris kode di atas:

  1. Baris 3: join() menggabungkan segmen dengan pemisah yang benar untuk sistem operasi berjalan — di Linux dan macOS hasilnya memakai /.
  2. Baris 4: Segmen ".." tetap dihormati lalu dirapikan, sehingga "catatan/.." dibatalkan dan hasilnya berawal di "tugas".
  3. Baris 5: normalize() menerima satu string berantakan dan mengembalikan versi rapinya tanpa menambahkan apa pun — cocok untuk membersihkan masukan dari pengguna.
  4. Baris 8-10: resolve("data", "tugas.json") menghasilkan path absolut dari direktori kerja saat ini. Nilai lengkapnya berbeda di setiap komputer, jadi program ini sengaja hanya mencetak basename()-nya, lalu path.relative() untuk melihat posisinya relatif terhadap process.cwd().

Pemisah dan Perilaku Lintas Platform #

Konstanta path.sep menyimpan pemisah folder sistem operasi berjalan. Untuk menguji format sistem operasi lain tanpa berpindah komputer, module ini menyediakan dua implementasi lengkap: path.win32 untuk Windows dan path.posix untuk Linux serta macOS. Berkas lintas-platform.mjs memakai keduanya:

js
import path from "node:path";

console.log("path.sep       :", JSON.stringify(path.sep));
console.log("path.win32.sep :", JSON.stringify(path.win32.sep));

console.log(path.win32.join("C:", "pengguna", "budi", "berkas.txt"));
console.log(path.posix.join("basis", "data", "berkas.txt"));

console.log("win32, C:\\berkas.txt :", path.win32.isAbsolute("C:\\berkas.txt"));
console.log("posix, C:\\berkas.txt :", path.posix.isAbsolute("C:\\berkas.txt"));
console.log("posix, /etc/hosts    :", path.posix.isAbsolute("/etc/hosts"));

Output yang Dihasilkan:

text
path.sep       : "/"
path.win32.sep : "\\"
C:\pengguna\budi\berkas.txt
basis/data/berkas.txt
win32, C:\berkas.txt : true
posix, C:\berkas.txt : false
posix, /etc/hosts    : true

Baris 3-4 mencetak kedua pemisah memakai JSON.stringify() agar karakter \ terlihat apa adanya, tidak tertelan sebagai escape sequence. Baris 6 memperlihatkan path.win32.join() merangkai gaya Windows lengkap dengan huruf drive C:, sementara baris 7 memakai gaya POSIX. Tiga baris terakhir memakai isAbsolute() untuk membuktikan satu string bisa dianggap absolut oleh satu aturan tetapi tidak oleh aturan lainnya — C:\berkas.txt absolut menurut Windows, tetapi bukan menurut POSIX.

Dengan node:path, lokasi berkas tidak lagi menjadi titik rawan program kita. Pola yang sama berlaku untuk alamat web: URL juga punya struktur yang bisa diurai dan dirangkai secara programatik, dan Node.js menyediakannya lewat module node:url — topik Chapter berikutnya.

Referensi lanjutan untuk topik chapter ini: