JavaScript adalah bahasa yang sama, tetapi Node.js dan browser adalah dua dunia eksekusi yang berbeda. Browser memakai JavaScript untuk memanipulasi halaman web di dalam sandbox yang ketat; Node.js memakai JavaScript untuk membaca berkas, membuka koneksi jaringan, dan menjalankan proses apa pun di sistem operasi. Pemula yang pindah dari salah satu dunia ke dunia lain sering menemukan error membingungkan — misalnya window is not defined — hanya karena membawa kebiasaan lama. Chapter ini memetakan perbedaan keduanya supaya kita tahu API mana yang tersedia di mana.

Lingkungan Eksekusi yang Berbeda #

Inti bahasanya memang sama: baik di browser maupun di Node.js, kode JavaScript mengikuti standar ECMAScript yang dikembangkan TC39 — mulai dari const, arrow function, class, sampai async/await. Yang berbeda adalah host environment, lingkungan perumah yang menyediakan API di sekitar bahasa. Browser menambahkan DOM untuk memanipulasi halaman, localStorage untuk penyimpanan, dan berbagai API web lainnya. Node.js menambahkan node:fs untuk berkas, node:http untuk server, serta object process untuk informasi runtime.

Dua contoh kecil berikut memperlihatkan perbedaan tersebut. Kode pertama hanya bisa berjalan di browser karena bergantung pada document:

html contoh-browser.html
<!DOCTYPE html>
<html>
  <body>
    <p id="salam"></p>
    <script>
      const pengguna = "Budi";
      document.getElementById("salam").textContent = `Halo, ${pengguna}!`;
    </script>
  </body>
</html>

Sebaliknya, program berikut memeriksa nama-nama global tersebut dari dalam Node.js — hasil yang sama dijalankan pada konsol browser akan berbeda pada beberapa baris.

Mendeteksi Lingkungan dengan typeof #

Operator typeof memberi tahu tipe sebuah nama tanpa melempar error walau nama tersebut tidak ada. Program berikut memeriksa lima nama global yang paling sering dipakai:

js
const pemeriksaan = {
  window: typeof window,
  document: typeof document,
  process: typeof process,
  globalThis: typeof globalThis,
  fetch: typeof fetch,
};

for (const [nama, tipe] of Object.entries(pemeriksaan)) {
  console.log(`${nama.padEnd(11)} -> ${tipe}`);
}

Output yang Dihasilkan:

text
window      -> undefined
document    -> undefined
process     -> object
globalThis  -> object
fetch       -> function

Mari kita baca hasilnya baris demi baris:

  1. window dan document bernilai "undefined" — keduanya adalah API milik browser, dan Node.js sengaja tidak menyediakannya karena tidak ada halaman web yang perlu dimanipulasi.
  2. process bernilai "object" — object khusus Node.js yang menyediakan argumen command line, environment variable, dan versi runtime. Di browser murni, typeof process akan menghasilkan "undefined".
  3. globalThis bernilai "object" — nama standar ECMAScript yang selalu menunjuk global object di lingkungan mana pun. Di browser globalThis === window; di Node.js globalThis adalah global object runtime. Inilah cara portabel mengakses global antar lingkungan.
  4. fetch bernilai "function" — API jaringan yang kini tersedia di kedua dunia, sehingga kode fetch bisa dipakai bersama.

Peta Perbedaan Utama #

AspekBrowserNode.js
Global utamawindow (juga globalThis)globalThis dan process
Manipulasi halamanDOM: document, querySelectorTidak ada
Akses berkasDilarang oleh sandboxPenuh lewat node:fs
Penyimpanan lokallocalStorage, IndexedDBBerkas dan database
Sistem module<script>, import map, bundlerES Modules dan CommonJS bawaan
Jaringanfetch dengan batasan CORSfetch, node:http, node:net tanpa CORS
Kode berjalan diTab browser, sandbox per originProses sistem operasi penuh
Waktu hidupMengikuti halaman yang dibukaMengikuti skrip atau server yang berjalan

Dokumentasi resmi untuk masing-masing dunia juga terpisah: API browser seperti window terdokumentasi di MDN Web Docs , sedangkan global Node.js seperti process dan console terdokumentasi di referensi globals Node.js dan API process .

Model Keamanan yang Berbeda #

Perbedaan paling fundamental antara kedua dunia ada di model keamanan. Browser dirancang untuk mengeksekusi kode dari server mana pun yang kita kunjungi, sehingga sandbox membatasi kode tersebut: JavaScript browser tidak boleh membaca berkas pribadi, memindai folder, atau membuka koneksi sembarangan tanpa izin CORS. Node.js tidak punya pagar semacam itu. Kode yang kita jalankan dengan node memiliki hak seluas akun pengguna kita — dapat membaca dan menulis berkas, menghapus folder, serta mengirim data ke jaringan mana pun.

Berbagi Kode antara Dua Dunia #

Perbedaan dua dunia tidak berarti kode tidak bisa dipakai bersama. Logika murni — validasi form, perhitungan harga, parser data — biasanya tidak menyentuh DOM maupun node:fs, sehingga dapat ditulis sekali lalu dijalankan di kedua lingkungan; kode semacam ini disebut isomorphic atau universal. Trik typeof pada demo di atas adalah cara sederhana mendeteksi lingkungan agar satu berkas dapat memilih jalur kode yang sesuai. Untuk proyek fullstack, pola ini menghemat banyak duplikasi antara kode frontend dan backend.

Dengan peta perbedaan ini, kita punya ekspektasi yang tepat tentang apa yang bisa dilakukan JavaScript di tiap lingkungan. Pertanyaan berikutnya: untuk kebutuhan apa saja pengembang memilih Node.js sebagai rumah kodenya? Chapter Kegunaan dan Ekosistem Node.js menjawabnya sekaligus memperkenalkan ekosistem npm yang menemaninya.