VueJS #
Vite + Vue.js adalah pasangan first-class citizen. Vite lahir dari ekosistem Vue dan menawarkan startup time nyaris instan, HMR super cepat, serta konfigurasi yang minim. Untuk development lokal, pengalaman ini terasa sangat menyenangkan — selama environment-nya konsisten.
Masalah mulai muncul ketika:
- Tim memakai OS berbeda
- Versi Node.js tidak seragam
- File watcher bertingkah aneh
- Setup project baru memakan waktu
Di titik ini, Docker untuk local development menjadi alat penyetara, bukan akselerator performa.
Artikel ini membahas secara mendetail dan rasional:
- Dockerfile untuk aplikasi Vite + Vue.js (dev mode)
- Docker Compose sebagai orkestrator environment lokal
Fokus utama: development, bukan production.
Karakteristik Vite + Vue #
Sebelum menulis Dockerfile, penting memahami sifat Vite:
- Dev server berbasis native ESM
- HMR melalui WebSocket
- Sangat bergantung pada file system watcher
- Default bind ke
localhost
Implikasinya di Docker:
- Dev server harus bind ke
0.0.0.0 - Volume mount wajib agar HMR bekerja
- Port harus di-expose eksplisit
- Image Node sebaiknya ringan tapi tidak ekstrem
Struktur Project #
Struktur minimal yang diasumsikan:
.
├── Dockerfile
├── docker-compose.yml
├── package.json
├── package-lock.json / yarn.lock / pnpm-lock.yaml
├── vite.config.js
├── index.html
└── src/
Lock file wajib agar dependency reproducible.
Dockerfile untuk Vite + Vue.js #
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 5173
CMD ["npm", "run", "dev", "--", "--host"]
Penjelasan Dockerfile #
FROM node:20-alpine
#
- Node LTS modern
- Alpine cukup ringan untuk development
- Tidak disarankan image ultra-minimal untuk dev
WORKDIR /app
#
- Direktori kerja konsisten
- Menghindari path absolut berantakan
COPY package.json package-lock.json ./
#
- Mengoptimalkan layer caching
- Dependency tidak di-install ulang saat kode berubah
RUN npm install
#
- Menginstall dev dependency (Vite, Vue, plugin)
- Jangan gunakan
--productionuntuk dev
COPY . .
#
- Source code baru dimasukkan setelah dependency
EXPOSE 5173
#
- Port default Vite
- Bersifat dokumentatif
CMD ["npm", "run", "dev", "--", "--host"]
#
--hostmembuat server bind ke0.0.0.0- Tanpa ini, dev server tidak bisa diakses dari host
Docker Compose #
version: "3.9"
services:
web:
container_name: vite-vue-dev
build:
context: .
dockerfile: Dockerfile
ports:
- "5173:5173"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev -- --host
Penjelasan docker-compose.yml #
build
#
- Build image dari Dockerfile lokal
- Konsisten di semua mesin developer
ports
#
- Mapping port container ke host
- Akses via
http://localhost:5173
volumes
#
- .:/app
- /app/node_modules
Makna penting:
- Source code di-mount → HMR berjalan
node_modulestetap di container
Ini best practice wajib untuk frontend Docker dev.
environment
#
- Menandai mode development
- Bisa dipakai untuk conditional config
command
#
- Override CMD Dockerfile
- Memastikan
--hostselalu aktif
Workflow Development #
Menjalankan project:
docker compose up --build
Lalu:
- Edit file di
src/ - Browser auto-refresh via HMR
- Tidak perlu restart container
Menghentikan:
Ctrl + C
docker compose down
Kapan Setup Ini Tepat Digunakan? #
Cocok jika:
- Tim lintas OS
- Onboarding developer sering
- Banyak frontend project paralel
Kurang perlu jika:
- Solo developer
- Project sangat kecil
Anti-Pattern #
- ❌ Menjalankan
vite builddi Docker dev - ❌ Tidak pakai volume → HMR mati
- ❌ Node versi lama
- ❌ Mencampur
node_moduleshost & container
Docker untuk frontend bukan keharusan, tapi alat.
Best Practice #
- Gunakan Docker hanya untuk dev server, bukan build
- Selalu pakai volume mount
- Pastikan
--hostaktif - Jangan commit
node_modules - Gunakan
.dockerignore
Contoh .dockerignore:
node_modules
.git
dist
.env
Penutup #
Vite + Vue.js sudah cepat dan ringan. Docker tidak membuatnya lebih cepat, tapi membuat environment:
- Konsisten
- Mudah direproduksi
- Aman untuk kerja tim
Gunakan Docker dengan sadar. Jika tepat, DX tetap enak tanpa kehilangan keunggulan Vite.