Как настраивать деплой?
Что проверяют
Представляете ли вы путь кода от мёржа до браузера пользователя и что в нём специфично для фронтенда. Следом обычно спрашивают, как откатить неудачный релиз и как устроены переменные окружения в собранном бандле.
Как отвечать
Опишите конвейер по шагам и назовите инструменты, с которыми работали:
- триггер: пуш в основную ветку или тег запускает пайплайн в GitHub Actions или GitLab CI;
- установка:
npm ciстрого по lock-файлу, кэш зависимостей между прогонами; - проверки: линтер,
tsc --noEmit, юнит-тесты. Красная проверка останавливает деплой; - сборка:
npm run buildдаёт статику с хэшами в именах файлов, а для SSR на Next.js или Nuxt собирается Docker-образ с Node; - доставка: статика уезжает в объектное хранилище за CDN, образ в registry и дальше на сервер или в Kubernetes. Для SPA на Nginx нужен
try_files $uri /index.html, иначе прямая ссылка на внутренний роут отдаст 404.
Дальше то, что выдаёт опыт именно во фронтенде:
- кэширование: файлы с хэшем отдаются с
Cache-Control: max-age=31536000, immutable, аindex.htmlсno-cache. Иначе часть пользователей неделю видит старую версию; - переменные окружения:
VITE_*иNEXT_PUBLIC_*вшиваются в бандл при сборке. Без пересборки их не сменить, поэтому собирают артефакт на каждую среду или отдают конфиг с сервера во время работы; - откат: прошлые артефакты и теги образов хранятся, и откат сводится к переключению на предыдущую версию, а не к срочной сборке;
- превью: отдельный стенд на каждый pull request, чтобы тестировщик и дизайнер смотрели изменения до мёржа;
- source maps: уезжают в Sentry, а не лежат публично рядом со сборкой.
Где спотыкаются
Удаляют чанки прошлой версии сразу после выкладки. У пользователей с открытой вкладкой ленивый импорт падает с ChunkLoadError, пока они не обновят страницу.
Кладут секрет в переменную NEXT_PUBLIC_ или VITE_ и считают его спрятанным. Всё, что попало в клиентский бандл, видно любому в DevTools.
Рассказывают про Kubernetes и blue-green, но не могут объяснить, что происходит с кэшем браузера после релиза. Для фронтенда это первый вопрос, а не последний.