предисловие
Я давно не занимался накоплением и изучением, и контент, который я недавно изучил, будет обновляться один за другим.
Webpack
Я должен написать серию, начиная сПредварительное исследование => углубленное изучение => фактический бой.
Сфокусируйся на"Привет ФЕ"Получайте более понятный контент.
Context
Webpack
При поиске относительного пути он начинается сcontext
поиск корневого каталога,context
Значение по умолчаниюWebpack
Путь запуска, при необходимости изменитеcontext
Значение также можно изменить вручную:
const path = require('path');
module.exports = {
context: path.join(__dirname, 'src');
}
Тип контекста
Типы | пример | имея в виду |
---|---|---|
string |
path.join(__dirname, 'src') |
настраиватьWebpack контекст,должен быть абсолютный путь
|
Теперь измените корневой каталог относительного пути наsrc
, на этот раз с использованием относительного пути отsrc
Ищите в каталоге. Например, вышеentry
, будет изsrc
Поиск в каталоге, т.е.src/index.js
.
Entry
entry
даWebpack
Запись модуля конфигурации,Webpack
При запуске сборки она начнется сentry
Файл начинает рекурсивно разрешать все зависимые модули.
Например:
const path = require('path');
module.exports = {
devtool: false,
mode: 'development',
entry: './index.js',
output: {
filename: 'bundle.js',
path: path.join(__dirname, './'),
},
};
const module1 = require('module1');
module1();
function module1() {
console.log('module1');
}
module.exports = module1;
ТакWebpack
При построении изindex.js
Запустить, разрешить зависимостиmodule1
, Итакmodule1
Код упакован вbundle.js
.
Например:
function module1() {
console.log('module1');
}
module1();
Тип записи
Типы | пример | имея в виду |
---|---|---|
string |
./index.js |
Путь к файлу модуля ввода, который может быть относительным путем |
array |
['./index.js', './main.js'] |
Путь к файлу модуля ввода, который может быть относительным путем |
object |
{ index: './index.js', main: ['./main.js', './src/index.js']} |
Конфигурация с несколькими записями, каждая запись генерирует однуchunk
|
Описание записи
-
dependOn
: файл входа, от которого зависит текущий файл входа, то есть зависимый файл входа должен быть загружен до загрузки файла входа. -
filename
: укажите имя выходного файла после создания текущего входного файла. -
import
: Модули загружаются по папке при запуске сборки -
library
: параметры для настройки файла записи -
runtime
:Время выполненияchunk
имя, если этот параметр установлен, будет создана среда выполнения с тем же именемchunk
, иначе файл записи будет использоваться как среда выполнения
Например:
module.exports = {
entry: {
index: './index.js',
main: {
dependOn: 'index',
import: './main.js',
},
},
};
буду ждать пока строитсяindex
Начать после завершения сборкиmain
сборка.
Для одной записи,dependOn
а такжеruntime
не могут существовать одновременно:
module.exports = {
entry: {
index: './index.js',
main: {
dependOn: 'index',
runtime: 'other',
import: './main.js',
},
},
};
Эта ситуация не соответствует требованиям, и будет сообщено об ошибке.
Для одной записи,runtime
Не может быть существующим именем файла записи:
module.exports = {
entry: {
index: './index.js',
main: {
runtime: 'index',
import: './main.js',
},
},
};
В этом случае он не соответствует требованиям, и будет сообщено об ошибке.
Остерегайтесь циклических зависимостей:
module.exports = {
entry: {
index: {
dependOn: 'main',
import: './index.js',
},
main: {
dependOn: 'index',
import: './main.js',
},
},
};
В этом случае возникнет циклическая зависимость, а также будет сообщено об ошибке.
Пример
Вот несколько примеров, которые будут использоваться в реальной производственной среде:
Разделение кода и зависимостей
module.exports = {
entry: {
main: './src/app.js',
vendor: './src/vendor.js',
},
};
module.exports = {
output: {
filename: '[name].[contenthash].bundle.js',
},
};
module.exports = {
output: {
filename: '[name].bundle.js',
},
};
это говоритWebpack
Нужно упаковать два отдельныхchunk
.
Преимущество этого в том, что некоторые зависимости, которые не будут изменены (например,jQuery
Bootstrap
) наvendor
Среди них эти зависимости будут упакованы вместе для созданияchunk
. Поскольку эти зависимости практически неизменны,contenthash
Также не будет изменений для лучшей оптимизации кэширования браузера.
многостраничное приложение
module.exports = {
entry: {
pageOne: './src/pageOne/index.js',
pageTwo: './src/pageTwo/index.js',
pageThree: './src/pageThree/index.js',
},
};
это говоритWebpack
Нужно упаковать три отдельныхchunk
.
В многостраничном приложении каждый раз при доступе к странице создается новаяHTML
документация. когда новыйHTML
При загрузке документа ресурс также повторно загружается.
Для решения этой проблемыWebpack
обеспечивает аналогичныйoptimization.splitChunks
Возможность создавать общиеbundle
. По мере увеличения количества записей в многостраничных приложениях преимущества этого механизма повторного использования кода будут увеличиваться.
chunk
имя
- если
entry
Типstring
илиarray
, будет генерировать толькоchunk
, а зовутmain
; - если
entry
Типobject
, создаст несколькоchunk
, названный какobject
изkey
;
Динамически настроить запись
Если требуется динамическая конфигурацияentry
,могуentry
Установите функцию, которая поддерживает как синхронные, так и асинхронные:
module.exports = {
// 同步
entry: function syncEntry() {
return {
index: './index.js',
main: './main.js',
};
},
// 异步
entry: function asyncEntry() {
return new Promise(function (resolve) {
resolve({
index: './index.js',
main: './main.js',
});
});
},
};
Многовходовая конфигурация
Если вам нужно создать несколькоchunk
, или используяCommonsChunkPlugin
такие как плагины, вы должны использоватьсинтаксис шаблоназаменитьfilename
, гарантируя, что каждыйchunk
Все имеют отдельные имена.
module.exports = {
entry: {
app: './src/app.js',
search: './src/search.js',
},
output: {
filename: '[name].js',
},
};
Output
output
даWebpack
Возможность настройки такой информации, как имя файла, путь и т. д. выходного файла. Для нескольких записей необходимо настроить только однуoutput
.
Для самого простого использования требуется только настроить одинfilename
Варианты:
module.exports = {
output: {
filename: 'bundle.js',
},
};
Эта конфигурация выводитbundle.js
существуетdist
Под содержанием.