usedExports в Webpack отвечает за статический анализ модулей и пометку реально используемых экспортов, формируя основу для tree shaking, тогда как минимизатор выполняет финальную стадию удаления неиспользуемого кода на уровне AST. Их взаимодействие определяет, насколько эффективно будет сжат итоговый бандл и насколько глубоко Webpack сможет устранить мертвый код до и после оптимизации.
Флаг optimization.usedExports включает анализ экспортов
каждого модуля. На этапе построения графа зависимостей Webpack:
В результирующем коде такие экспорты могут получать специальные комментарии:
/* unused harmony export foo */
или полностью исключаться при оптимизации связки модулей (scope hoisting / module concatenation).
Ключевая особенность заключается в том, что usedExports
сам по себе не удаляет код. Он только маркирует его, создавая сигналы
для последующих стадий оптимизации.
Минимизатор, включаемый через optimization.minimize,
выполняет работу на уровне синтаксического дерева (AST). В типичном
сценарии используется TerserPlugin, который:
В отличие от usedExports, минимизатор не опирается
только на граф модулей. Он анализирует конкретные выражения и их
побочные эффекты внутри уже сгенерированного чанка.
Эффективность tree shaking в Webpack определяется тем, как эти два механизма дополняют друг друга.
usedExports работает на уровне модулей:
Это создаёт структуру для дальнейшего удаления.
Минимизатор работает после генерации бандла:
Таким образом, usedExports подготавливает почву, а
минимизатор завершает процесс.
При включённых обоих механизмах происходит двухуровневое устранение мёртвого кода:
Без usedExports минимизатору приходится работать с более
«шумным» кодом, где сложнее определить, какие части действительно можно
удалить.
ESM (ES Modules) играет ключевую роль, так как его статическая структура позволяет Webpack точно анализировать зависимости.
При включённом usedExports:
Однако при использовании CommonJS:
usedExports работает менее точноХотя sideEffects формально является отдельной
настройкой, она напрямую влияет на взаимодействие
usedExports и minimizer.
sideEffects: false позволяет безопасно удалять целые
модулиtrue или списке файлов Webpack сохраняет модули
даже при отсутствии используемых экспортовВ результате:
usedExports может пометить экспорт как
неиспользуемыйВнутренний pipeline Webpack при production-сборке выглядит следующим образом:
usedExportsВажно, что minimizer всегда работает после того, как Webpack уже
применил свои внутренние оптимизации на основе
usedExports.
При использовании конструкций вида:
export { a } from './moduleA';
export { b } from './moduleB';
usedExports может корректно определить использование
только при полной цепочке импортов. Если цепочка разрывается,
минимизатор не всегда способен восстановить семантику и может сохранить
лишний код.
export const x = Math.random();
Даже если x не используется, минимизатор не удалит его
без подтверждения отсутствия side effects, так как вычисление происходит
при загрузке модуля.
Минимизатор учитывает специальные комментарии:
const x = /*#__PURE__*/ createExpensiveObject();
Если usedExports пометил вызов как неиспользуемый,
minimizer может полностью удалить выражение благодаря pure hint.
При включении:
optimization: {
usedExports: true,
minimize: true
}
происходит существенное изменение структуры бандла:
Без usedExports:
usedExports и minimizer принципиально различаются по
уровню абстракции:
usedExports работает на уровне модулей и графа
зависимостейИх совместная работа формирует двухслойную систему оптимизации, где:
Именно эта связка определяет эффективность tree shaking в современных сборках Webpack.