Секция output определяет параметры генерации итоговых
файлов Webpack. После обработки графа зависимостей, трансформации
модулей через loaders и оптимизации через plugins, Webpack формирует
один или несколько файлов. Именно output управляет:
Без корректной настройки output сборка может работать
нестабильно: браузер не найдёт чанки, CSS окажется в неверной папке, а
кэширование станет бесполезным.
Базовая структура:
const path = require('path');
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
}
};
output.pathpath задаёт абсолютный путь к каталогу сборки.
Пример:
const path = require('path');
module.exports = {
output: {
path: path.resolve(__dirname, 'dist')
}
};
Webpack требует именно абсолютный путь.
Неправильно:
output: {
path: './dist'
}
Правильно:
output: {
path: path.resolve(__dirname, 'dist')
}
Webpack работает независимо от текущей директории запуска процесса Node.js. Абсолютный путь исключает неоднозначность.
Использование path.resolve() обеспечивает:
output.filenamefilename определяет имя итогового bundle-файла.
Пример:
output: {
filename: 'main.js'
}
Результат:
dist/
└── main.js
Webpack поддерживает placeholders.
[name]Имя entry point.
entry: {
app: './src/app.js',
admin: './src/admin.js'
},
output: {
filename: '[name].js'
}
Результат:
dist/
├── app.js
└── admin.js
[id]Уникальный идентификатор чанка.
filename: '[id].js'
Результат:
dist/
├── 123.js
├── 456.js
└── 789.js
Используется редко, поскольку имена становятся нечитаемыми.
[contenthash]Хеш содержимого файла.
filename: '[name].[contenthash].js'
Результат:
app.a41d91c.js
vendor.b73e2ff.js
Изменение файла меняет хеш.
Это основа эффективного browser cache.
[chunkhash]Хеш конкретного chunk.
filename: '[name].[chunkhash].js'
Используется в старых конфигурациях. В Webpack 5 чаще применяется
contenthash.
[fullhash]Хеш всей сборки.
filename: '[name].[fullhash].js'
При любом изменении проекта меняются все файлы.
Недостаток:
contenthashНаиболее распространённая production-конфигурация:
output: {
filename: '[name].[contenthash].js'
}
Преимущества:
output.cleanWebpack 5 умеет автоматически очищать директорию сборки.
output: {
clean: true
}
Перед новой сборкой каталог dist будет очищен.
Без этого могут накапливаться старые файлы:
dist/
├── app.111.js
├── app.222.js
├── app.333.js
Webpack позволяет создавать вложенные директории.
output: {
filename: 'js/[name].[contenthash].js'
}
Результат:
dist/
└── js/
├── app.js
└── vendor.js
chunkFilenameИспользуется для динамически загружаемых чанков.
output: {
filename: '[name].js',
chunkFilename: '[name].chunk.js'
}
Пример dynamic import:
import('./module');
Результат:
dist/
├── main.js
└── module.chunk.js
filename и chunkFilenamefilenameИспользуется для:
chunkFilenameИспользуется для:
Типичная production-конфигурация:
output: {
filename: 'js/[name].[contenthash].js',
chunkFilename: 'js/[name].[contenthash].chunk.js'
}
publicPathpublicPath определяет базовый URL для загрузки
ресурсов.
Пример:
output: {
publicPath: '/assets/'
}
Если chunk называется:
vendors.js
Webpack будет загружать:
/assets/vendors.js
publicPathБез настройки динамические чанки могут загружаться относительно текущего URL.
Например:
/dashboard/settings
Тогда браузер попытается загрузить:
/dashboard/settings/chunk.js
Вместо:
/assets/chunk.js
publicPathWebpack может работать с CDN.
output: {
publicPath: 'https://cdn.example.com/assets/'
}
Результат:
https://cdn.example.com/assets/app.js
publicPathWebpack 5 поддерживает:
output: {
publicPath: 'auto'
}
Webpack автоматически определяет путь загрузки ресурсов.
Особенно полезно:
assetModuleFilenameWebpack 5 использует Asset Modules вместо многих legacy-loader’ов.
Настройка:
output: {
assetModuleFilename: 'images/[hash][ext][query]'
}
Результат:
dist/
└── images/
├── a12b3.png
└── c44d5.svg
[ext]Расширение файла.
[query]Строка query parameters.
[hash]Хеш файла.
Пример:
output: {
assetModuleFilename: 'assets/[name].[hash][ext]'
}
Результат:
assets/logo.3f1a2.svg
assets/bg.91de2.png
libraryWebpack может собирать библиотеки.
output: {
library: 'MyLibrary'
}
В браузере:
window.MyLibrary
libraryTargetОпределяет формат экспорта библиотеки.
varoutput: {
library: 'MyLib',
libraryTarget: 'var'
}
Результат:
var MyLib = ...
umdUniversal Module Definition.
output: {
libraryTarget: 'umd'
}
Поддерживает:
Наиболее универсальный вариант.
commonjsoutput: {
libraryTarget: 'commonjs'
}
Используется в Node.js.
moduleES Modules.
output: {
module: true
}
И:
experiments: {
outputModule: true
}
globalObjectОпределяет глобальный объект среды.
output: {
globalObject: 'this'
}
Важно для универсальных библиотек.
Иначе в Node.js может отсутствовать window.
sourceMapFilenameУправляет именами source map файлов.
output: {
sourceMapFilename: '[file].map'
}
Результат:
app.js
app.js.map
crossOriginLoadingНастройка crossorigin для chunk loading.
output: {
crossOriginLoading: 'anonymous'
}
Используется при:
scriptTypeТип создаваемых script-тегов.
output: {
scriptType: 'module'
}
Webpack будет генерировать:
<script type="module">
charsetДобавляет charset в script-теги.
output: {
charset: true
}
Результат:
<script charset="utf-8">
environmentПозволяет сообщить Webpack о поддерживаемых возможностях JavaScript.
Пример:
output: {
environment: {
arrowFunction: true,
const: true
}
}
Webpack сможет генерировать более современный код.
Webpack создаёт runtime-код:
Настройка:
optimization: {
runtimeChunk: 'single'
}
Результат:
runtime.js
app.js
vendors.js
Development-конфигурация:
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/'
}
Особенности:
Production-конфигурация:
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].[contenthash].js',
chunkFilename: 'js/[name].[contenthash].chunk.js',
assetModuleFilename: 'assets/[name].[hash][ext]',
publicPath: '/',
clean: true
}
Конфигурация:
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].[contenthash].js',
chunkFilename: 'js/[name].[contenthash].js',
assetModuleFilename: 'assets/[name].[hash][ext]',
clean: true
}
Результат:
dist/
├── js/
│ ├── app.21a1f.js
│ ├── vendor.99d2c.js
│ └── profile.7ab44.js
│
├── assets/
│ ├── logo.12f33.svg
│ ├── hero.9d123.png
│ └── font.ae22f.woff2
│
└── index.html
Неправильно:
path: './dist'
publicPathМожет ломать lazy loading.
[fullhash]Ухудшает кэширование.
Неправильно:
filename: 'bundle.js',
chunkFilename: 'bundle.js'
Возможна перезапись файлов.
cleanВ каталоге остаются старые ассеты.
const path = require('path');
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].[contenthash].js',
chunkFilename: 'js/[name].[contenthash].chunk.js',
assetModuleFilename: 'assets/[name].[hash][ext]',
publicPath: '/',
clean: true
}
};
Такая конфигурация обеспечивает: