Episode ini membedah konfigurasi Remix: vite.config.ts sebagai pusat build, environment variables untuk secret dan konfigurasi, pemilihan adapter dan runtime, pengelolaan aset di folder public, serta optimasi build untuk production.

Sampai episode 7, semua aplikasi kalian berjalan dengan konfigurasi bawaan. Di production, itu tidak cukup: kalian butuh secret, env yang berbeda antar lingkungan, pilihan adapter, dan build yang dioptimalkan. Episode 8 adalah lapisan konfigurasi.
Perubahan terbesar yang harus kalian pegang: sejak Remix v3, semua konfigurasi hidup di vite.config.ts. File remix.config.js yang sering muncul di tutorial lama sudah tidak dipakai. Vite menjadi bundler sekaligus dev server, sehingga satu sistem konfigurasi menangani semuanya.
Episode 8 akan membahas vite.config.ts, environment variables, pemilihan adapter dan runtime, pengelolaan aset statis, serta optimasi build.
Semua opsi Remix dikonfigurasi lewat plugin remix() di dalam defineConfig Vite. Beberapa opsi penting yang bisa diatur di sana:
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
export default defineConfig({
plugins: [
remix({
future: { v3_fetcherPersist: true },
}),
tsconfigPaths(),
],
build: { target: "node20" },
});Opsi future pada plugin remix mengaktifkan perilaku versi berikutnya secara bertahap. Dengan pola ini, upgrade Remix besar tidak harus sekaligus — fitur baru diaktifkan satu per satu.
Konteks penting: file ini dikompilasi dan bisa ikut ke client bundle untuk kode yang di-import dari sana. Karena itu, jangan pernah menuliskan secret langsung di vite.config.ts. Secret hanya boleh masuk lewat environment variables yang dibaca di server.
Environment variables memisahkan konfigurasi dari kode: nilai berubah per lingkungan, kode tidak. Di Node.js, nilai diakses lewat process.env. Di Remix, tempat yang aman untuk membacanya adalah loader, action, atau modul yang hanya dijalankan di server.
export async function loader() {
const apiUrl = process.env.API_URL;
const apiKey = process.env.API_KEY;
return { apiUrl };
}process.env.API_KEY hanya tersedia di server — jangan pernah mengirimnya ke client. Bila sebuah nilai memang harus terlihat di browser, beri nama dengan prefiks dan baca di root loader, lalu bagikan lewat context.
Buat file .env atau .env.local di root project untuk nilai lokal. Platform hosting modern mendukung pengaturan env yang sama secara grafis atau lewat CLI. Environment variables antar environment: development, staging, dan production harus dibedakan dengan hati-hati agar secret staging tidak bocor ke production.
Adapter adalah jembatan antara Remix dan server host. Remix v3 membawa beberapa adapter bawaan: Node.js, Vercel, Netlify, Cloudflare, dan Deno. Pilihan adapter menentukan bagaimana server bundle dibangun dan dijalankan.
npm view @remix-run/node version
npm view @remix-run/cloudflare-pages version
npm view @remix-run/vercel versionPilih adapter sesuai platform deployment; tiap adapter menyesuaikan entry.server dan build output. Tidak masalah berpindah adapter nanti, tapi lebih baik menentukan dari awal.
Adapter juga menentukan runtime: Node.js yang lengkap, atau edge yang ringan dan cepat. Runtime berbeda punya dukungan API berbeda — misalnya akses filesystem tidak ada di edge. Detail perbandingan ini akan dibahas mendalam di episode 21.
Semua file di folder public disalin apa adanya ke output build. Tempatkan di sini file yang tidak perlu diproses bundler: favicon, robots.txt, manifest, dan gambar statis. Nama file di public diakses langsung dari root, misalnya public/logo.svg menjadi /logo.svg.
Untuk aset yang ingin dioptimalkan bundler — hash nama file, kompresi, atau inline — import langsung di kode. Vite menangani tipe aset umum seperti gambar, CSS, dan font. Hasilnya nama file diberi hash sehingga caching bisa sangat agresif.
Jalankan build untuk melihat hasil optimasi:
npm run build
npm run startBuild menghasilkan folder build dengan server bundle dan aset statis yang siap dideploy. Perhatikan ukuran bundle di log — angka besar di awal bisa jadi indikasi import yang tidak perlu.
Optimasi utama di Remix datang dari struktur: tiap route membawa kodenya sendiri, dan import statis besar bisa dibuat lazy. Hindari mengimpor library besar di root layout jika hanya dipakai satu route. Praktik code-splitting dan tree shaking akan diperdalam di episode 19.
Episode 8 memberi kalian kendali atas konfigurasi: vite.config.ts sebagai pusat build, environment variables untuk memisahkan kode dari konfigurasi, adapter dan runtime untuk platform deployment, folder public untuk aset statis, serta praktik build yang dioptimalkan.
Inti yang harus dibawa pulang:
Di episode 9 selanjutnya kita akan membahas caching dan performa — cache headers dan cache control, data revalidation dengan stale-while-revalidate, optimasi gambar, serta monitoring performa dengan Lighthouse. Konfigurasi sudah rapi; sekarang saatnya membuat aplikasi kalian terasa cepat.