19 poin oleh GN⁺ 2025-10-09 | 6 komentar | Bagikan ke WhatsApp
  • Belakangan ini, Node.js berkembang pesat dengan menanamkan langsung ke dalam runtime fitur-fitur yang sebelumnya hanya bisa didapat lewat paket npm
  • Ini memungkinkan pengurangan risiko keamanan rantai pasok, peningkatan portabilitas kode, pengurangan dependensi, dan penyederhanaan pemeliharaan, serta membantu memastikan performa dan stabilitas di lingkungan produksi
  • API global seperti fetch(), WebSocket, node:test telah ditambahkan, sehingga pengembangan bisa dilakukan tanpa paket populer seperti node-fetch, ws, atau mocha
  • Dengan perluasan fitur sistem berkas, tersedia opsi fs.glob(), fs.rm(), dan fs.mkdir() untuk menggantikan glob, rimraf, dan mkdirp
  • Dalam API utilitas dan kriptografi, crypto.randomUUID(), util.styleText(), dan atob/btoa kini menjadi standar sehingga paket seperti uuid dan chalk tidak lagi diperlukan
  • Beberapa fitur (node:sqlite, URLPattern, --env-file, eksekusi TypeScript, dll.) masih berada pada tahap eksperimental
  • Yang penting, evolusi internal Node.js membuat pengembangan aplikasi modern menjadi mungkin hanya dengan runtime bawaan

Paket npm utama yang kini digantikan oleh fitur bawaan Node.js

  • Selama ini Node.js bergantung pada berbagai paket npm seperti utilitas HTTP dan helper sistem berkas
  • Namun, pada versi-versi terbaru (v18~v22), tren untuk mengintegrasikan fungsi-fungsi ini langsung ke dalam runtime semakin menguat
  • Dampaknya, kompleksitas pengelolaan paket dan risiko paparan keamanan bisa berkurang

1. node-fetch → Global fetch()

  • Sejak Node.js 18, fetch() yang sama seperti di browser tersedia sebagai fungsi global
  • Permintaan HTTP bisa diproses tanpa node-fetch
  • Diperkenalkan secara eksperimental di v17.5.0 dan distabilkan di v18.0.0
  • Namun, pada versi sebelum 18, node-fetch masih diperlukan

2. ws → Global WebSocket

  • Sejak Node.js 21, kelas WebSocket global mendukung koneksi WebSocket sisi klien
    • Ditambahkan secara eksperimental di v21.0.0 dan hingga kini masih berada pada tahap eksperimental
  • Untuk implementasi WebSocket sisi server, masih perlu memakai paket ws atau pustaka terkait

3. Framework pengujian → node:test

  • Sejak Node.js 18, tersedia runner pengujian bawaan node:test yang dapat menggantikan mocha, jest, dan lainnya
    • Diperkenalkan secara eksperimental di v18.0.0 dan distabilkan di v20.0.0
    • Mendukung penulisan dan eksekusi unit test dasar
  • Jika membutuhkan snapshot, mocking, atau plugin yang kaya, framework pihak ketiga tetap berguna
    • Cukup memadai untuk pengujian tingkat modul, tetapi untuk pengembangan aplikasi full-stack, framework lama masih punya keunggulan

4. sqlite3 / better-sqlite3node:sqlite

  • Node.js sedang memperkenalkan modul eksperimental node:sqlite untuk akses SQLite
    • Menyelesaikan masalah kompilasi dan error saat upgrade yang sering muncul pada paket native binding lama
    • Mendukung tugas dasar seperti membuat database in-memory dan membuat tabel
  • Karena masih eksperimental, jika membutuhkan tuning performa tingkat lanjut atau fitur tambahan, disarankan tetap memakai paket komunitas

5. chalk / kleurutil.styleText()

  • Sejak Node.js 20.12.0, teks konsol dapat diberi gaya dengan util.styleText()
    • Distabilkan di v22.17.0
    • Mendukung gaya teks dasar seperti warna, tebal, dan garis bawah
  • Jika membutuhkan tema yang kompleks, sintaks chaining, atau kompatibilitas ke belakang, chalk dan sejenisnya masih bisa digunakan

6. strip-ansiutil.stripVTControlCharacters()

  • Fungsi untuk menghapus kode escape ANSI tersedia sebagai fungsi bawaan Node.js
    • Aman untuk membersihkan karakter kontrol dari log
  • Sebagian besar kasus penggunaan kini bisa ditangani secara native tanpa paket pihak ketiga

