Node.js yang kita jalankan hari ini sangat berbeda dari Node.js lima tahun lalu. Fitur-fitur yang dulu mengharuskan kita memasang package pihak ketiga kini hadir langsung di runtime: test runner, HTTP client fetch, pembaca berkas .env, mode pantau berkas otomatis, hingga database SQLite bawaan. Pergeseran ini mengubah cara kita memulai proyek baru — daftar dependency menyusut dan alur kerja sehari-hari cukup ditopang satu perintah node. Chapter ini memetakan fitur-fitur modern tersebut beserta versi yang menghadirkannya, lalu menutup dengan gambaran lima chapter praktis yang menanti di Section ini.

Dari Ekosistem ke Core Module #

Pola perkembangan Node.js modern dapat dibaca dari satu kebiasaan: sebuah kebutuhan lahir lebih dulu di ekosistem, terbukti berguna, lalu diserap menjadi fitur runtime. Komunitas memakai node-fetch bertahun-tahun sebelum fetch menjadi global function; nodemon dan dotenv menutup celah yang sama sebelum --watch dan --env-file hadir. Serapan semacam ini memberi tiga keuntungan nyata. Pertama, perbaikan bug dan tambalan keamanan mengikuti siklus dukungan resmi Node.js, bukan kesibukan satu maintainer package. Kedua, proyek baru tidak menambah dependency untuk kebutuhan dasar, sehingga npm install lebih ringan dan risiko konflik versi mengecil. Ketiga, perilaku fitur terdokumentasi di satu tempat — dokumentasi resmi Node.js — dan konsisten di semua mesin yang menjalankan versi yang sama.

Peta Fitur Modern Node.js #

Tabel berikut merangkum fitur-fitur yang mengubah rutinitas harian, lengkap dengan versi kedatangannya dan status stabilitasnya pada Node.js 24 yang dipakai Course ini:

FiturDulu dikerjakan denganHadir sejakStatus di Node 24
node --watchnodemonv18.11.0 (v16.19.0)Stabil
node --env-filedotenvv20.6.0Stabil sejak v24.10.0
node --test dan node:testjest, mochav18.0.0 (v16.17.0)Stabil
fetch globalnode-fetchv18.0.0 tanpa flagStabil sejak v21.0.0
node:sqlitebetter-sqlite3v22.5.0Release candidate
Permission Model(tanpa padanan core)v20.0.0Stabil
Menjalankan berkas .ts langsungts-node, tsxv23.6.0Stabil sejak v24.12.0
Single Executable Applicationpkg, nexev19.7.0 (v18.16.0)Eksperimental

Dua catatan menemani tabel tersebut. Label Stabil berarti API dijaga kompatibilitasnya antarversi; Release candidate berarti penuh fitur namun masih bisa disempurnakan; Eksperimental berarti bentuk API masih boleh berubah. Selain itu, “core menyerap” tidak berarti package lama kehilangan tempatnya — jest menawarkan fitur di luar node:test, dan HTTP client kaya fitur seperti axios tetap sah dipakai; yang berubah hanyalah titik awal: kebutuhan paling dasar kini dipenuhi runtime tanpa instalasi apa pun.

Beberapa Fitur dalam Satu Berkas #

Untuk merasakan pola ini, mari kita jalankan satu berkas kecil yang memakai tiga kelompok fitur modern sekaligus — Web API, core module node:sqlite, dan konfigurasi lewat process.env:

js
import { DatabaseSync } from 'node:sqlite';

// 1. Web API: URLSearchParams menyusun query string tanpa package
const filter = new URLSearchParams({ status: 'selesai', halaman: '2' });
console.log('kueri    :', filter.toString());

// 2. node:sqlite: database SQL langsung dari core module
const db = new DatabaseSync(':memory:');
db.exec('CREATE TABLE tugas (id INTEGER PRIMARY KEY, judul TEXT)');
db.prepare('INSERT INTO tugas (judul) VALUES (?)').run('Belajar fitur modern');
const baris = db.prepare('SELECT id, judul FROM tugas').all();
console.log('sqlite   :', JSON.stringify(baris));

