четыре основные концепции
Вход
запись - это запись всего конфигурационного файла, нет ни одной.
Есть два типа входа и четыре конфигурации.
Два вида входа
- запись в один файл
- Запись нескольких файлов
Четыре конфигурации
- значение представляет собой строку
- значение является объектом
- значение представляет собой массив
- функция
демонстрация кода
Первая конфигурация (строка) в основном используется в одностраничных приложениях.
const { resolve } = require('path')
module.exports = {
entry:resolve(__dirname,'src/index.js')
}
Вторая конфигурация (объект) в основном используется в многостраничных приложениях.
const { resolve } = require('path')
module.exports = {
entry:{
test:resolve(__dirname,'src/index.js'),
test2:resolve(__dirname,'src/index2.js')
}
}
Третья конфигурация (массив), эта конфигурация может использоваться реже, а также используется в одностраничных приложениях.Эта конфигурация в основном упаковывает 1-n элементов массива в 0 элементов, и иногда используется в js-совместимых, динамических цепочка DLL на
const { resolve } = require('path')
module.exports = {
entry:[resolve(__dirname,'src/index.js'),resolve(__dirname,'src/index2.js')],
}
Четвертая конфигурация (функция), функция должна возвращать только один из трех вышеперечисленных
const { resolve } = require('path')
module.exports = {
entry:()=>'./src/index.js',
}
output
Раз есть вход, значит должен быть и выход! Так же, как и человеку, ему тоже нужно тянуть *, если он хочет есть. Выход здесь, где упакованные вещи будут идти.
Общая конфигурация вывода
- путь (местоположение вывода, каталог dist по умолчанию)
- имя файла (имя выходного файла, по умолчанию основной)
- pulibPath (укажите, куда следует ссылаться на упакованный файл, обычно используется в производственной среде, по умолчанию пусто)
демонстрация кода
const { resolve } = require('path')
module.exports = {
output:{
path:resolve(__dirname,'dist'),
filename:'bundle.js',
publicPath:'http:baidu.com'
}
}
Несколько конфигураций имени файла могут быть записаны напрямую, как указано выше, или могут быть установлены динамически путем добавления хеш-значения к имени файла, например этого
module.exports = {
output:{
filename:'[name]_[hash].js'
}
}
хэш-значение
webpack предоставляет следующие хэши:
- hash
- chunkhash (тот же кусок того же хэша)
- contenthash (один хеш на файл)
module
module.rules — это место конфигурации загрузчика, которое используется для решения проблемы совместимости кода.
Общая конфигурация module.rules
- test (правила сопоставления загрузчика)
- исключить (исключить файлы, которые не должны сопоставляться)
- включить (соответствовать только тем, какие файлы)
- загрузчик (какой загрузчик использовать, одиночный)
- use (какие загрузчики использовать, несколько)
демонстрация кода
module.exports = {
module:{
rules:[
{
test:/\.html$/,
exclude:/node_modelus/,
include:/src/,
loader:'html-loader',
},
{
test:/\.css/,
use:['style-loader','css-loader']
}
]
}
}
Общая конфигурация загрузчика
- загрузчик (какой загрузчик использовать)
- options (параметры передаются загрузчику, параметры опций различаются в зависимости от загрузчика)
демонстрация кода
module.exports = {
module:{
rules:{
test:/\.js$/,
exclude:/node_modelus/,
use:[
// 没参数
'thread-loader',
// 有参数
{
loader:'babel-loader',
options:{
presets:['@babel/preset-env']
}
}
]
}
}
}
plugins
Плагин plugins расположен в позиции, которая является массивом, вставка в большинстве случаев предназначена для оптимизированного кода.
Нет единого использования плагинов, которое варьируется от плагина к плагину. Строго говоря, у них одинаковыеnew xxx
Некоторые часто используемые загрузчики
css связанные
- style-loader (обрабатывает встроенные стили)
- css-loader (обработка файлов .css)
- postcss-loader (обработка совместимости css)
- less-loader (обработка файлов .less)
- sass-loader (обработка файлов .sass/.scss)
let comment = [
"style-loader",
"css-loader",
{
loader:"postcss-loader",
options:{
postcssOptions:{
plugins:['postcss-preset-env']
}
}
}
]
module.exports = {
module:{
rules:[
{
test:/\.css/,
use:[
...comment
]
},
{
test:/\.less$/,
use:[
...comment,
'less-loader'
]
}
]
}
}
связанные с js
- babel-loader
- @babel/core
- @babel/preset-env
- @babel/polyfill
module.exports = {
entry:['@babel/polyfill','./src/index.js']
...
module:{
rules:[
{
test:/\.js$/,
use:[
{
loader:'babel-loader',
options:{
presets:['@babel/preset-env']
// 或者
presets:[['env',{module:false}]]
}
}
]
}
]
}
}
связанный с файлом
- url-loader
- file-loader
- html-loader
module.exports = {
...
module:{
rules:[
{
test:/\.(png|jpg|gif)$/,
use:[
{
loader:file-loader,
options:{
limit:4 *1024,
name:'img/[name]_[hash:10].[ext]'
}
}
]
},
{
test:/\.html$/,
loader:'html-loader'
}
]
}
}
vue связанные
- vue-loader
- vue-style-loader
module.exports = {
...
module:{
rules:[
{
test:/\.vue$/,
loader:'vue-loader'
},
{
test:/\.css$/,
use:[
'vue-style-loader',
'css-loader'
]
}
]
}
}
оптимизация
среда разработки
- HRM (горячая замена)
- webpack-dev-сервер (локальный сервер)
- soure-карта (отладка)
- webpack-bundle-analyzer (представление анализа блоков кода, сгенерированных пакетами)
- size-plugin (отслеживает изменение объема упакованных ресурсов)
- speed-measure-webpack-plugin (анализ затратного по времени загрузчика и упаковки плагинов)
Производственная среда
оптимизация объема
- извлечение css (плагин mini-css-extract)
- css-сжатие (optimize-css-assets-webpack-plugin)
- сжатие html (html-webpack-plugin)
- внешние (за исключением третьих лиц, которые не должны быть упакованы)
- js сжатие (режим производства включается автоматически)
- tree-shake (режим производства включается автоматически (webpack4 ограничен EsModule; webpack5 не ограничен EsModule, CommonJs, отлично))
- code-split ( optimization )
- импорт (ленивая загрузка, предварительная загрузка (предупреждение о предварительной загрузке))
Оптимизация скорости упаковки
- Многопоточная упаковка (thread-loader, happyPack
- Динамическое связывание (DLL)
- кеш бабеля (cache cacheDirectory)
- исключить/исключить (исключить некоторые файлы, которые не нужно компилировать)
- module.noParse (за исключением сторонних библиотек, которые не нужно компилировать загрузчиком)
Уведомление
- Оптимизация Webpack должна смотреть на ситуацию собственного проекта, чтобы найти нужное лекарство, а не использовать его, когда вы видите что-то интересное, в этом случае вы выроете себе яму, а может, и закопаетесь.
разное
- разрешить (как разрешается модуль конфигурации)
- Дополнительные сведения о конфигурации, загрузчике, плагине и т. д. см. в документации самостоятельно.