Развёртывание фронтенд-приложения, собранного с использованием Vite, в инфраструктуре AWS обычно опирается на связку S3 + CloudFront, где S3 используется как статическое хранилище артефактов сборки, а CloudFront выполняет роль CDN с кэшированием, TLS и глобальной доставкой контента.
Ключевая особенность Vite — генерация полностью статических файлов после команды сборки, что делает его идеально совместимым с объектным хранилищем.
После выполнения команды:
npm run build
Vite формирует директорию dist/, содержащую:
index.html — точка входа приложенияassets/*.js)Важный аспект: все зависимости оптимизированы и разбиты на чанки, что позволяет эффективно использовать CDN-кэширование.
При размещении приложения не в корне домена необходимо задать
параметр base в конфигурации Vite:
// vite.config.js
export default {
base: '/',
}
Для размещения в поддиректории:
export default {
base: '/app/',
}
Этот параметр влияет на генерацию ссылок на ассеты в
index.html и внутри бандлов.
npm run build
Результат:
dist/
├── index.html
├── assets/
│ ├── index-[hash].js
│ ├── vendor-[hash].js
│ └── index-[hash].css
Директория dist является единственным артефактом
деплоя.
В AWS S3 создаётся bucket с уникальным именем, например:
my-vite-app-prodНастройки bucket:
Загрузка содержимого dist/:
aws s3 sync dist/ s3://my-vite-app-prod --delete
Параметр --delete синхронизирует bucket с локальной
сборкой, удаляя устаревшие файлы.
При использовании SPA (React/Vue/Svelte на Vite) необходимо учитывать маршрутизацию:
/dashboard или /profile должен
возвращать index.htmlРешения:
Настройка:
index.htmlindex.htmlЭто позволяет SPA-роутеру корректно обрабатывать маршруты.
CloudFront добавляет:
Основные настройки:
index.htmlДля корректной работы SPA необходимо обработать 404 и редирект на
index.html.
Используется Custom error responses:
/index.htmlЭто гарантирует корректную работу маршрутов Vite-приложения.
Vite автоматически добавляет hash в имена файлов:
app.8d31c1.js
vendor.3f9a21.js
Это позволяет:
Для CloudFront рекомендуется:
index.htmlCache-Control: no-cache
assets/*Cache-Control: public, max-age=31536000, immutable
Такое разделение обеспечивает:
После деплоя необходимо обновить CDN-кэш:
aws cloudfront create-invalidation \
--distribution-id ABCD1234 \
--paths "/*"
Более оптимально:
--paths "/index.html"
Поскольку хешированные файлы не требуют инвалидции.
Vite использует префикс VITE_:
VITE_API_URL=https://api.example.com
Доступ в коде:
import.meta.env.VITE_API_URL
Особенность:
Типовой pipeline включает:
npm ci
npm run build
aws s3 sync dist/ s3://my-vite-app-prod --delete
aws cloudfront create-invalidation \
--distribution-id $DISTRIBUTION_ID \
--paths "/index.html"
name: Deploy Vite to S3
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run build
- run: aws s3 sync dist/ s3://my-vite-app-prod --delete
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: us-east-1
- run: |
aws cloudfront create-invalidation \
--distribution-id ${{ secrets.CLOUDFRONT_ID }} \
--paths "/index.html"
CloudFront поддерживает автоматическую компрессию, однако важно:
Vite может генерировать:
modulepreload для чанковCloudFront эффективно распределяет такие запросы благодаря HTTP/2 и HTTP/3.
CDN позволяет:
Причины:
baseindex.htmlПричина:
Причина:
Причина:
Access-Control-Allow-Origin
Рекомендуемая схема:
Это исключает прямой доступ к файлам S3.
CloudFront использует:
Дополнительно возможно:
При росте проекта добавляются:
Структура:
s3://app-prod
s3://app-stage
s3://app-dev
или через один bucket с префиксами:
/prod/
/stage/
/dev/
Конфигурация:
vite build --mode production
vite build --mode staging
Файлы:
.env.production
.env.staging
Связка обеспечивает: