Механизм сборки в Webpack предполагает генерацию артефактов в
заданную выходную директорию, чаще всего dist. При
повторных сборках без удаления старого содержимого возникают ситуации
накопления устаревших файлов, что приводит к рассинхронизации состояния
файловой системы и фактического результата сборки. Особенно это критично
при изменении имен файлов с хешами, удалении точек входа и рефакторинге
модульной структуры.
Очистка выходной директории решает задачу синхронизации: каждая новая сборка должна отражать актуальное состояние графа модулей, без следов предыдущих итераций.
При стандартной конфигурации Webpack:
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
},
};
каждая сборка может порождать новый набор файлов, при этом старые версии остаются в директории. Это приводит к следующим эффектам:
Начиная с Webpack 5 встроен механизм автоматической очистки
директории через параметр output.clean.
const path = require('path');
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
clean: true,
},
};
При установке clean: true Webpack перед генерацией новых
ассетов удаляет содержимое выходной директории, относящееся к текущей
сборке.
Очистка выполняется с учетом следующих принципов:
output.path;Параметр clean поддерживает объектную форму
конфигурации, позволяющую управлять исключениями.
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
clean: {
keep: /static/,
},
},
};
Опция keep определяет файлы или директории, которые не
должны удаляться:
Примеры использования:
clean: {
keep: ['favicon.ico', 'static'],
}
или
clean: {
keep: (asset) => asset.includes('legacy'),
}
Это позволяет сохранять:
До Webpack 5 очистка выполнялась через
CleanWebpackPlugin:
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
plugins: [new CleanWebpackPlugin()],
};
Плагин предоставлял расширенные возможности:
Встроенный output.clean:
CleanWebpackPlugin:
В большинстве современных конфигураций встроенный механизм считается достаточным.
В режиме разработки частая пересборка может приводить к:
В некоторых случаях очистка отключается:
module.exports = {
output: {
clean: false,
},
};
или управляется условно:
clean: process.env.NODE_ENV === 'production',
В production очистка критична для обеспечения:
Использование [contenthash] приводит к генерации
уникальных имен при изменении содержимого:
filename: '[name].[contenthash].js'
Без очистки директории возникают ситуации:
dist.Очистка решает задачу атомарности сборки: результат всегда представляет полный актуальный снимок.
При использовании массива конфигураций:
module.exports = [
{
name: 'client',
output: {
path: path.resolve(__dirname, 'dist/client'),
clean: true,
},
},
{
name: 'server',
output: {
path: path.resolve(__dirname, 'dist/server'),
clean: true,
},
},
];
очистка выполняется независимо для каждой конфигурации. Это важно при разделении:
В режиме watch очистка выполняется иначе, чем в полной
сборке:
Это снижает нагрузку на файловую систему, но требует аккуратности при логике генерации файлов вне Webpack.
При использовании HtmlWebpackPlugin:
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
],
output: {
clean: true,
},
};
очистка директории обеспечивает согласованность:
При неправильной организации структуры возможно удаление файлов,
добавленных сторонними процессами, если они находятся внутри
output.path.
Типичный риск:
dist;clean: true удаляет их перед новой
сборкой.При параллельных сборках:
В системах непрерывной интеграции очистка используется как гарант детерминированности:
Часто применяется комбинация:
clean: true;dist.Механизм очистки ограничен output.path, что снижает риск
удаления файлов вне области ответственности сборщика. Однако
конфигурационные ошибки могут привести к:
Поэтому важным свойством является строгая изоляция выходной директории сборки от исходного кода и вспомогательных ресурсов.
При неуспешной сборке:
В некоторых инфраструктурах используется стратегия:
dist.Подход с промежуточной директорией:
output: {
path: path.resolve(__dirname, 'build-temp'),
clean: true,
}
После успешной сборки:
dist;Это снижает риск простоя при частично успешных сборках.
Операция очистки зависит от:
При больших проектах с тысячами ассетов очистка может стать заметной частью времени сборки, что иногда требует:
clean в dev;