Суть Читай реальные конфиги сборки и поле package.json, предсказывай поведение bundler-а и выбирай фикс наибольшего рычага для tree-shaking, mode, source map и инлайна env.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min
Проблемы сборки диагностируются в конфиге и манифесте пакета, а не в работающем приложении. Прочитай каждый сниппет, предскажи, что bundler с ним сделает, и выбери фикс, который senior сделает первым.
Цель
Отработай цикл, который ты гоняешь на каждой регрессии сборки: прочитай конфиг, предскажи, где утекают байты или где расходятся dev и prod, и потянись за точным полем — sideEffects, mode, sourcemap, manualChunks, env — которое чинит корень.
Пакет поставляет dist/styles.css, который компоненты импортируют ради стилей, например import "./button.css" в начале Button.js.
Викторина
Completed
Потребитель сообщает, что часть стилей компонентов пропадает в его production-сборке. Что вызывает это значение sideEffects и каков фикс?
Heads-up Флаг применяется к каждому модулю, включая те, что импортируют CSS ради side effect. Заявленный здесь false позволяет bundler-у удалить модуль с импортом CSS.
Heads-up true отключает tree-shaking для всего пакета и тащит мёртвый JS. Точный фикс — перечислить только реально нечистые файлы, вроде '*.css', оставив остальное шейкаемым.
Heads-up Модуль, единственная задача которого — импортировать CSS, — это ровно то, что слишком широкий sideEffects: false позволяет bundler-у удалить; поле и есть корень.
Команда гоняет ровно этот конфиг в CI, чтобы получить артефакт, который деплоит в production.
Викторина
Completed
Задеплоенный бандл ~в 3 раза больше ожидаемого, а React пишет development-предупреждения в проде. Что не так и каков фикс наибольшего рычага?
Heads-up Здесь тумблер не tree-shaking, а mode. Режим development пропускает минификацию и оставляет NODE_ENV=development, поэтому dev-only ветки выживают и бандл остаётся большим.
Heads-up React вырезает свои dev-предупреждения, когда NODE_ENV равен production. Они появляются именно потому, что режим development оставил NODE_ENV в development.
Heads-up devtool управляет source map, не dev/prod код-путями. Фикс — поле mode, которое задаёт минификацию и NODE_ENV.
Прод кидает ошибку, и стек-трейс читается как index-a1b2c3.js:1:88431. Трекер ошибок показывает тот же нечитаемый фрейм.
Викторина
Completed
Нужны читаемые prod-стек-трейсы в трекере ошибок без раскрытия исходника публично. Какая настройка правильная?
Heads-up Без source map минифицированный однострочный фрейм нельзя сопоставить с Button.tsx:42; каждая prod-ошибка остаётся нечитаемой. Генерируй карту, просто не публикуй её.
Heads-up true эмитит sourceMappingURL в публичный бандл, раскрывая исходник всякому с devtools. 'hidden' даёт трекеру карту, не публикуя её.
Heads-up Source map — это только метаданные для отладки; они никогда не меняют, как код исполняется. Они влияют лишь на читаемость трейса.
Ревьюер также замечает, что клиентский компонент читает process.env.API_SECRET, чтобы вызвать внутренний API.
Викторина
Completed
Какое утверждение об этом конфиге верно?
Heads-up Vite статически инлайнит упомянутые значения env в клиентский бандл во время сборки. Секрет, прочитанный в клиентском коде, запекается в поставляемый JS — реальная утечка.
Heads-up Деление vendor с кодом приложения ломает кэш vendor при каждом деплое. Изоляция react/react-dom в стабильный vendor-чанк — правильный ход.
Heads-up Инлайн во время сборки копирует значение env в выходной бандл независимо от его происхождения. Только серверный код может читать секреты.
Итог
Каждая регрессия сборки читается в конфиге: sideEffects: false должен перечислять реально нечистые файлы (вроде CSS), иначе bundler их выкинет; production надо собирать в режиме production, чтобы запустились минификация и dead-code-elimination веток под NODE_ENV; source map место в режиме ‘hidden’, чтобы трекер ошибок получил читаемость без публичного раскрытия; vendor заслуживает свой manualChunks-чанк ради стабильности кэша; а любое значение env, упомянутое в клиентском коде, инлайнится во время сборки, поэтому секреты не должны касаться клиента. Прочитай поле, предскажи вывод, почини корень.