что такое вебпак
Webpack можно рассматривать как упаковщик модулей: он анализирует структуру вашего проекта и находитJavaScript
модули и другие языки расширений, которые браузеры не могут запускать напрямую (Scss
,TypeScript
и т. д.), упакуйте его в подходящий формат для использования браузером.
Сборка заключается в преобразовании исходного кода в исполняемый файл для распространения в Интернете.JavaScript
, CSS, HTML-код, включая следующее:
-
преобразование кода:
TypeScript
скомпилировано вJavaScript
,SCSS
Компилировать в CSS и т. д. -
оптимизация файлов: сжатие
JavaScript
, CSS, HTML-код, сжатие и объединение изображений и т. д. - разделение кода: Извлеките общий код нескольких страниц, извлеките код, который не нужно выполнять на первом экране, и дайте ему загрузиться асинхронно.
- слияние модулей: В модульном проекте много модулей и файлов, и нужно построить функцию для объединения модулей в один файл.
- Автоматическое обновление: прослушивание изменений в локальном исходном коде, автоматическая сборка, обновление браузера
- проверка кода: Перед отправкой кода на склад необходимо проверить, соответствует ли код спецификации и проходит ли юнит-тест
- автоматическая публикация: после обновления кода код онлайн-релиза создается автоматически и передается в систему выпуска.
Строительство на самом деле является воплощением инженерного и автоматизированного мышления во фронтенд-разработке. Реализуйте серию процессов с помощью кода, и пусть код автоматизирует эту серию сложных процессов.
Основные понятия веб-пакета
-
входная точка: Указывает, какой модуль веб-пакет должен использовать в качестве начала построения своего внутреннего графа зависимостей, веб-пакет узнает, какие модули и библиотеки являются зависимостями (прямо и косвенно) точки входа.
- Значение по умолчанию
./src/index.js
, однако можно указать другую точку входа (или несколько точек входа), настроив свойство записи в конфигурации веб-пакета.
- Значение по умолчанию
-
экспортный выводСвойство : сообщает webpack, куда выводить созданные им пакеты и как называть эти файлы, по умолчанию для основного выходного файла
./dist/main.js
, выходной каталог по умолчанию для других make-файлов:./dist
-
loader: разрешить веб-пакету обрабатывать файлы, отличные от JavaScript (сам веб-пакет понимает только JavaScript). Загрузчики могут преобразовывать все типы файлов в действительные модули, которые может обрабатывать веб-пакет, а затем вы можете воспользоваться возможностями упаковки веб-пакета и обработать их.
Обратите внимание, что загрузчик может импортировать любой тип модуля (например, файлы .css), что является особенностью, характерной для веб-пакета, и может не поддерживаться другими сборщиками или исполнителями задач. Мы считаем, что это расширение языка необходимо, поскольку оно позволяет разработчикам создавать более точные графы зависимостей.
-
плагины плагины:loaders используются для преобразования определенных типов модулей, а плагины могут использоваться для выполнения более широкого круга задач. Плагины варьируются от оптимизации упаковки и сжатия до переопределения переменных в среде. Интерфейс плагина чрезвычайно мощный и может использоваться для решения самых разных задач.
-
Режим: выбрав
development
илиproduction
Один из них, чтобы установить параметр режима, вы можете включить оптимизации, встроенные в веб-пакет, в соответствующем режиме.
процесс сборки вебпака
- Начиная с модуля, настроенного в записи, рекурсивно разрешите все модули, от которых зависит запись.
- Каждый раз при обнаружении модуля будет найдено соответствующее правило преобразования в соответствии с настроенным загрузчиком.
- После преобразования модуля анализируется модуль, от которого зависит текущий модуль.
- Эти модули сгруппированы в единицы Записи, а Запись и все зависимые от нее Модули сгруппированы в группу, которая является Чанком.
- Наконец, Webpack преобразует все фрагменты в выходные файлы.
- В течение всего процесса Webpack будет выполнять логику, определенную в плагине, в нужное время.
Среды разработки и производства
В нашей повседневной работе по фронтенд-разработке у нас обычно есть два набора сред конструирования: один для разработки и один для онлайн-использования.
-
development: файл конфигурации для разработки, используемый для определения
webpack dev server
и другие вещи -
production: файл конфигурации для производства, используемый для определения
UglifyJSPlugin
,sourcemaps
Ждать
Короче говоря, вам может понадобиться распечатать отладочную информацию во время разработки, включаяsourcemap
файлы, а производственная среда используется для онлайн-кода, который сжимается, и никакая отладочная информация не печатается во время выполнения. Например, axios, antd и т. д. необходимо использовать в нашей производственной среде, тогда мы должны установить зависимость в производственной среде, иwebpack-dev-server
Его необходимо установить в среде разработки.
обычно мыnpm
В файлах, установленных в -S -D, -D означает, что наши зависимости установлены в среде разработки, а -S - установить зависимости в рабочей среде.
Эта статья поможет вам создать базовую среду разработки интерфейса Что вам нужно для среды разработки интерфейса?
- HTML, CSS, JS, изображения и другие ресурсы, необходимые для построения и публикации.
- Используйте препроцессор CSS, здесь меньше
- Настройте транскодер babel => используйте es6+
- Обработка и сжатие изображений
- Настроить горячую перезагрузку, HMR
Приведенная выше конфигурация может соответствовать базовой конфигурации, необходимой для разработки интерфейса. Ниже приведен рендеринг этой статьи после упаковки:
Создайте базовую среду разработки
Установить
mkdir webpack-dev && cd webpack-dev
npm init -y
npm i webpack webpack-cli -D
добавить скрипты
Сгенерированный файл package.json, добавьте в файл
"scripts": {
"build": "webpack --mode production"
}
--
mode
Режим (обязательно, иначе будетWARNING
),Даwebpack4
Добавлены параметры параметров, по умолчаниюproduction
-
--mode production
Производственная среда- поставка
uglifyjs-webpack-plugin
сжатие кода - определение не требуется
new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") })
По умолчаниюproduction
- Включено по умолчанию
NoEmitOnErrorsPlugin -> optimization.noEmitOnErrors
, пропускать вывод ошибок компиляции, чтобы выходные ресурсы не содержали ошибок - Включено по умолчанию
ModuleConcatenationPlugin
->optimization.concatenateModules
,webpack3
Добавлен подъем прицела (Scope Hoisting
)
- поставка
-
--mode development
среда разработки- Используйте eval для сборки модулей, чтобы ускорить инкрементные сборки
- определение не требуется
new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") })
По умолчаниюdevelopment
- Включено по умолчанию
NamedModulesPlugin -> optimization.namedModules
Относительные пути к модулям отображаются при использовании горячей замены модулей (HMR)
После добавления скриптов создайте новыйsrc/index.js
, затем выполнитеnpm run build
, вы обнаружите, что новыйdist
Директория, в которой хранится собранный webpackmain.js
документ.
ps руководство по использованию скриптов npm
Создайте новый файл webpack.config.js
Чтобы добавить дополнительную информацию о конфигурации в webpack, нам нужно создать файл конфигурации webpack. Создать в корневом каталогеwebpack.config.js
выполнить позжеwebpack
команда, webpack будет использовать конфигурацию этого файла конфигурации
Конфигурация имеет следующую основную информацию:
module.exports = {
entry: '', // 打包入口:指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始
output: '', // 出口
resolve: {}, // 配置解析:配置别名、extensions 自动解析确定的扩展等等
devServer: {}, // 开发服务器:run dev/start 的配置,如端口、proxy等
module: {}, // 模块配置:配置loader(处理非 JavaScript 文件,比如 less、sass、jsx、图片等等)等
plugins: [] // 插件的配置:打包优化、资源管理和注入环境变量
}
Настройка входящего и исходящего пакетов
Сначала мы идем вwebpack.config.js
Добавить информацию о конфигурации точки
const path = require('path')
module.exports = {
// 指定打包入口
entry: './src/index.js',
// 打包出口
output: {
path: path.resolve(__dirname, 'dist'), // 解析路径为 ./dist
filename: 'bundle.js'
}
}
Выше мы определили запись упаковки./src/index.js
, упакованный для экспорта как./dist
, имя упакованной папкиbundle.js
,воплощать в жизньnpm run build
После команды файл index.js будет упакован какbundle.js
документ. На этом этапе создайте html-файл для ссылки на этотbundle.js
ты можешь видетьindex.js
написанный код.
path.resolve([...paths])Метод преобразует путь или последовательность фрагментов пути в абсолютный путь.
Создание html-файлов с помощью html-webpack-plugin
В большинстве случаев мы не хотим упаковывать его один раз, поэтому мы создаем новый html-файл для ссылки на упакованный файл, что неразумно, или когда имя упакованного файла изменяется, путь ссылки будет неправильным.
В этот момент мы можем использоватьhtml-webpack-pluginПлагин для связывания ссылок HTML с нашими результатами сборки.
npm install html-webpack-plugin -D
Создать файлpublic/index.html
Исправлятьwebpack.config.js
документ
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//...
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html', // 配置输出文件名和路径
template: './public/index.html' // 配置要被编译的html文件
})
]
}
сделай это сноваnpm run build
, будет несколько каталогов distindex.html
и представилbundle.js
.
Сжать html-файлы
Исправлятьwebpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//...
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html', // 配置输出文件名和路径
template: './public/index.html', // 配置要被编译的html文件
hash: true,
// 压缩 => production 模式使用
minify: {
removeAttributeQuotes: true, //删除双引号
collapseWhitespace: true //折叠 html 为一行
}
})
]
}
упаковать css-файл
Мы хотим использовать webpack для сборки css файлов, для этого нам нужно ввести в конфигурацию загрузчик для разбора и обработки CSS файлов:
npm install style-loader css-loader -D
новыйsrc/assets/style/color.css
, Исправлятьwebpack.config.js
документ:
module.exports = {
//...
module: {
/**
* test: 匹配特定条件。一般是提供一个正则表达式或正则表达式的数组
* include: 匹配特定条件。一般是提供一个字符串或者字符串数组
* exclude: 排除特定条件
* and: 必须匹配数组中的所有条件
* or: 匹配数组中任何一个条件,
* nor: 必须排除这个条件
*/
rules: [
{
test: /\.css$/,
include: [path.resolve(__dirname, 'src')],
use: ['style-loader', 'css-loader']
}
]
}
//...
}
После обработки двух вышеперечисленных загрузчиков код CSS будет преобразован в JS.Если нам нужно отдельно разделить файл CSS, нам нужно использоватьmini-css-extract-pluginплагин
Извлечь css в отдельный файл, добавить префикс автоматически
npm i mini-css-extract-plugin postcss-loader autoprefixer -D
Когда мы пишем css, нам неизбежно приходится учитывать проблемы совместимости браузеров, такие какtransform
необходимо добавить префикс браузера для адаптации к другим браузерам. так что используйтеpostcss-loader
Этот загрузчик, следующая соответствующая конфигурация
webpack.config.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
// ...
module: {
rules: [
{
test: /\.css$/,
include: [path.resolve(__dirname, 'src')],
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: [require('autoprefixer')]
}
}
]
}
]
},
plugins: [
//...
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css'
})
]
}
упаковать меньше файлов
Язык препроцессора обычно используется в разработке, здесьless
Например, поless-loader
Может упаковать LESS для файлов CSS
npm install less less-loader -D
новыйsrc/assets/style/index.less
, И вsrc/index.js
введен вimport './assets/style/index.less'
настроитьwebpack.config.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
module: {
rules: [
// ...
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: [require('autoprefixer')] // 添加css中的浏览器前缀
}
},
'less-loader'
]
}
]
}
//...
}
После выполнения команды пакета вы можете найтиindex.less
Стиль, написанный в, будет таким же, какcolor.css
упаковано так жеmain.css
середина.
обновите webpack@v4 и ступайте на яму: Об использованииmini-css-extract-plugin
внимания.
пакет фотографий
npm install file-loader url-loader -D
file-loader:Его можно использовать для обработки многих типов файлов, его основная функция — прямой вывод файла и возврат созданного пути к файлу.
url-loader:Если изображений слишком много, будет отправлено много http-запросов, что снизит производительность страницы.url-loader
Импортированное изображение будет закодировано для создания dataURl. Это эквивалентно переводу данных изображения в строку символов. Затем упаковать эту строку символов в файл, и, наконец, нужно только импортировать этот файл, чтобы получить доступ к картинке. Конечно, если изображение больше, кодирование будет потреблять производительность. следовательноurl-loader
Предусмотрен параметр limit, файлы меньшего размера, чем предельные байты, будут преобразованы в DataURl, а также будут использоваться файлы, превышающие предельный размер.file-loader
Сделать копию.
- url-loader можно рассматривать как расширенную версию file-loader.
- url-loader кодирует изображение в формат base64 и записывает его на страницу, тем самым уменьшая запросы к серверу.
module.exports = {
module: {
rules: [
// ...
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
outputPath: 'images/', //输出到images文件夹
limit: 500 //是把小于500B的文件打成Base64的格式,写入JS
}
}
]
}
]
}
//...
}
Какова связь между загрузчиком URL и загрузчиком файлов?
вообще говоря,url-loader
упакованныйfile-loader
.url-loader
Это не зависит отfile-loader
, даже используяurl-loader
, просто установитеurl-loader
Вот и все, установка не требуетсяfile-loader
,потому чтоurl-loader
встроенныйfile-loader
.
Из приведенного выше введения мы видим, что url-loader работает в двух случаях:
- Если размер файла меньше параметра limit, url-loader преобразует файл в DataURL;
- Если размер файла превышает лимит, url-loader вызовет для обработки file-loader, и параметры также будут напрямую переданы в file-loader. Итак, нам просто нужно установить url-loader.
Связанныйurl-loader
а такжеfile-loader
Анализ:Представление изображения веб-пакета - улучшенный загрузчик файлов: url-loader
настроить бабел
babel-loader
Babel
Это инструмент компиляции JS, который позволяет нам использовать новые функции ES.Мы можем настроить Babel в веб-пакете для написания кода JS с использованием стандартов ES6 и ES7.
Необходимо добавить зависимости, связанные с Babel 7@babel
объем. Основное изменение заключается в том, что пресеты установлены из оригинала.env
заменяется@babel/preset-env
, можно настроитьtargets
, useBuiltIns
и другие параметры используются для компиляции кода, совместимого с целевой средой. вuseBuiltIns
Если установлено"usage"
, Babel введет соответствующий код ES6/ES7 по мере необходимости на основе кода ES6/ES7, используемого в фактическом коде, и целей, которые вы укажете.polyfill
, не вводя его прямо в кодimport '@babel/polyfill'
, чтобы выходной пакет не был слишком большим, и в то же время вы можете уверенно использовать различные новые синтаксические функции.
npm i babel-loader @babel/core @babel/preset-env -D
Номер версии, присвоенный автором здесь, выглядит следующим образом
{
"babel-loader": "^8.0.4",
"@babel/core": "^7.1.2",
"@babel/preset-env": "^7.1.0"
}
-
babel-loader: Преобразование кода ES6 с помощью babel требует использования
babel-loader
- @babel-preset-env: По умолчанию он равен ES2015 + ES2016 + ES2017, что означает, что он преобразует синтаксис ES этих трех версий.
- @babel/core: основная библиотека babel
Новое в корневом каталоге.babelrc
документ
{
"presets": [
[
"@babel/preset-env",
{
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
},
"useBuiltIns": "usage"
}
]
]
}
- Пресеты — это набор пресетов плагинов для удобства.
- Плагины — это инструменты преобразования кода, и babel преобразует код в соответствии с настроенными вами плагинами.
Исправлятьwebpack.config.js
module.exports = {
module: {
rules: [
//...
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader'
}
}
]
}
}
Babel/polyfill и среда выполнения Transform
Babel по умолчанию преобразует только новый синтаксис (синтаксис) JavaScript, а не новые API, такие как глобальные объекты, такие как Iterator, Generator, Set, Maps, Proxy, Reflect, Symbol, Promise, и некоторые методы, определенные для глобальных объектов (например, Object. assign) не будут перекодированы.
-
babel-polyfill: как упоминалось выше, для новых API вам может потребоваться ввести babel-polyfill для совместимости.
-
ключевой момент
- babel-polyfill предназначен для эмуляции полной среды ES2015+ и предназначен для использования в приложениях, а не в библиотеках/инструментах.
- babel-polyfill загрязняет глобальную область видимости
Роль babel-runtime:
- Извлечение вспомогательных функций. При транскодировании ES6 Babel понадобятся некоторые вспомогательные функции, такие как _extend. Babel по умолчанию встраивает эти вспомогательные функции в каждый файл js.Babel предоставляет среду выполнения transform-runtime для «перемещения» этих вспомогательных функций в отдельный модуль babel-runtime, что может уменьшить размер файла проекта.
- Предоставить полифиллы: не загрязняет глобальную область, но не поддерживает методы экземпляра, такие как Array.includes
babel-runtime
Больше похоже на разрозненные модули полифилла, которые нужно вводить отдельно в соответствующие им модули, с помощьюtransform-runtime
Плагины для автоматизации всего этого, что означает, что вы не импортируете связанные вещи в начале файла.polyfill
, вы просто используете,transform-runtime
поможет вам импортировать.
Для разработки приложений непосредственно используйте указанный выше запрос по запросу.polyfill
Решение более удобное, но если это средство разработки или библиотека, то это решение может не подойти (babel-polyfill
вызывая глобальные объекты и встроенные объектыprototype
Если добавить вышеуказанный метод, это вызовет загрязнение глобальной переменной). Babel предлагает другое решениеtransform-runtime
, он потребуется только при компиляцииpolyfill
Код вводит указатель наcore-js
Ссылка (псевдоним) соответствующего модуля в . Что касается конкретных различий и вариантов выбора этих двух схем, вы можете самостоятельно поискать соответствующие руководства, которые не будут здесь подробно описываться.transform-runtime
эталонная схема конфигурации.
- Первая установка зависимостей времени выполнения
npm i @babel/plugin-transform-runtime -D
npm i @babel/runtime -S
Исправлять.babelrc
{
//...
"plugins": ["@babel/plugin-transform-runtime"]
}
Очистите файлы исходного каталога перед упаковкой clean-webpack-plugin
При каждой упаковке будут генерироваться статические ресурсы проекта.При добавлении и удалении некоторых файлов в нашем каталоге dist могут генерироваться некоторые статические ресурсы, которые больше не используются.Webpack не будет автоматически определять, какие ресурсы нужны. Чтобы эти старые файлы также не занимали место при развертывании в рабочей среде, рекомендуется очистить каталог dist перед объединением с webpack.
npm install clean-webpack-plugin -D
Исправлятьwebpack.config.js
документ
const CleanWebpackPlugin = require('clean-webpack-plugin')
module.exports = {
plugins: [new CleanWebpackPlugin(['dist'])]
}
Извлечь общий код
если выa.js
а такжеb.js
все импортныеc.js
файл, этот код является подробным. Проще говоря, зачем извлекать общий код, чтобы уменьшить избыточность кода и повысить скорость загрузки.
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
commons: {
// 抽离自己写的公共代码
chunks: 'initial',
name: 'common', // 打包后的文件名,任意命名
minChunks: 2, //最小引用2次
minSize: 0 // 只要超出0字节就生成一个新包
},
styles: {
name: 'styles', // 抽离公用样式
test: /\.css$/,
chunks: 'all',
minChunks: 2,
enforce: true
},
vendor: {
// 抽离第三方插件
test: /node_modules/, // 指定是node_modules下的第三方包
chunks: 'initial',
name: 'vendor', // 打包后的文件名,任意命名
// 设置优先级,防止和自定义的公共代码提取时被覆盖,不进行打包
priority: 10
}
}
}
}
}
hash
Для чего используется хэш? Результатом каждого пакета может быть один и тот же файл.Так что, когда я выхожу в интернет, нужно ли мне заменять онлайн-js?Как узнать, какой из них самый последний?Обычно мы очищаем кеш. И хеш существует, чтобы решить эту проблему
В настоящее время мы меняем некоторые конфигурации webpack.config.js.
module.exports = {
//...
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[hash:8].js'
},
//...
plugins: [
new MiniCssExtractPlugin({
filename: '[name].[hash:8].css',
chunkFilename: '[id].[hash:8].css'
})
]
}
Уменьшите разрешение разрешения и настройте псевдонимы
если бы мы могли упроститьresolve
настроить, пустьwebpack
При запросе пути к модулю найдите требуемый модуль как можно быстрее, не выполняя дополнительную работу с запросом, а затемwebpack
Скорость сборки также будет выше
module.exports = {
resolve: {
/**
* alias: 别名的配置
*
* extensions: 自动解析确定的扩展,
* 比如 import 'xxx/theme.css' 可以在extensions 中添加 '.css', 引入方式则为 import 'xxx/theme'
* @default ['.wasm', '.mjs', '.js', '.json']
*
* modules 告诉 webpack 解析模块时应该搜索的目录
* 如果你想要添加一个目录到模块搜索目录,此目录优先于 node_modules/ 搜索
* 这样配置在某种程度上可以简化模块的查找,提升构建速度 @default node_modules 优先
*/
alias: {
'@': path.resolve(__dirname, 'src'),
tool$: path.resolve(__dirname, 'src/utils/tool.js') // 给定对象的键后的末尾添加 $,以表示精准匹配
},
extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx'],
modules: [path.resolve(__dirname, 'src'), 'node_modules']
}
}
webpack-dev-serve
Выше упоминалось, как упаковать файлы, но нам нужен локальный сервис в разработке, тогда мы можем использоватьwebpack-dev-server
Запустите простую статическую службу локально для разработки.
webpack-dev-server
Это инструмент, официально предоставляемый веб-пакетом, который может быстро запустить статическую службу на основе текущей конфигурации сборки веб-пакета. когдаmode
дляdevelopment
, буду иметьhot reload
Функция , то есть при изменении файла исходного кода текущая страница будет немедленно обновлена, чтобы вы могли увидеть последний эффект. ...
npm install webpack-dev-server -D
Добавить в скрипты в package.json
"start": "webpack-dev-server --mode development"
Открыть окно локальной службы по умолчаниюhttp://localhost:8080/легко развиваться
Настроить сервер разработки
мы можемwebpack-dev-server
Выполнить целевую настройку
module.exports = {
// 配置开发服务器
devServer: {
port: 1234,
open: true, // 自动打开浏览器
compress: true // 服务器压缩
//... proxy、hot
}
}
- contentBase: корневой каталог, к которому обращается сервер (может использоваться для доступа к статическим ресурсам).
- порт: порт
- open: автоматически открыть браузер
горячая замена модуля
Горячая замена модуля (HMR - Hot Module Replacement
) заменяет, добавляет или удаляет модули во время работы приложения без перезагрузки всей страницы. Скорость разработки существенно ускоряется в основном следующими способами:
- Сохранение состояния приложения, которое теряется при полной перезагрузке страницы.
- Обновляйте только изменения, чтобы сэкономить драгоценное время разработки.
- Настройка стилей выполняется быстрее — почти эквивалентно изменению стилей в отладчике браузера.
над намиnpm start
После однократного изменения файла страница будет обновлена один раз. На этом пути есть большая проблема, например, мы используемredux
, vuex
Дождитесь плагина и сохраните его на странице, как только страница обновится.redux
, vuex
Вещи в нем будут потеряны, что очень вредит нашему развитию.
HMR взаимодействует с webpack-dev-server, сначала настраиваем webpack.config.js
const webpack = require('webpack')
module.exports = {
devServer: {
//...
hot: true
},
plugins: [
new webpack.HotModuleReplacementPlugin()
//...
]
}
Это не работает после настройки, потому что веб-пакет не знает, где вы хотите обновить, изменитьsrc/index.js
файл, добавить
if (module.hot) {
module.hot.accept()
}
перезапустить службу,npm start
После этого измените введениеindex.js
файл, страница больше не будет обновляться, что реализует HMR
Но есть проблема, вы изменяете css/less и другие файлы стилей не меняются, что?
HMR для изменения таблицы стилей требует помощиstyle-loader
, тогда как ранее мы использовалиMiniCssExtractPlugin.loader
, с этим легко справиться, просто измените одно из правил, мы можем попробовать изменить
module.exports = {
module: {
rules: [
{
test: /\.less$/,
use: [
// MiniCssExtractPlugin.loader,
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: [require('autoprefixer')] // 添加css中的浏览器前缀
}
},
'less-loader'
]
}
]
}
}
Таким образом, когда мы изменим файл less, мы обнаружим, что HMR реализован.
На самом деле мы можем обнаружить, что загрузчик, настроенный под dev,style-loader
, в то время как производственная среда требуетMiniCssExtractPlugin.loader
Это включает в себя настройку между различными средами. в состоянии пройтиprocess.env.NODE_ENV
Получите текущую среду разработки или производственную среду, а затем настройте разные загрузчики, которые здесь не будут раскрываться. В следующей статье будетreact-cli
илиvue-cli
Конфигурация среды разработки и конфигурация рабочей среды разделены на разные файлы.
Эпилог
Знания, упомянутые выше, являются некоторыми базовыми знаниями о веб-пакете, дополнительную информацию можно запросить.webpack китайский официальный сайт, на официальном сайте поговорим подробнее, я говорю здесь самая распространенная конфигурация, но и серия вводных статей, знания задействованы в тексте, там много мест тоже надо доработать, например оптимизировать скорость построения вебпака, уменьшение объема упаковки и т.д. Подождите.
Учитьwebpack 4.0
Это все еще требует больше практики и больше возни.Автор только что изучил настройку веб-пакета.Пожалуйста, укажите на ошибки.
Следующая статья предназначена для настройки скаффолда с нуля, чтобы углубить мое понимание веб-пакета.
Код, сгенерированный этой статьей:webpack-dev
Ссылаться на
- Достаточно начать работу с webpack4.x
- Webpack4 не является глубоким или поверхностным практическим руководством
- конфигурация babel и HMR для webpack
- Настройте шаблон проекта Vue.js с помощью webpack 4 и Babel 7.
- webpack 4: от конфигурации 0 до сборки проекта
- Подробное объяснение веб-пакета
- Напишите конфигурацию webpack4.0 вручную
- Учебное пособие по Webpack 4: от нулевой конфигурации до промышленной версии (2018 г.)
- Демистификация Webpack — единственный способ создать высококачественный интерфейс
- Открытый курс Everest Architect Training webpack4.0 Advanced
- официальный сайт вебпака