Архитектура современного фронтенд-приложения на базе Vite предполагает разделение среды разработки и среды продакшена, а также воспроизводимость сборки на любых машинах. Контейнеризация через Docker решает задачу изоляции окружения, фиксирования зависимостей и стандартизации процесса деплоя.
Vite-приложение в продакшене представляет собой статический набор файлов после команды сборки. Эти файлы не требуют выполнения Node.js в runtime, если они обслуживаются веб-сервером. Однако сам процесс сборки требует Node.js.
Типовой жизненный цикл выглядит следующим образом:
vite build)distКонтейнеризация может включать как этап сборки, так и этап раздачи.
Наиболее эффективный подход — использование multi-stage build в Docker.
Пример Dockerfile:
# Stage 1: build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: production server
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Используется минимальный образ Node.js на базе Alpine Linux для уменьшения размера контейнера.
Ключевые операции:
npm ci обеспечивает детерминированную установку
зависимостейvite build, который генерирует
production-версию проектаVite в этом режиме выполняет:
Для продакшена используется Nginx, так как он оптимизирован под раздачу статических файлов.
Основные причины выбора:
Vite-приложения часто являются SPA, поэтому требуется fallback на
index.html.
Пример конфигурации:
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
}
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Для разработки контейнер может запускать dev-server Vite.
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5173
CMD ["npm", "run", "dev", "--", "--host"]
Ключевой момент — --host, иначе сервер будет доступен
только внутри контейнера.
version: "3.9"
services:
vite-app:
build: .
ports:
- "5173:5173"
volumes:
- .:/app
- /app/node_modules
environment:
- CHOKIDAR_USEPOLLING=true
Особенности:
node_modules предотвращает конфликты
зависимостейVite использует .env файлы, которые подхватываются на
этапе сборки.
В Docker важно понимать:
Пример:
VITE_API_URL=https://api.example.com
Docker build:
docker build --build-arg VITE_API_URL=https://api.example.com .
И Dockerfile:
ARG VITE_API_URL
ENV VITE_API_URL=$VITE_API_URL
Оптимизация Docker-сборки критична для Vite-проектов.
Правильный порядок слоёв:
Это позволяет Docker использовать кеш при изменении только исходников.
Практики оптимизации:
alpine образовПример:
RUN npm prune --production
Vite часто используется с клиентским роутингом (например, React Router). Без правильного fallback сервер вернёт 404 при прямом заходе на маршрут.
Решение реализуется через:
try_files в NginxКонтейнеризация снижает поверхность атаки, но требует дополнительных мер:
Типовой pipeline:
Пример тега:
docker build -t my-vite-app:1.0.0 .
Hot Module Replacement в Vite требует проброса портов и файловой синхронизации.
Основные условия:
--host 0.0.0.0dist в nginx-образеbase в config)project/
Dockerfile
nginx.conf
package.json
vite.config.js
src/
dist/ (генерируется)
Контейнеризированный Vite-проект легко интегрируется в:
Статическая природа сборки делает такие приложения предсказуемыми и легко масштабируемыми через CDN и reverse proxy слои.