В конфигурации Webpack управление тем, какие файлы обрабатываются загрузчиками (loaders), является одним из ключевых механизмов оптимизации сборки. Даже простая цепочка загрузчиков может существенно замедлить сборку, если она применяется ко всему дереву зависимостей без ограничений. Именно поэтому используются фильтры области применения: include, exclude и более современный механизм resource (resourceQuery, resourceFragment).
Эти параметры позволяют точно определить, к каким файлам применять конкретный loader, исключая лишнюю работу и повышая предсказуемость сборки.
Каждое правило module.rules в Webpack содержит
описание:
test)use)include,
exclude, resource)На уровне механизма Webpack каждое правило проходит проверку: подходит ли ресурс под условия. Если условия совпадают — loader применяется, если нет — правило игнорируется.
Параметр include задаёт список директорий или файлов, которые должны обрабатываться данным loader’ом. Всё, что не входит в указанный диапазон, игнорируется.
Это наиболее часто используемый способ ускорения сборки.
Webpack проверяет путь файла:
module.exports = {
module: {
rules: [
{
test: /\.js$/,
include: path.resolve(__dirname, 'src'),
use: 'babel-loader'
}
]
}
};
В данном случае babel-loader применяется только к файлам
внутри src, исключая node_modules, тестовые
директории и любые сторонние зависимости.
Основная задача:
Особенно важно при использовании:
babel-loaderts-loadereslint-loader (устаревший)sass-loaderМожно указывать массив путей:
include: [
path.resolve(__dirname, 'src'),
path.resolve(__dirname, 'shared')
]
Webpack будет обрабатывать файлы, которые находятся хотя бы в одной из директорий.
Параметр exclude работает противоположно include: он
запрещает обработку файлов, даже если они подходят под
test.
При конфликте:
Если файл совпадает с exclude — loader не применяется, независимо от include.
module.exports = {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
}
};
Здесь исключаются все зависимости из node_modules, что
является стандартной практикой.
Используется для:
node_modulesdist,
build)Оба параметра могут использоваться вместе, но логика следующая:
include — задаёт белый списокexclude — задаёт чёрный списокНа практике предпочтительнее:
{
test: /\.ts$/,
include: path.resolve(__dirname, 'src'),
exclude: /node_modules/,
use: 'ts-loader'
}
Здесь:
srcnode_modulesПараметр resource (и связанные с ним
resourceQuery, resourceFragment) позволяет
задавать условия на уровне самого ресурса, а не только пути.
Это более современный и гибкий механизм, который используется в сложных конфигурациях.
resource задаёт фильтрацию по абсолютному пути
файла.
module.exports = {
module: {
rules: [
{
resource: {
test: /\.css$/
},
use: ['style-loader', 'css-loader']
}
]
}
};
В этом случае правило применяется только к ресурсам, удовлетворяющим
условию внутри resource.test.
Классический вариант:
{
test: /\.css$/,
use: 'css-loader'
}
Эквивалент через resource:
{
resource: {
test: /\.css$/
},
use: 'css-loader'
}
Однако resource позволяет комбинировать более сложные
условия, включая дополнительные параметры.
Webpack позволяет импортировать ресурсы с query-параметрами:
import styles from './button.css?inline';
resourceQuery позволяет реагировать на такие случаи.
{
resourceQuery: /inline/,
type: 'asset/source'
}
Теперь правило применяется только если импорт содержит
?inline.
Используется для:
Webpack также поддерживает #hash-часть импортов:
import icon from './sprite.svg#icon-user';
{
resourceFragment: /icon-user/,
type: 'asset/resource'
}
Позволяет выбирать поведение в зависимости от фрагмента ресурса.
На практике resource редко используется изолированно. Он
комбинируется с:
issuer (откуда импортирован файл)includeexclude{
test: /\.svg$/,
issuer: /\.js$/,
resourceQuery: /component/,
use: ['svgr-loader']
}
Здесь loader применяется только если:
.svg?componentWebpack оценивает условия последовательно:
resource (если задан)testincludeexcludeЕсли хотя бы одно условие не проходит — loader не применяется.
Правильное использование include/exclude/resource напрямую влияет на:
Наиболее критичный фактор — ограничение Babel/TypeScript трансформаций только исходным кодом.
{
test: /\.js$/,
use: 'babel-loader'
}
Без ограничения loader будет применяться ко всему проекту, включая зависимости, что резко замедляет сборку.
include: path.resolve(__dirname)
Такой подход включает даже node_modules, что часто
приводит к ненужной обработке.
Если включены оба параметра без понимания приоритетов, возможны ситуации, когда правило не срабатывает вовсе или срабатывает частично.
Условия применения loaders являются частью архитектуры сборочного процесса. Они определяют:
Правильно настроенные include/exclude/resource позволяют превратить Webpack из «глобального обработчика» в систему точечных правил, работающих только там, где это действительно необходимо.