Node 22, pnpm & memasang Astro
Astro 7 menuntut Node 22.12 ke atas. Sebelum menulis satu baris komponen, ada empat keputusan toolchain yang kalau salah akan menghantui sampai tahap deploy.
Intisari
- Astro 6 dan 7 butuh Node 22.12+. Node 20 sudah tidak didukung โ ini bukan peringatan, tapi kegagalan build.
- Versi Node dikunci per proyek lewat
.nvmrcatauengines, bukan diinstal global seperti PHP. pnpm-lock.yamlwajib di-commit. Ia setaracomposer.lock, dan tanpanya build produksimu tidak reprodusibel.node_modulestidak pernah ikut ke image Docker โ ia dibangun ulang di dalam build stage.- Perintah yang menentukan cuma tiga:
dev,build, danpreview.previewyang paling sering dilewatkan orang, dan justru itu yang menyerupai produksi.
Empat menit pertama
node --version # wajib v22.12.0 atau lebih baru
corepack enable pnpm # pnpm ikut Node, tidak perlu diinstal terpisah
pnpm create astro@latest portal-berita
cd portal-berita
pnpm dev
pnpm create astro@latest akan bertanya beberapa hal. Untuk proyek portal berita yang akan
kita bangun sepanjang roadmap ini, jawablah: template Empty, TypeScript Strict,
dan install dependencies Yes. Template berisi contoh justru memperlambat โ isinya harus kamu
hapus semua sebelum bisa mulai.
Kenapa corepack, bukan npm i -g pnpm. Corepack sudah ikut di dalam
Node dan mengunci versi pnpm ke field packageManager di package.json. Artinya
laptopmu, laptop rekanmu, dan runner CI memakai pnpm versi yang sama persis โ tanpa ada yang perlu
mengingat untuk meng-update apa pun. Ini yang tidak bisa dilakukan composer global require.
Tiga kebiasaan Composer yang menyesatkan di sini
| Kebiasaan dari PHP | Kenapa keliru di Node |
|---|---|
| Satu versi PHP untuk seluruh mesin | Tiap proyek Node punya versi Node sendiri. Pasang nvm atau Volta, lalu tulis .nvmrc berisi 22 dan commit. |
vendor/ kadang ikut di-commit |
node_modules tidak pernah. Isinya bisa puluhan ribu file dan sebagian berisi binari khusus platform โ yang dibangun di macOS tidak jalan di container Linux. |
| Dependensi runtime dan dev sama-sama terpasang di produksi | Astro mem-bundle apa yang dibutuhkan saat build. Yang berjalan di produksi adalah isi dist/, bukan node_modules-mu โ kecuali dependensi yang sengaja di-externalize (Fase 10). |
Isi package.json yang menentukan
{
"name": "portal-berita",
"type": "module",
"packageManager": "[email protected]",
"engines": { "node": ">=22.12.0" },
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"check": "astro check"
}
}
"type": "module" membuat seluruh berkas .js di proyek diperlakukan sebagai ESM โ
import, bukan require. Astro mengaturnya otomatis saat scaffolding, dan
mengubahnya kembali ke CommonJS akan merusak sebagian besar dependensi modern. Biarkan.
engines tidak menghentikan siapa pun secara default, tapi pnpm akan menolak memasang kalau
kamu tambahkan engine-strict=true di .npmrc. Di tim, lakukan itu โ lebih baik
gagal saat pnpm install daripada gagal misterius saat build di CI.
Tiga perintah, tiga dunia yang berbeda
| Perintah | Yang terjadi | Kapan dipakai |
|---|---|---|
pnpm dev |
Server Vite dengan HMR. Kode tidak dibundel, modul disajikan satu per satu. | Saat menulis kode. Bukan tolok ukur performa apa pun. |
pnpm build |
Menghasilkan dist/. Halaman statis dirender jadi HTML sekarang juga; halaman on-demand dibundel jadi kode server. |
Sebelum deploy, dan di CI pada tiap pull request. |
pnpm preview |
Menjalankan hasil dist/ apa adanya, tanpa HMR dan tanpa source map dev. |
Sebelum bilang "sudah selesai". Ini satu-satunya yang menyerupai produksi. |
Bug yang cuma muncul di produksi hampir selalu ketahuan di preview. Penyebabnya
berulang: kode yang mengakses window atau document saat render server, variabel
lingkungan yang ada di .env lokal tapi tidak diteruskan ke container, dan import yang
bekerja di dev karena Vite memaafkan resolusi jalur yang tidak persis. Ketiganya diam di
pnpm dev dan meledak di pnpm build atau pnpm preview.
Struktur berkas hasil scaffolding
portal-berita/
โโโ astro.config.mjs # konfigurasi: integrasi, adapter, output
โโโ package.json
โโโ pnpm-lock.yaml # COMMIT INI
โโโ tsconfig.json
โโโ .nvmrc # berisi: 22
โโโ public/ # disalin apa adanya, TIDAK diproses
โโโ src/
โโโ pages/ # satu berkas = satu rute
โโโ layouts/
โโโ components/
โโโ assets/ # diproses & di-hash saat build
Perbedaan public/ dan src/assets/ adalah hal pertama yang membingungkan
pendatang, dan dibahas tuntas di materi Struktur proyek. Ringkasnya: apa pun yang butuh
di-optimasi atau di-hash taruh di src/assets/; yang harus punya URL tetap dan bisa ditebak โ
robots.txt, favicon.ico, berkas verifikasi domain โ taruh di public/.
Menambah dependensi yang akan kita pakai
# Integrasi Vue untuk island interaktif (Fase 4)
pnpm astro add vue
# Adapter Node untuk rendering on-demand (Fase 1 & 10)
pnpm astro add node
# Database (Fase 2)
pnpm add kysely mysql2
astro add bukan sekadar pnpm add. Ia memasang paketnya dan menyunting
astro.config.mjs untuk mendaftarkan integrasinya. Untuk paket yang bukan integrasi Astro โ
kysely, mysql2 โ pakai pnpm add biasa.
Latihan: buat proyek portal-berita dengan template Empty dan TypeScript strict.
Tulis .nvmrc berisi 22, tambahkan engine-strict=true di
.npmrc, lalu buktikan pagarnya bekerja: ubah sementara engines.node jadi
">=99" dan jalankan pnpm install โ ia harus menolak. Kembalikan, lalu
jalankan pnpm build && pnpm preview dan buka hasilnya di browser. Catat berapa
berkas yang ada di dist/.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.