CopyWebpackPlugin предназначен для переноса файлов и каталогов из исходных директорий проекта в итоговую сборку Webpack без их трансформации. Плагин работает на уровне ассетов сборки и выполняет копирование до финальной эмиссии файлов, обеспечивая перенос изображений, шрифтов, JSON, статических HTML-фрагментов и любых других ресурсов, не требующих обработки загрузчиками.
В системе Webpack обработка ресурсов делится на два основных механизма:
CopyWebpackPlugin относится ко второй категории и действует на этапе генерации ассетов, когда граф модулей уже построен.
Основная задача плагина:
npm install copy-webpack-plugin --save-dev
Подключение в конфигурации Webpack:
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
plugins: [
new CopyWebpackPlugin({
patterns: []
})
]
};
Конфигурация плагина строится вокруг массива patterns,
где каждый элемент описывает правило копирования.
new CopyWebpackPlugin({
patterns: [
{
from: 'public',
to: 'dist'
}
]
});
Типовой сценарий — перенос папки public в выходной
каталог сборки:
new CopyWebpackPlugin({
patterns: [
{
from: 'public',
to: ''
}
]
});
Поведение:
Плагин поддерживает glob-выражения через
globOptions.
new CopyWebpackPlugin({
patterns: [
{
from: 'assets/**/*',
globOptions: {
ignore: ['**/*.psd']
}
}
]
});
Основные возможности:
**/* — рекурсивное копирование* — файлы одного уровняignore — исключение файловФункция filter позволяет динамически исключать
файлы:
new CopyWebpackPlugin({
patterns: [
{
from: 'assets',
filter: (resourcePath) => {
return !resourcePath.endsWith('.map');
}
}
]
});
Механика:
true или falseПараметр to поддерживает функции для динамического
формирования пути:
new CopyWebpackPlugin({
patterns: [
{
from: 'images',
to: ({ context, absoluteFilename }) => {
return 'static/images/' + absoluteFilename.split('/').pop();
}
}
]
});
Возможности:
context определяет базовую папку для относительных
путей:
new CopyWebpackPlugin({
patterns: [
{
from: 'src/assets',
context: 'src',
to: 'assets'
}
]
});
Поведение:
Опция noErrorOnMissing предотвращает падение сборки:
new CopyWebpackPlugin({
patterns: [
{
from: 'optional-assets',
noErrorOnMissing: true
}
]
});
Используется при:
Плагин работает не только с директориями:
new CopyWebpackPlugin({
patterns: [
{
from: 'config/config.json',
to: 'config.json'
}
]
});
Особенности:
Часто используется совместно с HTML-генерацией, где статические файлы должны присутствовать в output:
Пример:
new CopyWebpackPlugin({
patterns: [
{ from: 'public/favicon.ico' },
{ from: 'public/robots.txt' },
{ from: 'public/manifest.json' }
]
});
Ключевые механизмы оптимизации:
ignorefilterПример оптимизированной конфигурации:
new CopyWebpackPlugin({
patterns: [
{
from: 'assets',
globOptions: {
ignore: ['**/*.md', '**/*.psd', '**/raw/**']
}
}
]
});
В production-режиме CopyWebpackPlugin часто выполняет роль финального шага подготовки:
При этом важно учитывать:
CopyWebpackPlugin не заменяет загрузчики:
Сравнение:
В монорепозиториях плагин применяется для:
Пример:
new CopyWebpackPlugin({
patterns: [
{
from: '../. ./shared/assets',
to: 'assets'
}
]
});
public директорииВ режиме watch:
При incremental build:
В Webpack 5 плагин работает через modern hooks compilation API:
Структура конфигурации остаётся прежней, но внутренняя реализация оптимизирована под новую архитектуру сборщика.