Интервью-вопрос
Что используешь для сборки проекта
Отвечайте не списком названий, а через ваш рабочий стек, причину выбора и проверку production build. Так вы показываете, что умеете не только запустить dev server, но и довести фронтенд до безопасного релиза.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 60 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
Не отвечайте на этот вопрос как на проверку памяти по инструментам. Покажите практический выбор. Назовите сборщик, объясните, почему он подходит проекту, и расскажите, как вы проверяете результат перед релизом.
Хорошая короткая формула:
В текущем проекте я использую Vite с TypeScript. В разработке он дает быстрый dev server и HMR. Перед релизом я проверяю build, code splitting, размер чанков, env vars и работу собранной версии через preview или CI. Если проект legacy или с тяжелой кастомной конфигурацией, я бы оставил Webpack и сначала оптимизировал его, а не мигрировал ради названия.
Замените Vite, Webpack, Next.js или другой инструмент на ваш реальный стек. Если вы не настраивали сборку с нуля, скажите честно. Например, вы работали с готовой конфигурацией, но понимаете важные части и знаете, что проверять при изменениях.
Как выбрать, что назвать в ответе
Как выбрать инструмент в ответе
Можно начать с Vite или официального сборщика фреймворка. Так вы получите быстрый dev server и понятный production build.Не переписывайте сборку только ради моды. Сначала оцените плагины, loaders, alias, legacy-код и стоимость миграции.Смотрите на сборку фреймворка, например Next.js, Nuxt или SvelteKit. Не собирайте эти части вручную без причины.Часто подходят Rollup, Vite library mode или tsup. Проверьте форматы ESM/CJS и внешние peer dependencies.Проверьте browserslist, transpilation и polyfills. Один современный bundler не гарантирует совместимость сам по себе.Самый сильный ответ привязан к ограничениям проекта. Для нового SPA часто уместен Vite. Для приложения на Next.js или Nuxt лучше говорить про сборку фреймворка, потому что там уже есть routing, SSR или SSG, обработка изображений и серверные части. Для старого enterprise-проекта Webpack может быть разумным выбором, если на нем держатся alias, loaders, Module Federation или кастомная обработка assets.
Не говорите, что один инструмент всегда лучше. На практике вы выбираете не только скорость. Важны совместимость, знания команды, стоимость миграции, интеграция с тестами, CI, monorepo и требования к браузерам.
Что входит в сборку, кроме bundler
Bundler это только часть процесса. В реальном frontend-проекте рядом обычно есть TypeScript, ESLint, formatter, тесты, обработка CSS, изображений и шрифтов, переменные окружения, source maps, анализ размера бандла и CI.
Пример нормальной структуры scripts для Vite-проекта:
{
"scripts": {
"dev": "vite",
"lint": "eslint .",
"typecheck": "tsc --noEmit",
"build": "vite build",
"preview": "vite preview"
}
}Это не единственно правильный вариант. Главное, чтобы проверки были явными. Если vite build транспилирует TypeScript, это еще не значит, что он сделал полноценный typecheck. Поэтому в CI часто запускают lint, typecheck, тесты и build отдельными шагами.
Production build и основные риски
Что проверить перед релизом
analyzeПроверьте initial chunk и тяжелые зависимости. Иначе пользователь получит медленную первую загрузку.
content hashИмена файлов должны меняться при изменении содержимого. Без этого браузер или CDN могут отдать старый JS.
controlledОни полезны для Sentry и отладки. При этом их не всегда стоит свободно отдавать публично. Решение зависит от политики проекта.
fallback/errorПроверьте загрузку динамических импортов. После релиза старый HTML может запросить уже удаленный chunk и показать белый экран без error UI.
public onlyКлиентский бандл виден пользователю. Секреты должны оставаться на сервере или в CI, а не в frontend-коде.
fonts/images/cssПроверьте пути, preload, сжатие и загрузку шрифтов. Ошибка здесь часто выглядит как сломанная верстка после деплоя.
В dev-режиме сборщик помогает быстро писать код. В production-режиме он меняет код. Минифицирует, делит на чанки, подставляет env vars, добавляет hash к файлам, обрабатывает CSS и assets. Поэтому фраза про то, что локально все работает, не закрывает риск релиза.
На интервью хорошо звучат конкретные проверки. Собранная версия открывается через preview. Ленивые маршруты загружаются. При ошибке загрузки chunk есть понятный fallback. Картинки и шрифты не теряются. Source maps настроены осознанно. Размер initial bundle не вырос случайно. Переменные окружения не содержат секретов.
Code splitting и оптимизация
Code splitting нужен не ради галочки. Он помогает загрузить меньше кода при первом открытии, если разделение совпадает с реальным поведением пользователя. Частый безопасный старт, делить большие маршруты и тяжелые фичи.
Пример для React:
import { lazy, Suspense } from "react";
const AdminPage = lazy(() => import("./pages/AdminPage"));
function HomePage() {
return <main>Главная</main>;
}
export function App({ section }: { section: "home" | "admin" }) {
if (section === "admin") {
return (
<Suspense fallback={<div role="status">Загружаем раздел...</div>}>
<AdminPage />
</Suspense>
);
}
return <HomePage />;
}Это полезно, если admin-раздел нужен не всем пользователям. Fallback нужен не только для красоты. Без него пользователь увидит пустое место, пока браузер скачивает chunk. Для реального маршрута добавьте error boundary или понятный reload-сценарий, потому что после деплоя старый клиент может запросить уже удаленный файл.
Если разделить каждый маленький компонент, можно получить много запросов и плохой UX. После настройки смотрите analyzer и network waterfall, а не только размер одного файла.
Как связать сборку с CI/CD
- 1Установить зависимости по lockfile
- 2Запустить lint, typecheck и тесты отдельными шагами
- 3Собрать production build с нужными env vars
- 4Сохранить артефакты или задеплоить из одной и той же сборки
- 5Проверить preview или smoke-тесты после деплоя
- 1Собирать на локальной машине без повторяемого окружения
- 2Игнорировать lockfile и получать разные версии пакетов
- 3Проверять только dev server
- 4Деплоить без проверки env vars и путей к assets
- 5Скрывать source map ошибки вместо нормальной диагностики
CI/CD не заменяет сборщик, но делает сборку повторяемой. Хороший ответ звучит так. Вы не полагаетесь на локальную машину, а собираете проект в одинаковом окружении, по lockfile и с нужными env vars. Это снижает риск, что у вас в node_modules одна версия пакета, а на сервере другая.
Если у вас нет большого опыта с CI, не выдумывайте. Можно сказать честно. Вы не писали pipeline с нуля, но работали с ним как пользователь. Вы понимаете шаги install, lint, typecheck, test, build, deploy и знаете, какие ошибки frontend-сборки там чаще возникают.
Что сказать, если опыт был только с готовой конфигурацией
Не изображайте человека, который писал сложный Webpack config с нуля, если это не ваш опыт. Лучше покажите осознанность в своей зоне ответственности.
Если вы работали с готовым Vite или Next.js проектом, можно ответить так:
С нуля сборщик я не писал, но регулярно работал с его настройками. Это scripts, env vars, alias, preview, source maps и production build. Когда менял зависимости или добавлял lazy loading, проверял размер бандла и поведение собранной версии.
Такой ответ звучит честнее, чем попытка перечислить loaders и plugins, которые вы не трогали. На интервью вас могут попросить объяснить конкретный config. Лучше заранее отделить личный опыт от теории.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Просто перечисляете инструменты
Список вроде Vite, Webpack, Babel, Docker звучит слабо, если вы не объясняете, где и зачем это использовали. Лучше назовите один основной стек и свяжите его с задачей проекта. Это может быть скорость разработки, SSR, legacy-код, размер бандла или CI.
- 2
Путать dev server и production build
Dev server может успешно отдавать модули, но production build может упасть на tree shaking, env vars, путях к assets или lazy chunks. На интервью прямо скажите, что проверяете собранную версию через
buildиpreview. - 3
Считать tree shaking магией
Tree shaking не обязан удалить все лишнее. Особенно если пакет использует CommonJS или имеет неочевидные side effects. Без analyzer легко оставить большой бандл и ухудшить first load.
- 4
Класть секреты в клиентские env vars
Все, что попало в JS-бандл, можно увидеть в браузере. API keys без ограничений, tokens и приватные настройки держите на сервере или в защищенном CI. Не кладите их в
VITE_*или похожие публичные переменные. - 5
Не проверять ошибку загрузки lazy chunk
После деплоя у пользователя может остаться старый HTML, который ссылается на уже удаленный chunk. Без error boundary или понятного reload-сценария это выглядит как белый экран, хотя dev server работал идеально.
- 6
Дробить код слишком мелко
Code splitting помогает уменьшить initial bundle, но слишком много мелких чанков добавляет запросы и усложняет загрузку. Лучше разделяйте код по маршрутам и тяжелым сценариям. Потом смотрите реальные метрики и waterfall.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми интервьюер проверяет понимание сборки, оптимизации и релиза frontend-проекта.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое git stash 😎
Git stash временно сохраняет незакоммиченные изменения локально, чтобы можно было переключиться на другую задачу без лишнего коммита. Разбираем, что он сохраняет, чем apply отличается от pop и где легко потерять контекст.
Что такое Conventional Commits 😎
Conventional Commits задают единый формат сообщений коммитов. Вы разберете структуру сообщения, связь с SemVer и ошибки, из-за которых история Git перестает помогать команде.