Pengaturan Caching untuk Mengurangi Pemanggilan Serverless pada Aplikasi Nuxt yang Berjalan di Vercel
Error 500 yang Disebabkan oleh Perbedaan Lingkungan antara Lokal dan Vercel
Mesin Nitro milik Nuxt mungkin terlihat berjalan dengan baik di mana saja, tetapi ceritanya berubah saat diunggah ke Vercel Edge Runtime. Alasan mengapa pustaka seperti sharp atau bcrypt, yang berjalan normal di lokal, segera mengeluarkan error 500 setelah penerapan (deployment) adalah karena Vercel Edge memblokir akses ke modul standar Node.js. Saya selalu menjalankan npx vercel build sebelum menekan tombol deploy. Jika Anda tidak mensimulasikan lingkungan berbasis Linux terlebih dahulu, kemungkinan besar Anda akan bergelut dengan runtime error pada jam 3 pagi.
Jika Anda menginginkan operasional yang stabil, lebih aman untuk menentukan preset sebagai vercel biasa daripada vercel-edge di nuxt.config.ts. Tidak semua API perlu dijalankan di Edge. Jangan memanggil variabel lingkungan secara langsung melalui process.env, melainkan standarisasikan dengan useRuntimeConfig milik Nitro. Kebiasaan kecil ini akan menghilangkan 80% runtime error yang terjadi setelah deployment.
Mengurangi Biaya Eksekusi Serverless sebesar 40% dengan Pengaturan routeRules
Penyebab utama tagihan Vercel yang membengkak adalah waktu eksekusi dan jumlah pemanggilan fungsi serverless. routeRules yang disediakan di Nitro 3 adalah alat paling ampuh untuk memangkas biaya ini secara fisik. Jika Anda menggunakan strategi stale-while-revalidate (SWR) dengan benar, meskipun ada 10.000 permintaan API yang masuk, eksekusi fungsi yang sebenarnya hanya akan terjadi satu kali. Ini adalah cara cerdas untuk memberikan respons cepat dalam hitungan milidetik kepada pengguna sekaligus menjaga dompet Anda.
Berikut adalah pengaturan spesifik untuk mengurangi biaya lebih dari 40%:
- Tentukan jalur (path) yang akan di-cache dalam objek
routeRules di nuxt.config.ts.
- Tambahkan
swr: 3600 pada jalur tersebut untuk mengaktifkan mode pembaruan latar belakang selama 1 jam.
- Tentukan waktu CDN menyimpan cache dengan menentukan
maxAge dan staleMaxAge di dalam opsi cache.
Dengan cara ini, Anda akan melihat jumlah pemanggilan fungsi serverless di dashboard Vercel turun secara drastis.
Pola Serialisasi Data untuk Mencegah Kesalahan Hidrasi
Kesalahan hidrasi (hydration error) yang terjadi saat HTML yang dibuat server bertemu dengan JavaScript di sisi klien membuat aplikasi menjadi tidak stabil. Nuxt 4 dirancang untuk menggunakan deep: false sebagai nilai default saat memanggil useAsyncData untuk mengatasi hal ini. Dengan mengorbankan pelacakan objek yang tidak perlu, memori dapat dihemat dan status server dapat dikirimkan ke klien dengan aman.
Terapkan tiga aturan berikut untuk menangani ketidakkonsistenan data dan mengurangi ukuran payload:
- Gunakan opsi
pick saat memanggil API untuk memilih hanya nilai kunci yang benar-benar diperlukan untuk rendering template. Ini saja dapat mengurangi ukuran payload hingga 50%.
- Gunakan
useId() di tempat yang memerlukan ID unik untuk mencocokkan pengidentifikasi antara server dan klien.
- Bungkus data yang nilainya terus berubah, seperti waktu atau angka acak, dengan komponen
<NuxtTime> untuk menanganinya berdasarkan lokal browser.
Mengatasi Kegagalan Deployment karena Kurangnya Memori
Seiring berkembangnya proyek, memori 8.192MB yang disediakan oleh wadah build Vercel terkadang tidak mencukupi. Tepatnya, ukuran heap default Node.js diatur lebih kecil dari memori yang tersedia, sehingga pengumpulan sampah (garbage collection) menjadi sering terjadi dan akhirnya proses build terhenti.
Untuk meningkatkan kecepatan build dan mencegah kegagalan deployment, segera terapkan pengaturan berikut:
- Tambahkan
NODE_OPTIONS="--max-old-space-size=4096" ke variabel lingkungan proyek Vercel. Menghilangkan batasan memori heap saja sudah cukup untuk menghilangkan hambatan (bottleneck) pada proses build.
- Jalankan
npx nuxt analyze untuk memastikan ketergantungan khusus server yang berat tidak tercampur dalam bundel klien, dan isolasi dengan alias #server.
- Kurangi ukuran bundel server dengan memindahkan logika berat di
server/middleware/, yang dijalankan pada setiap permintaan, ke dalam event handler jalur tertentu.
Setelah menyelesaikan konfigurasi lingkungan ini, waktu tunggu pipa CI/CD akan dipersingkat dan tingkat kegagalan deployment akan berkurang secara signifikan.