Modul CommonJS: require & module.exports
Memecah program menjadi berkas-berkas modul dan memakai require, module.exports, dan cache modul.
Kenapa modul?
Satu berkas berisi ribuan baris cepat menjadi mimpi buruk. Modul memecah program menjadi berkas-berkas kecil dengan tugas jelas: database.js, pajak.js, pengguna.js. Tiap berkas punya ruang lingkup sendiri — variabel di dalamnya tidak bocor ke berkas lain kecuali kamu ekspor.
CommonJS: sistem modul klasik Node
Setiap berkas .js adalah modul. Dua alat utamanya:
module.exports— apa yang dibagikan modul ini ke luar.require('...')— mengambil ekspor modul lain.
// hitung.js
function tambah(a, b) { return a + b; }
function kali(a, b) { return a * b; }
module.exports = { tambah, kali };
// main.js
const { tambah, kali } = require('./hitung');
console.log(tambah(2, 3)); // 5
console.log(kali(4, 5)); // 20
Aturan jalur require
| Bentuk | Arti |
|---|---|
require('./hitung') | Berkas lokal (awalan ./ atau ../); .js boleh dihilangkan |
require('fs') | Modul bawaan Node |
require('express') | Paket dari node_modules (hasil npm install) |
Berbagai cara mengekspor
// 1. Banyak anggota
module.exports = { tambah, kali };
// 2. Menambah satu per satu
exports.tambah = (a, b) => a + b;
exports.kali = (a, b) => a * b;
// 3. Satu hal utama (mis. sebuah class)
module.exports = class Keranjang { /* ... */ };
Jebakan: exports hanyalah pintasan ke module.exports. Menimpanya dengan exports = {...} tidak berpengaruh. Untuk mengganti seluruh ekspor, selalu gunakan module.exports = ....
Modul dieksekusi sekali (cache)
Saat pertama di-require, kode modul dijalankan dan hasil ekspornya disimpan di cache. require berikutnya dari berkas mana pun mengembalikan objek yang sama — kode modul tidak dijalankan ulang. Itulah mengapa modul bisa dipakai sebagai "singleton" (mis. koneksi database tunggal).
Variabel khusus per modul
__filename— path lengkap berkas ini.__dirname— folder berkas ini (andalan untuk menyusun path berkas lain).module,exports,require.
Tips struktur
- Satu modul = satu tanggung jawab.
- Ekspor sesedikit mungkin; sembunyikan detail internal.
- Hindari ketergantungan melingkar (A butuh B, B butuh A) — hasilnya ekspor setengah jadi.