// 3. Web API: Response dapat dibuat tanpa server sama sekali
const jawaban = new Response(JSON.stringify({ total: baris.length }), {
  status: 201,
  headers: { 'Content-Type': 'application/json' },
});
console.log('respons  :', jawaban.status, JSON.stringify(await jawaban.json()));

// 4. Konfigurasi: flag --env-file mengisi process.env saat proses mulai
console.log('aplikasi :', process.env.NAMA_APLIKASI ?? '(belum diatur)');

Output yang Dihasilkan:

text
kueri    : status=selesai&halaman=2
sqlite   : [{"id":1,"judul":"Belajar fitur modern"}]
respons  : 201 {"total":1}
aplikasi : (belum diatur)

Baris aplikasi masih kosong karena kita belum memberikan konfigurasi apa pun. Berkas pengaturan.txt berikut menyimpan satu pasangan kunci-nilai:

text
# Pengaturan latihan
NAMA_APLIKASI=Toko Latihan

Sekarang jalankan berkas yang sama dengan flag --env-file:

bash
node --env-file=pengaturan.txt fitur-modern.mjs

Output yang Dihasilkan:

text
kueri    : status=selesai&halaman=2
sqlite   : [{"id":1,"judul":"Belajar fitur modern"}]
respons  : 201 {"total":1}
aplikasi : Toko Latihan

Mari kita telaah bagian-bagian berkas tersebut:

  1. Baris 4 (new URLSearchParams(...)): object Web API yang menyusun query string dari object biasa — tanpa satu pun import, karena URLSearchParams adalah global di Node.js.
  2. Baris 8-12 (DatabaseSync): database SQLite dijalankan dari core module node:sqlite, sesuatu yang dulu menuntut package native seperti better-sqlite3.
  3. Baris 15-19 (new Response(...)): object Response dibuat manual tanpa jaringan sama sekali — pola yang berguna untuk menguji kode konsumen API, dibahas penuh pada Chapter Web API di Node.js.
  4. Baris 23 (process.env.NAMA_APLIKASI): konfigurasi dibaca dari environment; pada eksekusi pertama nilainya belum ada, lalu terisi setelah flag --env-file memuat pengaturan.txt.

Denyut Rilis dan Posisi Kita #

Fitur-fitur di atas datang bergelombang mengikuti denyut rilis Node.js: setiap enam bulan keluar versi major baru berstatus Current, dan setiap versi genap naik menjadi Long Term Support (LTS) pada Oktober. Course ini memakai Node.js 24 ber-codename Krypton yang berstatus Active LTS — artinya seluruh fitur pada tabel di atas tersedia dan terpelihara. Jadwal lengkap kapan tiap garis LTS berakhir dukungannya dapat diikuti di jadwal rilis resmi dan daftar rilis sebelumnya ; cara membaca nomor versi dan statusnya sendiri sudah kita bahas tuntas pada Chapter Versi Node.js dan Kompatibilitas.

Peta Section Ini #

Lima chapter berikutnya membedah fitur-fitur praktis tersebut satu per satu dengan contoh yang dapat dijalankan:

  • Watch Mode — mematikan siklus edit-lalu-jalankan-ulang secara manual.
  • Berkas Environment dengan –env-file — memuat konfigurasi tanpa package dotenv.
  • Permission Model — membatasi akses berkas dan proses anak lewat daftar izin eksplisit.
  • Single Executable Application — membagikan aplikasi sebagai satu berkas executable.
  • Web API di Node.js — menelusuri fetch, URL, Headers, dan kawan-kawannya sebagai warga runtime.

Kita mulai dari yang paling sering dipakai sehari-hari: watch mode yang mengawasi berkas dan memulai ulang aplikasi setiap kali kita menyimpan perubahan.