До появления Webpack 5 основным механизмом ускорения повторных сборок
был cache-loader, а также внутренний in-memory cache. Эти
подходы работали ограниченно:
Webpack 5 представил полноценную файловую систему кэширования —
filesystem cache. Результаты обработки модулей,
зависимостей, loader-цепочек и промежуточных вычислений сохраняются на
диск и могут использоваться между перезапусками сборщика.
Главная цель механизма — резко сократить время повторных сборок.
Кэширование включается через секцию cache.
module.exports = {
cache: {
type: 'filesystem'
}
};
После активации Webpack начинает сохранять кэшированные данные в специальную директорию.
По умолчанию каталог располагается внутри:
node_modules/.cache/webpack
Filesystem cache сохраняет:
Повторная сборка использует уже готовые результаты вместо повторного вычисления.
cache: {
type: 'memory'
}
Особенности:
cache: {
type: 'filesystem'
}
Особенности:
Webpack должен понимать, когда кэш становится невалидным.
Для этого анализируются:
Если изменяется что-либо значимое — кэш пересоздаётся.
Webpack отслеживает файлы, влияющие на сборку.
Обычно сюда добавляют webpack-конфиг:
module.exports = {
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename]
}
}
};
Теперь изменение webpack.config.js автоматически
инвалидирует кэш.
Без корректного списка зависимостей возможно:
Особенно критично это для:
На крупных проектах filesystem cache даёт максимальный эффект.
Типичные источники замедления:
Без кэша повторные сборки могут занимать десятки секунд.
С filesystem cache:
Каталог хранения можно изменить.
const path = require('path');
module.exports = {
cache: {
type: 'filesystem',
cacheDirectory: path.resolve(__dirname, '.temp_cache')
}
};
Это полезно:
Внутри директории создаются:
.cache/
└── webpack/
├── default-development/
├── default-production/
└── index.pack
Webpack хранит:
Опция name позволяет разделять кэши.
module.exports = {
cache: {
type: 'filesystem',
name: 'client-cache'
}
};
Полезно при:
module.exports = [
{
name: 'client',
cache: {
type: 'filesystem',
name: 'client'
}
},
{
name: 'server',
cache: {
type: 'filesystem',
name: 'server'
}
}
];
Без разделения возможны конфликты кэша.
Позволяет вручную инвалидировать кэш.
module.exports = {
cache: {
type: 'filesystem',
version: '1.0.0'
}
};
После изменения версии Webpack создаст новый кэш.
Практические сценарии:
Пример:
version: process.env.BUILD_VERSION
Webpack умеет сжимать кэш.
module.exports = {
cache: {
type: 'filesystem',
compression: 'gzip'
}
};
Варианты:
false'gzip'Плюсы:
Минусы:
Плюсы:
Минусы:
Позволяет полностью переопределить путь.
const path = require('path');
module.exports = {
cache: {
type: 'filesystem',
cacheLocation: path.resolve(
__dirname,
'.webpack-cache'
)
}
};
Разница:
cacheDirectory — базовая директория;cacheLocation — полный путь.Определяет формат хранения.
module.exports = {
cache: {
type: 'filesystem',
store: 'pack'
}
};
Основной режим:
pack
Webpack объединяет множество данных в pack-файлы.
Filesystem cache тесно связан с системой snapshots.
Snapshot — снимок состояния файловой системы.
Webpack отслеживает:
Некоторые директории считаются управляемыми package manager.
module.exports = {
snapshot: {
managedPaths: [
/node_modules/
]
}
};
Webpack предполагает, что содержимое редко меняется.
Это ускоряет проверки.
Полностью неизменяемые директории.
module.exports = {
snapshot: {
immutablePaths: [
/cache/
]
}
};
Webpack практически перестаёт проверять такие пути.
Hot Module Replacement и filesystem cache работают совместно.
Кэш:
Но HMR всё равно пересобирает изменённые модули.
Webpack 5 способен заменить cache-loader.
Пример:
module.exports = {
cache: {
type: 'filesystem'
},
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader'
}
}
]
}
};
Дополнительный cache-loader обычно больше не нужен.
У babel-loader существует собственный кэш:
{
loader: 'babel-loader',
options: {
cacheDirectory: true
}
}
Теперь возникает два уровня кэширования:
Обычно:
Webpack filesystem cache достаточно
Но возможны сценарии комбинирования:
Filesystem cache особенно полезен вместе с:
ts-loaderbabel-loader + preset-typescriptfork-ts-checker-webpack-pluginПример:
module.exports = {
cache: {
type: 'filesystem'
},
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader'
}
]
}
};
Генерация source maps — одна из самых дорогих операций.
Filesystem cache помогает избежать повторной генерации.
Особенно эффективно с:
devtool: 'source-map'
или
devtool: 'cheap-module-source-map'
Иногда требуется ручное удаление.
Типичный путь:
node_modules/.cache/webpack
Linux/macOS:
rm -rf node_modules/.cache/webpack
Windows PowerShell:
Remove-Item node_modules/.cache/webpack -Recurse -Force
Возможные проблемы:
Типичные симптомы:
Часто помогает полная очистка cache directory.
Webpack умеет откладывать запись кэша.
module.exports = {
cache: {
type: 'filesystem',
idleTimeout: 60000
}
};
Значение указывается в миллисекундах.
Отдельный timeout для первой записи.
module.exports = {
cache: {
type: 'filesystem',
idleTimeoutForInitialStore: 0
}
};
Полезно для CI и production builds.
Позволяет освобождать память после сериализации.
module.exports = {
cache: {
type: 'filesystem',
allowCollectingMemory: true
}
};
Актуально для:
Контролирует количество поколений memory cache.
module.exports = {
cache: {
type: 'filesystem',
maxMemoryGenerations: 10
}
};
Балансирует:
Наиболее распространённый режим:
module.exports = {
mode: 'development',
cache: {
type: 'filesystem'
}
};
Преимущества:
Использование в production также оправдано.
Особенно:
По умолчанию CI обычно пересоздаёт окружение.
Для реальной выгоды нужно:
.cache;Пример путей:
node_modules/.cache/webpack
или кастомный cacheLocation.
Изменение lockfile часто должно инвалидировать кэш.
Например:
const path = require('path');
module.exports = {
cache: {
type: 'filesystem',
buildDependencies: {
config: [
__filename,
path.resolve(__dirname, 'package-lock.json')
]
}
}
};
В monorepo возникают дополнительные сложности:
Часто используют:
cache: {
type: 'filesystem',
name: 'frontend-app'
}
На практике ускорение может достигать:
| Тип проекта | Ускорение |
|---|---|
| Небольшой SPA | 1.5–2x |
| React + Babel | 3–5x |
| TypeScript monorepo | 5–10x |
| Большой enterprise build | 10x+ |
Эффект зависит от:
Механизм почти не помогает:
Большинство современных plugins поддерживают filesystem cache корректно.
Но проблемы возможны со старыми plugins:
Для диагностики можно включить инфраструктурное логирование.
module.exports = {
infrastructureLogging: {
level: 'verbose'
}
};
Webpack начнёт выводить:
const path = require('path');
module.exports = {
mode: 'production',
cache: {
type: 'filesystem',
name: 'production-cache',
cacheDirectory: path.resolve(
__dirname,
'.webpack-cache'
),
buildDependencies: {
config: [
__filename,
path.resolve(__dirname, 'package-lock.json')
]
},
compression: 'gzip',
allowCollectingMemory: true,
maxMemoryGenerations: 10
}
};
cache: {
type: 'filesystem'
}
Обычно этого достаточно.
Рекомендуется:
name;Желательно:
Важно: