Berlatih dengan satu berkas sudah kita lewati; proyek sungguhan tersusun dari belasan berkas dengan tugas berbeda — kode program, berkas uji, konfigurasi, hingga dokumentasi. Tanpa kesepakatan struktur, folder proyek cepat berubah menjadi tumpukan berkas yang sulit dirawat. Komunitas Node.js lama menghasilkan konvensi struktur yang mapan, dan Chapter ini memperkenalkan versi bakunya: kode di src/, pengujian di test/, identitas proyek di package.json, plus README.md dan .gitignore sebagai pelengkap yang bertugas penting.
Anatomi Proyek Node.js #
Struktur proyek yang kita pakai sepanjang Course ini terlihat seperti berikut:
aplikasi-tugas/
├── package.json
├── README.md
├── .gitignore
├── src/
│ ├── hitung.mjs
│ └── utama.mjs
└── test/
└── hitung.test.mjsMasing-masing bagian memegang tanggung jawab yang jelas:
package.json— kartu identitas proyek: nama, versi, konfigurasi module, dan daftar perintah.src/— seluruh kode program; singkatan dari source. Memisahkan kode dari berkas lain memudahkan pencarian.test/— berkas uji yang memeriksa perilaku kode disrc/secara otomatis.README.md— dokumentasi pertama yang dibaca orang: cara memasang dan menjalankan proyek..gitignore— daftar berkas yang tidak boleh ikut tersimpan ke repositori Git.
Struktur seperti ini sengaja datar dan sederhana. Proyek yang lebih besar menambahkan folder semacam config/ atau docs/, tetapi kelima bagian di atas adalah pola minimum yang hampir selalu kita jumpai.
package.json sebagai Kartu Identitas Proyek #
Berkas package.json adalah pusat kendali proyek. Isinya pada proyek contoh kita seperti ini:
{
"name": "aplikasi-tugas",
"version": "1.0.0",
"description": "Contoh struktur proyek Node.js",
"type": "module",
"main": "src/utama.mjs",
"scripts": {
"start": "node src/utama.mjs"
}
}Mari kita bedah field demi field:
namedanversion— identitas proyek. Nama ditulis huruf kecil tanpa spasi; kombinasi keduanya unik di dunia npm saat proyek dipublikasikan.description— ringkasan satu kalimat untuk manusia, ditampilkan di halaman package dan hasil pencarian.type— menentukan cara Node.js memperlakukan berkas.jsdi proyek ini. Nilai"module"membuat semua.jsdiartikan sebagai ES Modules, sama seperti.mjspada Chapter sebelumnya.main— titik masuk proyek: berkas yang dimuat ketika proyek dipakai sebagai module oleh proyek lain.scripts— perintah pintasan."start": "node src/utama.mjs"berarti perintahnpm startmenjalankannode src/utama.mjs.
Aturan penulisan package.json terdokumentasi resmi di referensi package Node.js
, dan panduan pembuatannya dari nol tersedia di dokumentasi npm
. Field-field lain — terutama dependencies — menyusul saat kita memasang package pertama pada Section Modules dan Packages.
Kode di src, Pengujian di test #
Kita isi folder src/ dengan dua berkas kecil. Berkas pertama berisi function murni yang bertugas menghitung:
export function hitungTotal(harga, jumlah) {
return harga * jumlah;
}Berkas kedua menjadi titik masuk program yang memakai function tersebut:
import { hitungTotal } from "./hitung.mjs";
const total = hitungTotal(15000, 3);
console.log(`Total belanja: Rp${total}`);Dari akar proyek, program dijalankan dengan menyertakan path folder:
node src/utama.mjsOutput yang Dihasilkan:
Total belanja: Rp45000Pemisahan hitung.mjs dan utama.mjs bukan hiasan. Function hitungTotal tidak mencetak apa pun — function hanya mengembalikan nilai — sehingga mudah diuji dan dipakai ulang; sementara utama.mjs merangkai alur program dan menjadi satu-satunya tempat pencetakan. Semakin besar proyek, semakin terasa manfaat pola ini: logika tinggal di berkas logika, presentasi tinggal di berkas masukan.
Folder test/ berisi berkas uji untuk function di atas:
import test from "node:test";
import assert from "node:assert/strict";
import { hitungTotal } from "../src/hitung.mjs";
test("menghitung total harga", () => {
assert.equal(hitungTotal(15000, 3), 45000);
});Berkas ini memakai test runner bawaan Node.js: ketika kita menjalankan node --test dari akar proyek, semua berkas uji ditemukan dan dieksekusi, lalu function hitungTotal diperiksa apakah hasilnya benar-benar 45000. Perhatikan path "../src/hitung.mjs" — berkas uji berada satu folder lebih dalam daripada kode yang diujinya, jadi naik dulu dengan ... Teknik menulis berkas uji ini kita dalami pada Section Testing.
README.md dan .gitignore #
Dua berkas pelengkap menutup struktur ini. README.md adalah halaman depan proyek — hal pertama yang dilihat orang di repositori. Isi minimalnya seperti berikut:
# Aplikasi Tugas
Contoh struktur proyek Node.js.
## Cara Menjalankan
1. Pastikan Node.js 24 terpasang.
2. Jalankan `node src/utama.mjs`.Sedangkan .gitignore mendaftar berkas yang tidak boleh ikut ke repositori Git:
node_modules/
.envStruktur proyek kini lengkap. Satu pertanyaan praktis masih tersisa: bagaimana bila proyek satu membutuhkan Node.js versi 24 sementara proyek lain terkunci di versi 22? Pertanyaan itu dijawab oleh version manager pada Chapter Mengelola Versi Node.js.