Pernah nggak kamu buka file JavaScript yang isinya ribuan baris kode dalam satu file tunggal — dan langsung pusing tujuh keliling? Kalau pernah, kamu tidak sendirian. Itulah masalah klasik yang dihadapi hampir semua developer pemula. Solusinya ada di konsep JavaScript Modular dengan ES Modules — cara modern untuk memecah kode besar menjadi file-file kecil yang terorganisir menggunakan import dan export.
Artikel ini adalah bagian dari Seri Belajar JavaScript from Zero to Zorro — dan ini adalah artikel ke-13, artinya kamu sudah hampir sampai di garis finish! Di sini kita akan bedah tuntas cara kerja ES Modules, kenapa ini penting banget untuk proyek serius, dan bagaimana cara pakainya langsung di browser tanpa perlu tools tambahan.
Siap? Yuk kita mulai — ini artikel untuk kamu yang mau nulis kode JavaScript kayak developer pro, bukan sekedar asal jalan. 🚀
"JavaScript Modular = Kode Besar ÷ File Kecil yang Saling Terhubung"
ES Modules adalah sistem modul bawaan JavaScript modern (sejak ES6/2015) yang memungkinkan kamu mengekspor fungsi, variabel, atau class dari satu file, lalu mengimpornya di file lain — tanpa perlu library eksternal apapun.
Kenapa JavaScript Modular Penting? Analogi Lemari vs Tumpukan Baju 👔
Bayangkan kamu punya 500 lembar kertas berisi catatan pelajaran, semua dicampur jadi satu tumpukan di lantai. Setiap kali mau cari catatan matematika, kamu harus sortir satu per satu. Melelahkan, kan? Nah, itulah kondisi kode JavaScript yang ditulis dalam satu file raksasa.
Sekarang bayangkan kamu punya lemari dengan laci berlabel: Matematika, Fisika, Sejarah. Mau cari catatan apapun, langsung ketemu. Itulah cara kerja JavaScript modular dengan ES Modules — setiap file punya tanggung jawab spesifik, dan kamu bisa impor bagian yang kamu butuhkan saja.
Semua framework JavaScript modern seperti React, Vue, Angular, dan Svelte dibangun di atas konsep modular. Artinya, belajar ES Modules sekarang = mempersiapkan diri untuk belajar framework di masa depan!
Ada tiga masalah utama yang langsung terpecahkan ketika kamu beralih ke JavaScript modular:
| Aspek | ❌ Tanpa Modul | ✅ Dengan ES Modules |
|---|---|---|
| Panjang file | Ribuan baris / file | 50–200 baris / file |
| Debugging | Susah, muter-muter | Mudah, terlokalisir |
| Reuse kode | Copy-paste berantakan | Import langsung, rapi |
| Konflik variabel | Sering terjadi | Terisolasi per modul |
| Kerjasama tim | Sering bentrok | Masing-masing file terpisah |
Cara Pakai ES Modules: export dan import dari Nol
Oke, sekarang kita masuk ke praktik langsung. Ada dua kata kunci utama yang perlu kamu hafal: export untuk "menyediakan" sesuatu dari sebuah file, dan import untuk "mengambil" sesuatu dari file lain. Ikuti langkah-langkah berikut:
Buat Struktur Folder Proyek
Pertama-tama, buat folder proyek dengan struktur berikut. Kita akan pakai tiga file sebagai contoh nyata:
├── index.html
├── main.js <-- file utama (entry point)
└── 📁 modules/
├── hitung.js <-- modul kalkulasi
└── sapa.js <-- modul pesan
Tulis Kode di File Modul (hitung.js)
Ada dua jenis export: named export (bisa banyak per file) dan default export (satu per file). Kita pakai keduanya:
// Named Export — bisa diekspor banyak dalam satu file export function tambah(a, b) { return a + b; } export function kurang(a, b) { return a - b; } export const PI = 3.14159; // Default Export — hanya satu per file export default function kalkulasi(a, b, operator) { if (operator === '+') return tambah(a, b); if (operator === '-') return kurang(a, b); return 'Operator tidak dikenal'; }
Import di File Utama (main.js)
Sekarang kita "panggil" semua yang sudah diekspor tadi ke file utama. Perhatikan cara mengimport named export vs default export:
// Import named exports — pakai kurung kurawal { } import { tambah, kurang, PI } from './modules/hitung.js'; // Import default export — tanpa kurung kurawal, nama bebas import kalkulasi from './modules/hitung.js'; // Gunakan yang sudah diimport console.log(tambah(5, 3)); // Output: 8 console.log(kurang(10, 4)); // Output: 6 console.log(PI); // Output: 3.14159 console.log(kalkulasi(7, 2, '+')); // Output: 9
Hubungkan di HTML dengan type="module"
Ini adalah langkah yang sering terlupakan! Kamu harus memberitahu browser bahwa file JS-mu menggunakan ES Modules dengan menambahkan atribut type="module":
<!DOCTYPE html> <html lang="id"> <head> <meta charset="UTF-8"> <title>Proyek Modular</title> </head> <body> <!-- ⬇️ WAJIB: tambahkan type="module" --> <script type="module" src="main.js"></script> </body> </html>
ES Modules tidak bisa dijalankan langsung dengan double-click file HTML! Kamu butuh server lokal. Cara termudah: install extension Live Server di VS Code, lalu klik "Go Live". Atau pakai perintah npx serve di terminal.
Gunakan alias saat import untuk menghindari konflik nama: import { tambah as hitungTambah } from './hitung.js'. Atau import semua sekaligus dengan: import * as Hitung from './hitung.js', lalu akses dengan Hitung.tambah(5, 3).
Studi Kasus: Proyek Kalkulator Modular yang Nyata 🧮
Sekarang kita lihat implementasi yang lebih realistis — sebuah kalkulator web yang dibagi menjadi tiga modul berbeda. Ini persis pola yang dipakai di proyek profesional, walau skalanya lebih kecil.
Modul ui.js — Kontrol Tampilan
export function tampilkanHasil(hasil) { const layar = document.getElementById('hasil'); layar.textContent = hasil; layar.style.color = hasil < 0 ? '#ef4444' : '#22c55e'; } export function resetLayar() { document.getElementById('hasil').textContent = '0'; }
Modul validasi.js — Cek Input
export function isAngka(nilai) { return !isNaN(nilai) && nilai !== ''; } export function cekPembagian(pembagi) { if (pembagi === 0) { throw new Error('Tidak bisa dibagi nol!'); } }
Satukan di main.js — Orkestrasi Semua Modul
import { tambah, kurang } from './modules/hitung.js'; import { tampilkanHasil, resetLayar } from './modules/ui.js'; import { isAngka, cekPembagian } from './modules/validasi.js'; document.getElementById('btnTambah').addEventListener('click', () => { const a = Number(document.getElementById('angka1').value); const b = Number(document.getElementById('angka2').value); if (!isAngka(a) || !isAngka(b)) { alert('Masukkan angka yang valid!'); return; } tampilkanHasil(tambah(a, b)); });
Perhatikan pola di main.js — file ini bertugas sebagai "orkestrator": ia tidak punya logika berat, hanya menggabungkan semua modul. Inilah prinsip Separation of Concerns — setiap file punya satu tanggung jawab yang jelas dan tidak lebih dari itu.
Fitur Lanjutan ES Modules yang Wajib Kamu Tahu 🎓
Setelah paham dasar JavaScript modular dengan ES Modules import export, ada beberapa fitur lanjutan yang akan membuat kode kamu makin profesional:
🔄 Dynamic Import — Muat Modul Saat Dibutuhkan
Alih-alih memuat semua modul di awal, kamu bisa load modul secara dinamis hanya ketika user membutuhkannya — ini membuat halaman web jauh lebih cepat!
// Hanya load modul grafik ketika user klik tombol chart document.getElementById('btnChart').addEventListener('click', async () => { const { buatGrafik } = await import('./modules/grafik.js'); buatGrafik(data); });
📦 Barrel Export — Satu Pintu untuk Semua Modul
Buat file index.js di dalam folder modules/ sebagai "pintu masuk tunggal" yang re-export semua modul. Ini pola yang sangat populer di proyek besar:
// 📄 modules/index.js — barrel export export { tambah, kurang, PI } from './hitung.js'; export { tampilkanHasil, resetLayar } from './ui.js'; export { isAngka, cekPembagian } from './validasi.js'; // 📄 main.js — import dari satu tempat, jauh lebih bersih! import { tambah, tampilkanHasil, isAngka } from './modules/index.js';
ES Modules secara otomatis berjalan dalam strict mode — artinya kesalahan yang biasanya "diam-diam" di JavaScript biasa, akan langsung error di ES Modules. Ini sebenarnya bagus! Kamu jadi tahu masalah lebih awal.
JavaScript from Zero to Zorro
14 Artikel — dari nol hingga bisa bikin aplikasi web sendiri
No comments:
Post a Comment