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:
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:
dirname : catatan/2026
basename : laporan.txt
extname : .txt
tanpa ext: laporan
parse : catatan/2026 | laporan.txt | .txt | laporanMari kita telaah baris-baris kode di atas:
- Baris 3 (
const berkas = ...): Path contoh disimpan sebagai string relatif — tidak diawali/atau huruf drive, sehingga sama amannya dibaca di sistem operasi mana pun. - Baris 5-8: Tiga function pengurai dipakai bergantian. Argumen kedua pada
basename()membuang ekstensi dari hasilnya, berguna saat kita ingin mengganti ekstensi sebuah berkas. - Baris 10 (
path.parse(berkas)): Functionparse()mengembalikan object dengan propertyroot,dir,base,ext, dannamesekaligus — 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:
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:
.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:
| Function | Tugas utama | Contoh masukan | Sifat 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:
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:
catatan/2026/januari/daftar.txt
tugas/daftar.txt
tugas/daftar.txt
tugas.json
data/tugas.jsonMari kita telaah baris-baris kode di atas:
- Baris 3:
join()menggabungkan segmen dengan pemisah yang benar untuk sistem operasi berjalan — di Linux dan macOS hasilnya memakai/. - Baris 4: Segmen
".."tetap dihormati lalu dirapikan, sehingga"catatan/.."dibatalkan dan hasilnya berawal di"tugas". - Baris 5:
normalize()menerima satu string berantakan dan mengembalikan versi rapinya tanpa menambahkan apa pun — cocok untuk membersihkan masukan dari pengguna. - 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 mencetakbasename()-nya, lalupath.relative()untuk melihat posisinya relatif terhadapprocess.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:
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:
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 : trueBaris 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: