«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"
🎨Предисловие
Как мы все знаем, в сегодняшнем все более сложном начальном проектировании инструменты модульной упаковки играют все более важную роль в нашей повседневной разработке, и среди них,webpack
Это уже лучший выбор для начальной упаковки и строительства.
Говоря оwebpack
, многие мелкие партнеры могут показаться как знакомыми, так и незнакомыми, потому что он используется в каждом проекте, который мы разрабатываем. Странность в том,webpack
Ему незнакома сложная конфигурация и различные функции.
Поэтому иногда нас сначала пугает эта сложная конфигурация, и это отбивает у нас желание учиться.
Однако в большой среде, где технологические обновления и итерации происходят так быстро,webpack
Этому все еще стоит учиться.
В следующей статье мы объяснимwebpack
Начало работы с основными понятиями. Давайте учиться вместе~🎬
📅 1. Что такое вебпак
1. Пишите впереди
Когда мы хотим написать веб-страницу, сначала мы создадимindex.html
файл и, возможно, еще несколько позжеjs
файл, то мы будемhtml
файл, импортируйте ихjs
документ.
Только представьте, еслиjs
Файлов много, а потом мы их импортируем по одному, а вдруг ошибка? Будет ли сложно определить, какой файл неправильный, что сделает эффективность разработки очень низкой.
Следовательно, естьwebpack
.webpack
Написанный нами код будет переведен, а переведенный контент будет модульно упакован для разработки проекта.
Далее мы объясним,webpack
Что это такое и как его установить и использовать.
2. Что такое инструмент для упаковки модулей?
webpack
иногда ошибочно принимают заjs
переводчик, а на самом делеwebpack
Не одинjs
переводчик.
потому что это только знаетimport
Такие похожие предложения, не зная другихjs
Расширенный синтаксис. Так что, если вы называете этоjs
Переводчик, на самом деле, мы смотрели на него высоко.
Глядя на официальное определение, мы можем обнаружить, чтоwebpack
Являетсяинструмент для упаковки модулей,в то же времяwebpack
также может поддерживатьcommonjs
спецификация упаковки модуля.
Однако с течением времени и постоянным обновлением технологийwebpack
уже не просто упаковкаjs
изинструмент для упаковки модулей,webpack
теперь также поддерживаетcss文件
,jpg
,png
Упаковка различных файлов и т.д.
📐 Во-вторых, как создать среду с помощью Webpack
1. Установить узел
webpack
основывается наnodejs
Разработанный инструмент упаковки модулей в основном состоит изnode
осуществленный. Итак, мы должны установитьnode
окружающая обстановка.Вот ссылка на официальный сайт, рекомендуется скачать стабильную версию
Затем запросите местныйnode
а такжеnpm
version, чтобы убедиться, что установка прошла успешно.
node -v
npm -v
2. Создайте проект
Сначала создайте проект, предполагается, что он называетсяwebpack-demo
. тогда под проектСоздайте папку с помощью следующей команды:
mkdir webpack-demo
3. Инициализируйте проект
Войтиwebpack-demo
файл для инициализации проекта.Командная строка выглядит следующим образом:
cd webpack-demo
npm init 或 npm init -y //加-y表示默认自动配置项
весь путь послеEnter
Просто вернись.
Вы можете увидеть структуру проекта, вышеперечисленные операции находятся вwebpack-demo
файл создалpackage.json
файл, после чего ставимpackage.json
Внесите изменения в файл.Конкретный код выглядит следующим образом:
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
//将这个项目设置为私有
"private":true,
//"main": "index.js", //去掉入口文件
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
//写上作者名
"author": "Monday",
//保持项目私有
"license": "ISC"
}
4. Установите веб-пакет
Первый способ: глобальная установка
npm install webpack webpack-cli -g
Второй способ: установить под текущий проект
npm install webpack webpack-cli -D
Здесь предлагается выбрать второй способ установки. Так почему? из-за глобальной установкиwebpack
Любые вопросы?
На самом деле глобальная установка установит только одну версию.
Итак, если мы хотим запустить два проекта сейчас, и эти два проекта кажутся изначально установленнымиwebpack
Версия другая, ставьте более низкую версиюwebpack
, это может привести к тому, что он не запустится на нашем локальном компьютере. Поэтому для установки рекомендуется использовать второй способ.
После завершения установки мы должны запросить используемый в настоящее времяwebpack
номер версии, чтобы убедиться, что мы успешно установили его.Конкретная командная строка выглядит следующим образом:
npx webpack -v
В это время некоторые друзья будут задавать вопросы, зачем нужно добавлять ещеnpx
найти номер версии.
Причина в том, что мы устанавливаем только в текущем проекте, поэтомуwebpack
Эта команда не найдена глобально. а такжеnode
при условииnpx
,В настоящее времяnpx
Вы можете найти каталог проекта, который мы запускаемnode-module
серединаwebpack
установить пакет, таким образом, чтобы поставить нашwebpack
установлен внутри нашего проекта, а затем черезnpx
бежатьwebpack
Вот и все.
5. Установите определенную версию веб-пакета
Если мы хотим установить конкретный номер версииwebpack
, то сначала смотримwebpack
информация о номере версии.Команда выглядит следующим образом:
npm info webpack
После нахождения определенного номера версии используйте следующую команду для установки:
npm install webpack@4.16.5 webpack-cli -D //4.16.5表示版本号
⚙️ 3. Конфигурационный файл Webpack
1. Конфигурационный файл по умолчанию
Во многих случаях проект успешно выполняется до того, как мы напишем файл конфигурации. Это не потому, что не надо писать, аwebpack
Команда помогла нам написать много заранеефайл конфигурации по умолчанию, чтобы мы могли удовлетворить наши требования к использованию без слишком большой настройки при запуске проекта. Затем давайте вслед за всеми напишем конфигурационный файл.
Давайте узнаем о структуре проекта, когда мы создаем готовый проект, наш исходный код обычно размещенsrc
папка, а упакованные файлы обычно помещаются вdist
файл, покаwebpack
файл конфигурации с именемwebpack.config.js
, и поместите его в корневой каталог проекта.
├── dist 放置打包后的文件
├── src 放置项目源代码
├── webpack.config.js webpack配置文件
├── package-lock.json
├── package.json
Прочитав структуру проекта, давайте посмотримwebpack
изконфигурационный файлКак настроить.Конкретный код выглядит следующим образом:
//node的核心模块
const path = require('path');
module.exports = {
//设置为development时,代码不会进行压缩;设置为production时,代码会进行压缩。
mode:'production',
// 放置入口文件,明确怎么打包,要打包哪一个文件
entry: './src/index.js',
//entry: {
// main: './src/index.js'
//},
// 输出,表明webpack应该怎么输出,输出到哪个地方
output: {
filename: 'bundle.js',
// 指打包后的文件要放在哪个文件下
// __dirname表示该项目的根目录
path: path.resolve(__dirname, 'dist')
}
}
Поняв базовую конфигурацию, некоторые друзья в это время могут сомневаться в своих сердцах.webpack
Файл конфигурации должен называться какwebpack.config.js
Можно ли назвать что-то другое?
ответ да, но нам нужно специальное лечение. Обычно, если мы называемwebpack.config.js
можно использовать напрямуюnpm webpack
Приходите и запускайте наш проект. Если это имя не используется, предполагается, что это имяwebpackconfig.js
, то мы можем упаковать наш конкретный проект с помощью следующей командной строки.
npx webpack --config webpackconfig.js
Приведенная выше командная строка означает:webpack
Приходите и помогите нам упаковать, какой файл упаковать? кwebpackconfig.js
Для файла конфигурации, чтобы помочь нам package.
2. Используйте скрипт npm, чтобы упростить наш код упаковки.
Прочитав содержание выше, я верю в друзейwebpack
иметь базовое понимание.
Затем представьте себе следующее, часто используйтеnpx webpack
Приходите и помогите нам упаковать файлы, не будет ли это немного хлопотно?
Итак, давайте узнаем еще одну вещь: используйтеnpm script
чтобы упростить наш код упаковки.
В корневом каталоге нашего проекта будетpackage.json
файл, этот файлкод показывает, как показано ниже:
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"private": true,
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Monday",
"license": "ISC",
"devDependencies": {
"webpack": "^5.39.1",
"webpack-cli": "^4.7.2"
}
}
Все находят раздел скриптов.Далее мы внесем изменения в раздел скриптов. Конкретный код выглядит следующим образом:
"scripts": {
/* webpack 会先到node_module下面进行打包*/
"bundle": "webpack"
},
После завершения преобразования мы эквивалентныpackage.json
Есть конфигурацияnpm script
, приведенный выше код означает этоscript
Соответствующее имяbundle
,Потом,bundle
Нижний слой поможет нам выполнитьwebpack
, и упаковать его.
После написания этого нам больше не нужно использоватьnpx webpack
сделать пробежкуwebpack
, вместо этого используйтеnpm run bundle
выполнить команду для упаковки.
3. Говоря о выходном содержании упаковки webpack
После объяснения вышеуказанного содержания, давайтеwebpack
После упаковки некоторые выходные данные консоли суммируются.
выходной контент | конкретное значение |
---|---|
hash | Представляет уникальное хеш-значение, соответствующее этой упаковке. |
version | Представляет версию веб-пакета, используемого для этой упаковки. |
time | Конкретные затраты времени на общую упаковку текущего проекта |
assets | Упакованный файл, например: bundle.js |
size | Размер упакованного файла |
chunks | Поместите значение идентификатора вашего собственного соответствующего файла и значение идентификатора других файлов, представленных соответствующим файлом. |
chunk Names | Основная соответствующая входной конфигурации |
🔑 Четыре, Погрузчик
1. Объяснение примеров
Webpack
По умолчанию нужно знать, как упаковатьjs
модуль, но он не знаетjpg
Как упаковать этот файл.
В это время нам нужноwebpack.config.js
Настроить под файл, настроитьfile-loader
. Добавляем новый в конфигурациюmodule
.Конкретный код выглядит следующим образом:
module:{
rules:[{
test:/\.jpg$/,
use:{
loader:'file-loader'
}
}]
}
Далее проанализируемwebpack
как упаковатьjpg
Такие статические файлы.
первыйwebpack
войдетsrc
содержание,new
Одинindex.js
файл, то теперь мы должны упаковать этот файл.
Итак, в командной строке я запустилnpm run bundle
. когда ты бежишьnpm run bundle
при фактическом выполненииpackage.json
внутриscript
,этоscript
помогите нам бежатьwebpack
,а потом,webpack
Помогите нам сделать упаковку. В настоящее времяwebpack
Он найдет соответствующую конфигурацию и поможет нам упаковать в соответствии с этой конфигурацией.
Итак, давайте посмотрим, если мы столкнемсяjs
файл, затемwebpack
Он будет упакован по умолчанию. но? Если вы встретитеjpg
картина?webpack
Я был ошеломлен в это время,webpack
не знаюjpg
код в этом формате.
Поэтому мы можем ссылаться на модуль модуля, чтобы помочь нам упаковать. Этот модуль называетсяfile-loader
,file-loader
этоloader
Это может помочь нам завершить процесс упаковки.
Так что на самом деле,file-loader
Нижний слой, что он нам помог?
когда мы упаковываемjpg
файл,webpack
положитjpg
файл перемещен вdist
файл, и кjpg
Файл получает новое имя. Затем он вернет имя в качестве возвращаемого значения переменной, которую мы импортировали в модуль.
Этоfile-loader
Низкоуровневый процесс обработки упакованных файлов.
Конечно.file-loader
не только может справитьсяjpg
Такая файл-картинка. Теоретически он также может обрабатыватьМножество типов статических ресурсов.
2. Что такое загрузчик
проработанныйfile-loader
После этого я верю всемloader
иметь базовое понимание. Итак, давайте разберемся с основным определением загрузчика.детали следующим образом:
самwebpack
Я не знаю, как работать с некоторыми файлами, ноloader
знание. Итак, когда вы сталкиваетесь с некоторыми非js
файл, как правило, перейти кloader
Вот и все. Поэтому нам нужно позволитьwebpack
пойти за помощьюloader
модуль для идентификации非js
документ.
Цитироватьwebpack
Предложение официального китайского документа, в документе говорится:webpack
могу только понятьJavaScript
а такжеJSON
файл, этоwebpack
Принесите свои собственные способности из коробки.loaderПозволятьwebpack
Способен обрабатывать другие типы файлов и преобразовывать их в эффективный модуль, длязаявлениеиспользуется, а также добавляется кграфик зависимостисередина. По сути,loader
экспортируется как функцияJavaScript
модуль.
3. Используйте загрузчик для упаковки статических ресурсов (изображений)
(1) Пользовательские именованные изображения
Если мы теперь хотим настроить имя упакованного образа, что нам делать?
мы вwebpack.config.js
под файломmodule
Делайте улучшения.Конкретный код выглядит следующим образом:
module:{
rules:[{
test:/\.jpg$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]'
}
}
}]
}
по конфигурацииoptions
, можно добиться эффекта пользовательского именования картинок.
(2) Пакет различных типов файлов изображений
Предположим, мы теперь не ограничиваемся упаковкойjpg
файл, а также хотите упаковать другие файлы изображений.Затем мы можем настроить его следующим образом:
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]'
}
}
}]
}
Добавляйте новые типы изображений с помощью регулярных выражений.
(3) упакованы в файлы изображений
Предположим, теперь мы хотим поместить упакованный файл вimage
файл, что мне делать?Конкретный код выглядит следующим образом:
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]',
//将jpg、png和gif图片文件,指定到dist目录下的images文件下
outputPath: 'images/'
}
}
}]
}
(4) URL-загрузчик
в использованииfile-loader
После этого изучим еще один пункт знаний:url-loader
.url-loader
может достигать почтиfile-loader
Эффект. Конкретное использование заключается в следующем:
npm i url-loader -D
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'url-loader',
options: {
name: '[name]_[hash].[ext]',
outputPath: 'images/'
}
}
}]
}
мы просто устанавливаемurl-loader
, а в конфигурации будетfile-loader
заменитьurl-loader
Вот и все.
Но стоит отметить, что использованиеurl-loader
При упаковке нужно помнить о некоторых вещах.
когда вы идете, чтобы упаковатьjpg
файл, сfile-loader
Разница в том,url-loader
преобразует изображение вbase64
строку, а затем поместите ее прямо в нашdist
в каталогеbundle.js
Внутри, отдельно не генерируя файл изображения.
Преимущество заключается в том, что вы можете получить к нему прямой доступ вместо того, чтобы переходить к папке, чтобы получить к нему доступ, что экономит ваше время.http
просить.
Минус в том, что если этоjs
Если файл очень большой, файл js, сгенерированный упаковкой, тоже будет очень большим, а затем загрузите этотjs
время будет очень долгим.
так,url-loader
Каков наилучший способ использования?
Если изображение, которое мы представляем, маленькое, только1~2KB
Если объем небольшой, то эта картинка начинается сbase64
расфасован в видеjs
файл, это хороший выбор, нет необходимости повторно отправлять такое маленькое изображениеhttp
просить.
Но если изображение большое, старайтесь не использоватьurl-loader
При использованииfile-loader
, упакуйте этот образ в каталог dist, не упаковывайте его вbundle.js
в. Иначе получитсяbundle.js
Файл становится очень большим, что делает время загрузки очень долгим, что не способствует обслуживанию.
Другой способ заключается в том, что мы можем напрямуюurl-loader
Затем добавьте еще одну конфигурацию:limit
.Конкретный код выглядит следующим образом:
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'url-loader',
options: {
name: '[name]_[hash].[ext]',
outputPath: 'images/',
//20480=>20KB
limit: 20480
}
}
}]
}
Из приведенного выше кода мы можем знать, что при использованииurl-loader
, мы можем добавитьlimit
Атрибуты. Тогда смысл приведенного выше кода заключается в том, что когда размер файла изображения больше, чем20KB
когда мы используемurl-loader
Пакет. когда больше чем20KB
, поместите файл изображения вdist
изimages
под файл.
4. Используйте Loader для упаковки статических ресурсов (статьи в стиле)
(1) Упакуйте файл css
Например, теперь мы хотим сделать изображение размером150*150
, то нам нужно записать стили для изменения этого изображения. Этоwebpack
Как упаковатьcss
А файлы?
мы можем использоватьcss-loader
а такжеstyle-loader
для упаковки файлов.Конкретная конфигурация выглядит следующим образом:
npm install sass-loader node-sass --save-dev
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]',
outputPath: 'images/'
}
}
},{
test:/\.css$/,
use:['style-loader', 'css-loader']
}]
}
css-loader
поможет нам проанализировать, несколькоcss
Отношения между файлами заканчиваются тем, чтоcss
файлы, объединенные в одинcss
. Этоstyle-loader
Какова его роль?
в получилcss-loader
Сгенерированоcss
После файлаstyle-loader
будет монтировать этот контент на страницеhead
раздел и смонтируйте стили вhead
середина<style></style>
в.
(2) Упакуйте файл sass
Если вы хотите упаковатьsass
файл, использоватьsass-loader
,style-loader
а такжеcss-loader
Эти триloader
для упаковки файлов.Конкретная конфигурация выглядит следующим образом:
npm install sass-loader node-sass --save-dev
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]',
outputPath: 'images/'
}
}
},{
test:/\.scss$/,
use:[
'style-loader',
'css-loader',
'sass-loader'
]
}]
}
Примечательно,loader
Порядок выполнения такойСнизу вверх, справа налево.
Итак, когда мы приступаем к выполнениюsass
файл, он сначала выполнитsass-loader
После этого,css-loader
, и, наконец, выполнитьstyle-loader
.
(3) Проблемы совместимости
Иногда, если мы хотим быть совместимыми с несколькими браузерами, мы можемcss
добавить в файл-webkit-
и префиксы других производителей. Но ты знаешьwebpack
Невозможно распознать эти префиксы. На этот раз мы узнаем о новомloader
,то естьpostcss-loader
, этот загрузчик может автоматически помочь нам добавитьпрефикс поставщикаИнформация.Конкретное использование заключается в следующем:
Сначала мы устанавливаемpostcss-loader
Конкретный код этой библиотеки выглядит следующим образом:
npm i postcss-loader -D
После завершения установки мы создаем новый файл в корневом каталоге проекта с именемpostcss.config.js
, а затем настройте этот файл,код показывает, как показано ниже:
Установить первымautoprefixer
:
npm install autoprefixer -D
После завершения установки мы находимся вpostcss.config.js
файл вниз, чтобы использовать его,Конкретный код выглядит следующим образом:
module.exports = {
Plugin:[
require('autoprefixer')
]
}
Далее мыwebpack.config.js
файл ниже, используйтеpostcss-loader
.Конкретный код выглядит следующим образом:
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]',
outputPath: 'images/'
}
}
},{
test:/\.scss$/,
use:[
'style-loader',
'css-loader',
'sass-loader',
'postcss-loader'
]
}]
}
С помощью вышеперечисленных методов,webpack
Когда вы помогаете нам упаковывать статические файлы, вы можете префиксировать соответствующие стили, которые должны быть префиксированы производителем.
5. Добавьте элементы конфигурации
Предположим, мы теперь хотим датьloader
Добавляем элементы конфигурации, например, хотим датьcss-loader
Добавьте элементы конфигурации, после чего мы можем обработать код следующим образом.Конкретный код выглядит следующим образом:
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]',
outputPath: 'images/'
}
}
},{
test:/\.scss$/,
use:[
'style-loader',
{
loader: 'css-loader',
options: {
//表明前面要先走sass-loader和postcss-loader
importLoaders: 2
}
},
'sass-loader',
'postcss-loader'
]
}]
}
Из приведенного выше кода видно, что когда мы хотим датьcss-loader
При добавлении элементов конфигурации вместо использования формы строки мы преобразуем строку в объект. В объекте заполняем соответствующиеloader
а такжеoptions
Конфигурация, чтобы достичь требований, которые мы хотим.
Иногда мы находимся на странице, если импортировать глобальноcss
, что легко может привести кконфликт стилей. Как справиться с этой ситуацией?
Для этого мы можем использоватьcss-loader
серединаmodules
реализоватьcss
модульность, позволяющая внедрятьcss
Файл имеет свой собственный модуль. Как его использовать конкретно?
module:{
test:/\.scss$/,
use:[
'style-loader',
{
loader: 'css-loader',
options: {
//表明前面要先走sass-loader和postcss-loader
importLoaders: 2,
modules: true
}
},
'sass-loader',
'postcss-loader'
]
}]
}
Из приведенного выше кода мы можем узнать, чтоmodules:true
Заявление, вы можете включитьcss
модульная упаковка. После открытия мы можем импортировать под различные файлы.Метод импорта следующий:
import style from './index.scss';
var img = new Image();
img.src = bug;
img.classList.add(style.bug);
Из приведенного выше кода мы видим, что открытыйmodule
После этого можно указатьcss
в содержании!
6. Как использовать webpack для упаковки файлов шрифтов
Иногда мы можем столкнуться с проблемой желания внедрить шрифты в проект, тогдаwebpack
Как упаковать шрифты?Конкретный код выглядит следующим образом:
module:{
rules:[{
test: /\.(eot|ttf|svg)$/,
use: {
loader: 'file-loader',
}
}]
},
Из приведенного выше кода мы можем знать, что сwebpack
Соответствующий статический формат файлаeot、ttf和svg
и другие форматы, поэтому эти типы необходимо ввести. В то же время связанныеloader
дляfile-loader
.
Научившись упаковывать статические ресурсы, рекомендуется ознакомиться с соответствующими разделами официальной документации.конкретный штамп ссылки~
5. Используйте плагины, чтобы сделать упаковку более портативной
1. html-webpack-плагин
научиться пользоватьсяloader
После упаковки статических файлов давайте взглянем наwebpack
, как использоватьplugins
Сделайте упаковку проще.
Когда мы упаковываем проект,webpack
Всегда помещайте упакованное содержимое вdist
Под содержанием. В это время нам также может понадобиться создать еще один самостоятельно.index.html
для импорта основных файлов. Это сделает его немного более хлопотным?
следовательно,webpack
предоставил намplugin
плагин для решения этой проблемы.
Во-первых, давайте установимplugin
,Конкретная командная строка выглядит следующим образом:
npm install html-webpack-plugin -D
Далее мы представляем плагинwebpack.config.js
среди,Конкретный код выглядит следующим образом:
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [new HtmlWebpackPlugin({
//表明要引用哪一个模板
template: 'src/index.html'
})]
Теперь давайте разберемсяhtmlWebpackPlugin
Как помочь нам завершить автоматическую упаковку.
первый,htmlWebpackPlugin
Он автоматически сгенерируетhtml
документ. После этого упакуйте сгенерированныйjs
файлы автоматически импортируются в этотhtml
в файле.
Итак, в некотором смысле,plugin
допустимыйwebpack
Когда он дойдет до определенного момента, он автоматически что-то сделает для вас. То есть в этот момент, когда мы закончили собираться,plugin
автоматически поможет нам создатьhtml
файл для нашего непосредственного использования.
2. чистый-webpack-плагин
Иногда мы можемwebpack.config.js
Имя файла, соответствующее выводу в файле, изменено, что может легко привести к множественным конфликтам файлов в процессе упаковки.
Затем мы хотим добиться того, чтобы при упаковке сначала очистить исходную папку dist, а затем создать новую папку dist. Как с этим бороться? Смотри ниже.
Сначала давайте установим зависимостиclean-webpack-plugin
,Конкретная командная строка выглядит следующим образом:
npm install clean-webpack-plugin -D
Далее мы представляем плагинwebpack.config.js
среди,Конкретный код выглядит следующим образом:
const CleanWebpackPlugin = require('clean-webpack-plugin');
plugins: [new HtmlWebpackPlugin({
//表明要引用哪一个模板
template: 'src/index.html'
}),new CleanWebpackPlugin(['dist'])]
С помощью приведенного выше кода мы можем сначала удалить его, когда будем упаковывать наш проект.dist
Папка, а затем создать новую папку.
🗞️ Шесть, вход и выход
Далее мы рассмотримwebpack
серединаentry
а такжеoutput
Еще несколько основных конфигураций.
module.exports = {
mode:'development',
// 放置入口文件,明确怎么打包
entry:{
main: './src/index.js',
sub: './src/index.js'
},
plugins: [new HtmlWebpackPlugin({
//表明要引用哪一个模板
template: 'src/index.html'
}),new CleanWebpackPlugin(['dist'])],
// 输出,表明webpack应该怎么输出
output: {
//如果把资源放在cdn下,则引入cdn
publicPath: 'http://cdn.com.cn',
//当entry有多个入口文件时,用[]可以输出多个文件
filename: '[name].js',
// 指打包后的文件要放在哪个文件下
path: path.resolve(__dirname, 'dist')
}
}
🗺️ 7. Исходная карта
1. Объяснение примеров
Иногда, когда мы пишем код, всегда есть необъяснимые ошибки. Глядя на красный отчет об ошибке на консоли, мое сердце всегда очень неудобно. В то же время, если мы не настраиваемwebpack
Если так, то было бы ужасно найти ошибку.
Например, в режиме разработки мы по умолчаниюwebpack.config.js
Настройте, как показано ниже,Конкретный код выглядит следующим образом:
module.exports = {
mode:'development',
devtool: 'none',
entry:{
//打包到dist目录下的main.js
main: './src/index.js'
},
output: {
//用[]可以生成多个文件
filename: '[name].js',
// 指打包后的文件要放在哪个文件下
path: path.resolve(__dirname, 'dist')
}
}
Тогда, допустим, сейчас мы допустили ошибку в коде.console.log
написано какconsele.log
. А сейчасЭффект печати консоли выглядит следующим образом:
Как видите, ошибка на данный момент находится в запакованномmain.js
в файле96Ряд. Только представьте, если у нас много бизнес-кода, ошибка может идти вперед в файле.
Такая сцена не то, что мы хотим видеть. То, что мы хотим сделать, это, надеюсь,webpack
После того, как упаковка завершена, ошибка выдается нам напрямую, и отображается соответствующий конкретный адрес файла. Это файл кода, в котором мы допустили ошибку, а не упакованный файл.main.js
.
следовательно,webpack
предоставил намsourceMap
Эта конфигурация решает эту проблему.
2. исходная карта
мы сейчас ставимdevtool
Измените эту конфигурацию наsourceMap
.Конкретный код выглядит следующим образом:
module.exports = {
mode:'development',
devtool: 'source-map',
entry:{
//打包到dist目录下的main.js
main: './src/index.js'
},
output: {
//用[]可以生成多个文件
filename: '[name].js',
// 指打包后的文件要放在哪个文件下
path: path.resolve(__dirname, 'dist')
}
}
После замены посмотримРезультат печати консоли:
Теперь вы можете видеть, изменить наsource-map
После настройки расположение отчета об ошибке переходит непосредственно в каталог, где мы написали код, то естьindex.js
. вместо того, чтобы искать иголку в стоге сенаmain.js
Найдите внутри.
3. Общая конфигурация sourceMap
Прочитав приведенный выше пример, я считаю, что все правыSourceMap
иметь определенное понимание. Далее давайте посмотримsourceMap
Некоторые распространенные конфигурации .Подробнее см. ниже:
SourceMap | имея в виду |
---|---|
inline-source-map | Отображать как строки, так и столбцы, когда сообщается об ошибке |
cheap-inline-source-map | Когда я сообщаю об ошибке, я знаю только, какая строка неверна, а не какой столбец |
cheap-module-source-map | Лучшие практики для производственных сред, не только управлять ошибками собственного бизнес-кода, но и другими другими ошибками, такими как загрузчик, ошибки других сторонних модулей и т. д. |
eval | Eval — это самый быстрый способ упаковки, но если бизнес-код более сложный, эффект от использования eval может быть неполным. |
module-eval-source-map | Используйте модуль, чтобы показать не только бизнес-ошибки, но и загрузчик, сторонние ошибки и т. д. |
cheap-module-eval-source-map | Лучшие практики среды разработки |
🧱8. Используйте WebpackDevServer для повышения эффективности разработки
1. --смотреть
На самом деле, если мы не используемWebpackDevServer
Если мы разработаем его таким образом, то каждый раз, когда мы хотим просмотреть скомпилированный результат выполнения, нам нужно сначала скомпилировать командную строку.npm run bundle
команду, затем откройтеdist
в каталогеindex.html
файл можно просмотреть повторно. Таким образом, неизбежно, что эффективность будет низкой. Какой результат мы ожидаем?
мы кладемpackage.json
в файлеscript
сделать макияж,Конкретный код выглядит следующим образом:
"scripts": {
"watch": "webpack --watch",
"bundle": "webpack"
},
Как видно из приведенного выше кода,webpack
добавить после--watch
поле, затем запуститьnpm run watch
, вы можете изменять код каждый раз,webpack
Чтобы добиться автоматического мониторинга, вместо повторного запуска команды каждый раз, когда код изменяется, как в прошлом.webpack
упаковать.
2. Webpack DevServer
Однако этот метод может быть недостаточно дружелюбным, ведь разработчики всегда ленивы и стараются позволить программе делать всю работу, а не делать ее вручную.
На самом деле мы хотим добиться того, чтобы при запускеnpm run watch
Когда используется эта строка команды, она может не только автоматически помочь нам реализовать упаковку, но также помочь нам открыть консоль и смоделировать некоторые функции на сервере. тогда мы можем пройтиwebpackDevServer
для достижения желаемого эффекта. как использоватьwebpckDevServer
Шерстяная ткань? Подробнее см. ниже.
(1) Установка WebPackDevserver
Теперь мы проектируем установку WebPackDevserver,Конкретная командная строка выглядит следующим образом:
npm install webpack-dev-server -D
(2) Настройте файл package.json
Далее мы настраиваемpackage.json
документscript
.Конкретный код выглядит следующим образом:
"scripts": {
"watch": "webpack --watch",
"start": "webpack-dev-server"
},
(3) Настройте файл веб-пакета
Далее настроимwebpack.config.js
документ,Конкретный код выглядит следующим образом:
module.exports = {
mode:'development',
devtool: 'source-map',
// 放置入口文件,明确怎么打包
entry:{
main: './src/index.js'
},
devServer: {
contentBase: './dist',
// 当运行完npm run start时,会自动的帮我们打开浏览器
open: true
},
output: {
//用[]可以生成多个文件
filename: '[name].js',
// 指打包后的文件要放在哪个文件下
path: path.resolve(__dirname, 'dist')
}
}
Итак, теперь давайте посмотрим,webpackDevServer
Как сделать, чтобы автоматически открывался браузер.Подробности смотрите на картинке ниже:
Все могут видеть, черезwebpackDevServer
, он не только будет следить за тем, чтобы наши файлы изменились, но и переупаковывать их для нас. При этом будет такжеАвтоматически помогите нам обновить браузер, И воляАвтоматически помогать нам открыть браузер. Так что используйте его, вы можетеЗначительно повысить эффективность разработки нашего кода.
(4) Настройте номер порта
webpackDevServer
Номер порта по умолчанию для нашего сервера8080
, если мы хотим изменить его на другой номер порта, что нам делать?
нам нужно изменитьwebpack.config.js
под файломDevServer
,Конкретный код выглядит следующим образом:
module.exports = {
mode:'development',
devtool: 'source-map',
// 放置入口文件,明确怎么打包
entry:{
main: './src/index.js'
},
devServer: {
contentBase: './dist',
// 当运行完npm run start时,会自动的帮我们打开浏览器
open: true,
//修改端口号
port: 3000
},
output: {
//用[]可以生成多个文件
filename: '[name].js',
// 指打包后的文件要放在哪个文件下
path: path.resolve(__dirname, 'dist')
}
}
нам просто нужноdevServer
добавитьport
конфигурация для достиженияпользовательский номер порта.
Также стоит отметить, что когда мы используемwebpackDevServer
При упаковке нашего проекта он не будет сгенерирован автоматическиdist
каталог, так почему это? использоватьwebpackDevServer
Упакованный проект будет размещен в нашемОЗУВ некоторой степени это может эффективно повысить скорость упаковки проекта и сделать упаковку быстрее.
🌡️9.Горячая замена модуля
1. Объяснение примеров
Предположим, теперь мы хотим реализоватьновый элементФункция, которая достигается этой функцией, состоит в том, чтобы добавлять новый текст каждый раз, когда нажимается кнопка.item
.Конкретный код реализации выглядит следующим образом:
файл index.js:
import './style.css';
var btn = document.createElement('button');
btn.innerHTML = '新增';
document.body.appendChild(btn);
btn.onclick = function(){
var div = document.createElement('div');
div.innerHTML = 'item';
document.body.appendChild(div);
}
файл style.css:
div:nth-of-type(odd){
background: yellow;
}
Эффект отображения браузера в это времяКак показано ниже:
Предположим, теперь мы меняем цвет фона CSS, например фиолетовый.Конкретный код выглядит следующим образом:
div:nth-of-type(odd){
background: purple;
}
На этом этапе, после сохранения, браузер будет снова обновляться после каждогоitem
опять такиappend
Заходи.Как показано ниже:
В этом случае это может быть не тот результат, который нам нужен. Мы надеемся, что всеitem
Обновление не выполняется, и когдаcss
При изменении стиля соответствующийitem
Цвета также можно изменить. Тогда это приводит кwebpackDevServer
Контент в: Горячие обновления модулейHot Module Replacement
. Далее давайте разберемся с конфигурацией, связанной с горячим обновлением модуля.
2. Конфигурация горячего обновления модуля
Горячее обновление модуля, а именно замена горячего модуля, именуемоеHMR
.
Далее мыwebpack.config.js
папка для настройки.Конкретный код выглядит следующим образом:
//node的核心模块
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const webpack = require('webpack');
module.exports = {
mode:'development',
devtool: 'source-map',
// 放置入口文件,明确怎么打包
entry:{
main: './src/index.js'
},
devServer: {
contentBase: './dist',
// 当运行完npm run start时,会自动的帮我们打开浏览器
open: true,
port: 8080,
// 让我们的webpackDevServer开启hotModuleReplacement这样子的功能
hot: true,
// 即便HMR没有生效,也不让浏览器自动刷新
hotOnly: true
},
module:{
rules:[{
test:/\.(jpg|png|gif)$/,
use:{
loader:'file-loader',
options: {
//placeholder 占位符
name: '[name]_[hash].[ext]',
outputPath: 'images/',
limit: 10240
}
}
},{
test:/\.scss$/,
use:[
'style-loader',
{
loader: 'css-loader',
options: {
//表明前面要先走sass-loader和postcss-loader
importLoaders: 2,
modules: true
}
},
'sass-loader',
'postcss-loader'
]
},{
test:/\.css$/,
use:[
'style-loader',
'css-loader',
'postcss-loader'
]
}]
},
plugins: [new HtmlWebpackPlugin({
//表明要引用哪一个模板
template: 'src/index.html'
}),new CleanWebpackPlugin(['dist']),
new webpack.HotModuleReplacementPlugin()
],
// 输出,表明webpack应该怎么输出
output: {
// 下载middle:npm install express webpack-dev-middleware -D
publicPath: '/',
//用[]可以生成多个文件
filename: '[name].js',
// 指打包后的文件要放在哪个文件下
path: path.resolve(__dirname, 'dist')
}
}
Из приведенного выше кода мы можем знать, что конфигурацияdevServer
внизhot
а такжеhotOnly
,так же какplugins
внизnew webpack.HotModuleReplacementPlugin()
, для достижения эффекта горячего обновления модуля.
Далее давайте посмотрим на эффект браузера после настройки.Подробности смотрите на картинке ниже:
Как видите, после добавления этих конфигурацийitem
Он не будет обновляться снова, но стиль будет изменен на исходной основе.
📀10. Используйте Babel для обработки синтаксиса ES6
1. Преобразование синтаксиса ES6 в синтаксис ES5
Двигаясь дальше, давайте узнаем, как использовать webpack и babel для написания синтаксиса ES6.
Как мы все знаем, спецификация синтаксиса ES6 была официально опубликована в 2015 году. Поэтому иногда не все браузеры поддерживают синтаксис ES6. Поэтому сейчас мы хотим иметь возможность преобразовывать синтаксис ES6 в синтаксис ES5 при связывании с webpack. Таким образом, когда проект запущен, браузер не сообщит об ошибке.
Так как же добиться такой упаковки? Дальше разберемся вместе.
Сначала мы открываемофициальный сайт бабеля, по шагам мы шаг за шагом вwebpack
используется вbabel
.
первый шаг:Установитьbabel-loader
а также@babel/core
эти две библиотеки.Конкретный код выглядит следующим образом:
npm install --save-dev babel-loader @babel/core
babel-loader
Это инструмент, помогающий упаковывать и использовать webpack, а также@babel/core
являетсяbabel
основная библиотека, которая позволяетbabel
идентифицироватьjs
содержание кода, а затемjs
код вAST
Абстрактное синтаксическое дерево, а затем скомпилируйте абстрактное синтаксическое дерево в новый синтаксис.
Шаг 2:существуетwebpack.config.js
Добавьте правила к элементам конфигурации в файле.Конкретный код выглядит следующим образом:
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
третий шаг:Установить@babel/preset-env
.Конкретный код выглядит следующим образом:
npm install @babel/preset-env --save-dev
Зачем устанавливать этот модуль? На самом деле, когда мы используемbabel-loader
При работе с файлами, на самом делеbabel-loader
Толькоwebpack
а такжеbabel
Мост для связи между ними, он просто открывает нам канал, но не помогает нам соединитьсяES6
Синтаксис преобразуется вES5
синтаксис. Поэтому нам также нужно использовать некоторые другие модули для выполнения этой работы. Этот модуль - то, о чем мы говорили ранее,preset-env.
babel/preset-env
, включая всеES6
Перевести вES5
Грамматические правила, упакованные с этим модулем, мы можем поместить все нашиjs
серединаES6
Код преобразуется вES5
. Конкретную конфигурацию см. выше.второй шаг.
2. Babel-полифилл
С помощью вышеуказанных методов мы можем добиться эффекта преобразования синтаксиса ES6 в синтаксис ES5. Однако проблема, которую мы также должны учитывать, заключается в том, что если мы сталкиваемся с новыми синтаксическими переменными, такими как промисы, или функциями, такими как карта в массивах, в браузерах с низкими версиями, они на самом деле не существуют. Хотя мы сделали объяснение грамматики и перевод грамматики, но только часть перевода. Также есть некоторые объекты и функции, недоступные в младших версиях браузеров.
Итак, в настоящее время мы не только должны использоватьbabel/preset-env
сделать преобразование синтаксиса, но такжеДобавьте эти отсутствующие переменные и функции в браузеры более ранних версий..
Итак, как добавить, в это время нам нужно использоватьbabel-polyfill
этот инструмент для дополнения.babel-polyfill
Предназначен для реализации вещей, которые не поддерживаются браузерами.原生API的代码
. Далее мы объясним, как использовать этот модуль.
Шаг 1: Найдитеофициальная документация,Установитьbabel-polyfill
.Конкретный код выглядит следующим образом:
npm install --save @babel/polyfill
Шаг 2: Импортируйте модуль.Конкретный код выглядит следующим образом:
import "@babel/polyfill";
Обычно этот код размещается в проекте.js
под входным файлом.
Шаг 3: Модернизацияwebpack.cofig.js
под файломmodule
, уменьшая размер упаковки.Конкретный код выглядит следующим образом:
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: [['@babel/preset-env'],{
useBuiltIns: 'usage'
}]
}
}
}
]
}
Этот код означает, что при использованииbabel-polyfill
При наполнении фич младших версий браузеров не нужно добавлять все фичи, а решать, что добавлять согласно нашему бизнес-коду.
в то же время,babel-preset
Есть также много других свойств конфигурации, которые стоит изучить, которые здесь не рассматриваются. Каждый может прийтиофициальная документацияПроверьте это~
📚Одиннадцать, заключительные замечания
Когда я закончил писать эту статью, я вдруг вспомнил интервьюера в прошлом интервью. На заключительном риторическом сеансе спросите его оwebpack
проблема, сказал онwebpack
Как правило, этим будут заниматься сотрудники, знакомые с бизнесом компании, ведь фронтенд-инжиниринг — это не детская игра.
В то время у меня не было особого чувства, но теперь, когда я узнал об этом, я вдруг подумал об этой сцене. Это правда, я узнал меньше, чем верхушка айсберга, я уже почувствовалwebpack
огромный проект. Если во время упаковки возникает проблема с конфигурацией в небольшом месте, это может привести к выходу из-под контроля всего проекта. (Конечно, в нормальных условиях такой ситуации не бывает, и слова серьезные...)
изучениеwebpack
процесс, чтобыОпределите версию веб-пакета, которую вы используете.. Например, я только начал спотыкаться в понедельник, и я чувствую, что версия 4 и версия 5 похожи. но дляwebpack
Я имею в виду, это полная шутка об этом. Каждая зависимость имеет версии 4 и 5, а не ту, которую вы хотите использовать. Если вы используете его без разбора, вы можете незримо сообщить об ошибке до такой степени, что усомнитесь в своей жизни...
Поэтому обязательно используйтеwebpack
Версия, используемая при упаковке, и при использованииnpm
Также необходимо найти соответствующую версию, чтобы использовать ее, чтобы уменьшить количество ошибок.
На данный момент супер-вводные знания о веб-пакете здесь! Надеюсь, это поможет всем~
Код этой серии статей загружен в публичный аккаунт, а ключевые слова отвечают в фоновом режиме.webpack
Вы можете получить это~
🐣Пасхальное яйцо Еще одна вещь
Рекомендовано в прошлом
Дополнительно
- Обратите внимание на публичный аккаунтЛаборатория понедельника, обратите внимание на изучение сухих товаров в первый раз,Другие рекомендуемые столбцы ждут вас, чтобы разблокировать~
- Если эта статья будет вам полезна, помнитеоставить след джиоиди снова~
- Это все для этой статьи! Увидимся в следующий раз! 👋👋👋