7. globfs.glob()

  • Sejak Node.js 22, ditambahkan fitur bawaan fs.glob() untuk pencarian pola berkas
    • Ditambahkan di v22.0.0 dan distabilkan pada v22.17.0 LTS
    • Dapat mencari berkas dengan pola glob seperti **/*.js
  • Jika membutuhkan kompatibilitas dengan Node.js versi lama, gunakan paket glob

8. rimraffs.rm({ recursive: true })

  • Penghapusan direktori secara rekursif didukung oleh API native Node.js
    • Diimplementasikan lewat opsi recursive dan force pada fs.rm()
    • Tersedia sejak sekitar v12.10.0 dan kini stabil di semua versi LTS
  • Direktori dapat dihapus dengan aman tanpa paket rimraf

9. mkdirpfs.mkdir({ recursive: true })

  • Pembuatan direktori secara rekursif disediakan lewat opsi recursive pada fs.mkdir()
    • Ditambahkan sejak v10.12.0 dan telah lama stabil
  • Direktori bertingkat dapat dibuat tanpa paket terpisah

10. uuidcrypto.randomUUID()

  • Sejak Node.js 14.17.0, tersedia fungsi pembuat UUID crypto.randomUUID()
    • Termasuk sebagai fitur stabil dalam modul kriptografi
  • ID acak yang aman dapat dibuat tanpa paket uuid

11. base64-js / atobatob, btoa

  • Sejak Node.js 20, tersedia fungsi global atob dan btoa
    • API encoding/decoding Base64 yang sama seperti di browser
    • Memberikan opsi tambahan di luar Buffer yang sudah ada
  • Pemrosesan Base64 dapat dilakukan tanpa polyfill

12. url-patternURLPattern

  • Sejak Node.js 20, API global URLPattern tersedia secara eksperimental
    • Mendukung route matching, ekstraksi parameter path, dan lainnya
    • Masih dalam tahap eksperimental dan perlu distabilkan
  • Pencocokan pola URL dapat ditangani lewat Web API standar

13. dotenv--env-file flag

  • Sejak Node.js 20.10.0, pemuatan variabel lingkungan didukung lewat flag --env-file
    • Memuat file .env secara langsung saat eksekusi
    • Masih berada pada tahap eksperimental
  • Untuk fitur tingkat lanjut seperti ekspansi variabel atau banyak file env, paket dotenv tetap diperlukan

14. event-target-shimEventTarget

  • Sejak Node.js 15.0.0, Node.js menyediakan sistem event EventTarget standar Web secara global
    • Distabilkan di v15.4.0
    • Mendukung model penanganan event yang sama seperti di browser
  • Bisa digunakan sebagai alternatif EventEmitter

15. tsc → Eksekusi TypeScript di Node.js

  • Sejak Node.js 21, file .ts bisa dijalankan langsung dengan flag --experimental-strip-types
    • Hanya melakukan penghapusan tipe, tanpa dukungan type checking penuh
    • Masih berada pada tahap eksperimental
  • Untuk build produksi, pemeriksaan tipe statis, pembuatan file deklarasi, dan type checking penuh, tsc tetap diperlukan

Kesimpulan

  • Arah perkembangan Node.js adalah mengurangi ketergantungan pada paket eksternal dan meningkatkan kematangan platform itu sendiri
  • Pada versi LTS terbaru (v22), banyak paket npm sudah tidak lagi diperlukan,
    dan ini merupakan peningkatan besar dari sisi keamanan, performa, dan kemudahan pemeliharaan
  • Di lingkungan operasi enterprise, solusi seperti N|Solid digunakan untuk memantau perubahan ini secara real-time
    • Analisis performa beban kerja nyata dari fitur bawaan (fetch, node:test, crypto.randomUUID(), dll.)
    • Agen AI N|Sentinel menyediakan pemantauan penggunaan dan rekomendasi optimasi pada level kode

6 komentar

 
nemorize 2025-10-09

API yang disediakan runtime makin bertambah..
Terutama API seperti network, URL, b64, dan API pemrosesan string, dan sebagainya...

Ini benar-benar... PH..

 
carnoxen 2025-10-09

Sepertinya UUID v7 masih terlalu dini.

 
click 2025-10-09

Menurut saya, driver db perlu dilihat dari sudut pandang yang berbeda dibanding fitur-fitur yang seharusnya masuk ke library standar lain. Baik Bun maupun yang lain, sebenarnya apa alasan mereka ingin membenamkan driver sqlite ke dalam runtime?
Apakah karena Python juga menyertakannya secara bawaan?

Menurut saya, yang lebih penting bukan membenamkan fitur sqlite, melainkan membuat standar antarmuka driver db.
Karena antarmukanya berbeda-beda untuk tiap driver, bukankah masalahnya jadi sulit mendukung berbagai jenis db tanpa memakai ORM?

 
aer0700 2025-10-09

Mungkin dimasukkan karena untuk layanan skala kecil seperti blog pribadi, sering kali cukup pakai sqlite saja. Kalau ada, memang jadi lebih praktis.

 
tujuc 2025-10-09

Menurut saya, mungkin sqlite dimasukkan karena antarmukanya paling sederhana dan bisa menjadi referensi yang bagus.

Dan saya kurang paham kenapa standar antarmuka DB Driver yang Anda sebut itu perlu dibuat. Saya rasa pernah melihat sesuatu yang mirip di PHP.

Untuk kueri kompleks yang tidak bisa ditangani ORM, saya masih menggunakan kueri RAW...
Sepertinya Anda cukup sering memakai berbagai jenis DB... bagaimana kalau mencoba membuat library? :)

 
click 2025-10-10

Kasus seperti runtime python, java, c#, go, dan lainnya yang menyediakan standar antarmuka driver DB sebenarnya cukup umum.
Namun di Node, bahkan untuk driver yang sama-sama menargetkan SQLite, eksekusi statement bisa berbeda antara execute() atau exec(), jadi meskipun hanya mengganti driver tetap perlu melakukan sejumlah perubahan.

Memang bukan hal yang sering terjadi, tapi saat mengganti DB ini cukup merepotkan.
Misalnya jika awalnya memakai MySQL lalu merasa tidak suka dengan yang dilakukan Oracle, atau ada ekstensi PostgreSQL yang benar-benar dibutuhkan, lalu diasumsikan pindah ke PostgreSQL,
pada kasus yang punya antarmuka standar seperti JDBC, cukup memverifikasi SQL saja, tetapi di ekosistem Node ada efek samping berupa harus merombak seluruh logika pemanggilan DB.

+Anda menyarankan untuk membuat library, tetapi saat membuat library akan jauh lebih mudah kalau ada standar antarmuka bersama.
Di perusahaan saya memakai Java, dan dalam framework internal harus mendukung MySQL, DB2, Oracle, MSSQL, jadi saat memelihara adapter untuk tiap DB, kami sangat terbantu oleh standar JDBC.