Три длинные статьи помогут вам разблокироватьWebpack
, я надеюсь, что прочитав эти три статьи, вы сможетеwebpack
Конфигурация имеет более четкое понимание.
1. Что такое веб-пакет?
webpack
современныйJavaScript
Сборщик статических модулей приложения, когдаwebpack
Когда приложение обрабатывается, рекурсивно строится граф зависимостей, содержащий все модули, необходимые приложению, и эти модули упаковываются в один или несколько модулей.bundle
.
2. Основные концепции веб-пакета
- запись: запись
- вывод: вывод
- загрузчик: преобразователь модулей, используемый для преобразования исходного содержимого модуля в новое содержимое по мере необходимости.
- Плагины: плагины расширения, которые внедряют логику расширения в определенное время в процессе сборки веб-пакета, чтобы изменить результат сборки или сделать то, что вы хотите.
3. Инициализируйте проект
Создайте новую папку, например:webpack-first
(Конечно, вы можете использовать любое имя проекта, которое вам нравится). Рекомендуется обратиться к этой статье для пошаговой настройки, не ищите всегда лучшую конфигурацию в интернете, вы ее освоилиwebpack
После этого конфигурация в соответствии с вашими потребностями является лучшей конфигурацией.
Адрес проекта, соответствующий этой статье (используется при написании этой статьи):GitHub.com/Иветт Л.А. У/И…
использоватьnpm init -y
для инициализации (вы также можете использоватьyarn
).
нужно использоватьwebpack
, то он должен быть установленwebpack
,webpack-cli
:
npm install webpack webpack-cli -D
Ввиду быстрых изменений в передовых технологиях, эта статья основана наwebpack
номер версии:
├── webpack@4.41.5
└── webpack-cli@3.3.10
отwepack V4.0.0
Начинать,webpack
Он работает «из коробки» и может использоваться без внесения каких-либо файлов конфигурации.
новыйsrc/index.js
файл, давайте напишем все, что мы хотим в файле:
//index.js
class Animal {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
const dog = new Animal('dog');
использоватьnpx webpack --mode=development
сборка, по умолчаниюproduction
режиме, чтобы более четко видеть упакованный код, мы используемdevelopment
модель.
Вы можете видеть, что в проекте больше элементовdist
каталог, который содержит упакованный файлmain.js
.
webpack
Существуют конфигурации по умолчанию, такие как файл ввода по умолчанию./src
Пакет по умолчанию дляdist/main.js
. Другие конфигурации по умолчанию можно просмотреть:node_modules/webpack/lib/WebpackOptionsDefaulter.js
.
Проверитьdist/main.js
файл, вы можете видеть,src/index.js
не экранируется в код более низкой версии, что явно не то, что нам нужно.
{
"./src/index.js":
(function (module, exports) {
eval("class Animal {\n constructor(name) {\n this.name = name;\n }\n getName() {\n return this.name;\n }\n}\n\nconst dog = new Animal('dog');\n\n//# sourceURL=webpack:///./src/index.js?");
})
}
4. Переключить JS на более низкую версию
Раньше мы говорилиwebpack
из четырех основных концепций, одна из которыхloader
,loader
Используется для преобразования исходного кода, что нам сейчас и нужно.
Чтобы преобразовать код JS в более низкую версию, нам нужно использоватьbabel-loader
.
babel-loader
Сначала установите егоbabel-loader
npm install babel-loader -D
Кроме того, нам также необходимо настроитьbabel
, для чего мы рассчитываем установку на следующее:
npm install @babel/core @babel/preset-env @babel/plugin-transform-runtime -D
npm install @babel/runtime @babel/runtime-corejs3
Для тех, кто не знаком с настройкой babel7, можно прочитать эту статью:Незабываемые знания Babel7
новыйwebpack.config.js
,следующим образом:
//webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.jsx?$/,
use: ['babel-loader'],
exclude: /node_modules/ //排除 node_modules 目录
}
]
}
}
рекомендоватьloader
уточнитьinclude
илиexclude
, можно указать один из них, т.к.node_modules
Каталог обычно не требует компиляции, после исключения эффективность компиляции значительно повышается.
Здесь мы можем.babelrc
написано наbabel
конфигурацию также можно найти вwebpack.config.js
в конфигурации.
Создать .babelrc.
Конфигурация выглядит следующим образом:
{
"presets": ["@babel/preset-env"],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"corejs": 3
}
]
]
}
Теперь повторно выполняемnpx webpack --mode=development
,Проверитьdist/main.js
, вы обнаружите, что код JS был скомпилирован в младшую версию.
Настроить babel в webpack
//webpack.config.js
module.exports = {
// mode: 'development',
module: {
rules: [
{
test: /\.jsx?$/,
use: {
loader: 'babel-loader',
options: {
presets: ["@babel/preset-env"],
plugins: [
[
"@babel/plugin-transform-runtime",
{
"corejs": 3
}
]
]
}
},
exclude: /node_modules/
}
]
}
}
Вот несколько замечаний:
-
loader
Вам нужно настроитьmodule.rules
середина,rules
представляет собой массив. -
loader
Формат:
{
test: /\.jsx?$/,//匹配规则
use: 'babel-loader'
}
Или это может быть так:
//适用于只有一个 loader 的情况
{
test: /\.jsx?$/,
loader: 'babel-loader',
options: {
//...
}
}
test
Поля соответствуют правилам и обрабатываются для файлов, соответствующих правилам.
use
Существует несколько способов записи поля
- Может быть строкой, такой как выше
use: 'babel-loader'
-
use
Поля могут быть массивом, например обработка файлов CSS,use: ['style-loader', 'css-loader']
-
use
Каждый элемент массива может быть либо строкой, либо объектом, когда нам нужноwebpack
в конфигурационном файлеloader
Для настройки нужно написать его как объект, а в файле объектаoptions
поля, такие как:
rules: [
{
test: /\.jsx?$/,
use: {
loader: 'babel-loader',
options: {
presets: ["@babel/preset-env"]
}
},
exclude: /node_modules/
}
]
Выше мы говорили о том, как скомпилировать JS-код в обратно совместимый код, конечно, вам также могут понадобиться некоторые другиеbabel
плагины и пресеты, такие как@babel/preset-react
,@babel/plugin-proposal-optional-chaining
подожди, но,babel
Конфигурация не является предметом этой статьи, мы переходим к следующей.
Не говорите, что осторожные друзья, даже беспечные друзья должны были узнать, мы используемwebpack
При упаковке он всегда был запущенnpx webpack --mode=development
Это возможноmode
настроен вwebpack.config.js
В этом? Это вполне возможно.
5.mode
Будуmode
увеличить доwebpack.config.js
середина:
module.exports = {
//....
mode: "development",
module: {
//...
}
}
mode
элемент конфигурации, сообщитьwebpack
Используйте встроенные оптимизации для соответствующего режима.
mode
Элемент конфигурации поддерживает следующие две конфигурации:
-
development
:Будуprocess.env.NODE_ENV
Значение установлено наdevelopment
, включитьNamedChunksPlugin
а такжеNamedModulesPlugin
-
production
:Будуprocess.env.NODE_ENV
Значение установлено наproduction
, включитьFlagDependencyUsagePlugin
,FlagIncludedChunksPlugin
,ModuleConcatenationPlugin
,NoEmitOnErrorsPlugin
,OccurrenceOrderPlugin
,SideEffectsFlagPlugin
а такжеUglifyJsPlugin
Теперь мы напрямую используемnpx webpack
Просто скомпилируйте.
6. Просмотрите страницу в браузере
Спустя столько времени я все еще не могу просмотреть страницу в браузере, что явно невыносимо!
Просмотрите страницу, это неизбежно нужноhtml
файл, некоторые друзья могут знать, иногда мы будем указывать файл пакета сhash
Затем каждый раз сгенерированныйjs
Имя файла будет другим, мы не можем позволить нам вручную изменять его каждый разhtml
, разве это не делает нас глупыми~
мы можем использоватьhtml-webpack-plugin
Плагины, чтобы помочь нам сделать эти вещи.
Сначала установите плагин:
npm install html-webpack-plugin -D
новыйpublic
директорию и создать в ней новуюindex.html
файл (использование содержимого файлаhtml:5
Можно быстро сгенерировать)
Исправлятьwebpack.config.js
документ.
//首先引入插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
//...
plugins: [
//数组 放着所有的webpack插件
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html', //打包后的文件名
minify: {
removeAttributeQuotes: false, //是否删除属性的双引号
collapseWhitespace: false, //是否折叠空白
},
// hash: true //是否加上hash,默认是 false
})
]
}
выполнить в это времяnpx webpack
, можно увидетьdist
добавлено в каталогindex.html
Файл, который автоматически вставляется и<script>
Скрипт, вводится js файл после того как мы его упаковали.
Вот еще немного, чтобы сказать,HtmlWebpackPlugin
также предоставляет намconfig
Можно сказать, что эта конфигурация очень полезна.
Магия конфига html-webpack-plugin
Иногда наши строительные леса используются не только нами, но и другими предприятиями.html
Конфигурируемость файла может иметь важное значение, например: В вашей компании есть специальный отдел для предоставления общедоступной заголовочной части / общей хвостовой части M-страницы, встраивания JSSDK, общего JSSDK и т. д., но не каждому бизнесу нужен этот контент.
Функция может соответствовать несколькимjs
илиcss
файл, если он изменяется бизнесом каждый разpublic/index.html
Документы тоже громоздкие. Прежде всего, они должны определить файлы, которые должна представлять каждая функция, а затем они могутindex.html
модифицировать.
На этом этапе мы можем добавить файл конфигурации, и бизнес может быть установлен с помощьюtrue
илиfalse
Чтобы выбрать нужные вам функции, мы сгенерируем соответствующие функции для каждого бизнеса в соответствии с содержимым конфигурационного файла.html
Документы красивые.
Let's Go!
Во-первых, мыpublic
Добавить новый в каталогconfig.js
(назовите файл как хотите), установите его содержимое на:
//public/config.js 除了以下的配置之外,这里面还可以有许多其他配置,例如,pulicPath 的路径等等
module.exports = {
dev: {
template: {
title: '你好',
header: false,
footer: false
}
},
build: {
template: {
title: '你好才怪',
header: true,
footer: false
}
}
}
Теперь давайте изменим нашwebpack.config.js
:
//webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
const isDev = process.env.NODE_ENV === 'development';
const config = require('./public/config')[isDev ? 'dev' : 'build'];
modue.exports = {
//...
mode: isDev ? 'development' : 'production'
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html', //打包后的文件名
config: config.template
})
]
}
Соответственно, нам нужно изменить нашpublic/index.html
Файл (встроенных js и css не существует, просто для иллюстрации):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<% if(htmlWebpackPlugin.options.config.header) { %>
<link rel="stylesheet" type="text/css" href="//common/css/header.css">
<% } %>
<title><%= (htmlWebpackPlugin.options.config.title) %></title>
</head>
<body>
</body>
<% if(htmlWebpackPlugin.options.config.header) { %>
<script src="//common/header.min.js" type="text/javascript"></script>
<% } %>
</html>
process.env
По умолчанию нетNODE_ENV
, настроить нашpackage.json
изscripts
.
Чтобы быть совместимым с Windows и Mac, давайте сначала установим егоcross-env
:
npm install cross-env -D
{
"scripts": {
"dev": "cross-env NODE_ENV=development webpack",
"build": "cross-env NODE_ENV=production webpack"
}
}
Затем мы бежимnpm run dev
и бегиnpm run build
, сравниватьdist/index.html
, можно увидетьnpm run build
,Созданоindex.html
В файле представлены соответствующиеcss
а такжеjs
. и соответствующийtitle
Содержание также отличается.
Вы говорите, что это должно быть использовано здесь?NODE_ENV
судить? Конечно нет, вы пишитеaaa=1
,aaa=2
все (конечно,webpack.config.js
а такжеscripts
должны быть соответствующим образом изменены), но могут быть убиты теми, кто вступит во владение.
БолееHTML-WebPack-Plugin Configuration элемент
Как отобразить эффект в реальном времени в браузере
Сказав так много, я не смог просмотреть эффект в реальном времени в браузере. Вы немного беспокоитесь? Давайте посмотрим, как просмотреть эффект в реальном времени, иначе я не знаю, смогу ли я сопоставьте это правильно.
Без лишних слов сначала установите зависимости:
npm install webpack-dev-server -D
изменить нашpackage.json
документscripts
:
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server",
"build": "cross-env NODE_ENV=production webpack"
},
Выполнить на консолиnpm run dev
, запуск нормальный, а на странице ничего нет. Измените наш JS-код, добавьте некоторый контент на страницу и обновите ее в обычном режиме (то есть ее можно использовать без какой-либо настройки).
Прошу прощения. Это моя винаcontentBase
, Получается, что нет необходимости в сопоставлении, с сомнениями, я снова пошел искать.
Он был настроенhtml-webpack-plugin
на случай, если,contentBase
Это не сработает, а это значит, что я уже был белым соперником, а это грустная история.
Но тогда мы можемwebpack.config.js
в ходе выполненияwebpack-dev-server
Другие настройки, такие как указание номера порта, настройка сообщения консоли браузера, необходимость сжатия и т. д.:
//webpack.config.js
module.exports = {
//...
devServer: {
port: '3000', //默认是8080
quiet: false, //默认不启用
inline: true, //默认开启 inline 模式,如果设置为false,开启 iframe 模式
stats: "errors-only", //终端仅打印 error
overlay: false, //默认不启用
clientLogLevel: "silent", //日志等级
compress: true //是否启用 gzip 压缩
}
}
- включить
quiet
, на консоль не будет выведено ничего, кроме исходной информации о запуске. Это также означает, что изwebpack
Ошибки или предупреждения не видны в консоли ------ Я бы не стал это включать, посмотреть журнал ошибок и сделать молоток -
stats
: "только ошибки", печатать только в терминалеerror
, обратите внимание, что при включенииquiet
илиnoInfo
, это свойство не действует. ————— Это свойство лично очень полезно, особенно когда мы его включаемeslint
или использоватьTS
При разработке слишком много информации о компиляции находится в терминале, что будет нам мешать. - включить
overlay
Впоследствии, при возникновении ошибки компиляции, ошибка будет выводиться в полноэкранном режиме окна браузера, который по умолчанию отключен.
-
clientLogLevel
: при использовании встроенного режима сообщения будут отображаться в консоли браузера, например, перед перезагрузкой, перед ошибкой или при включенной горячей замене модуля. Если вам не нравится видеть эту информацию, вы можете установить ее наsilent
(none
скоро уберут).
Эта статья не предназначена для уточненияwebpack-dev-server
конфигурация, так что я не буду много говорить здесь. оwebpack-dev-server
Дополнительные конфигурации могут бытьНажмите, чтобы просмотреть.
Осторожные друзья, возможно, обнаружили небольшую проблему, мы находимся вsrc/index.js
добавить предложениеconsole.log('aaa')
:
class Animal {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
const dog = new Animal('dog');
console.log('aaa');
затем пройтиnpm run dev
Проверьте эффект, вы найдете:
Это явно не соответствующий номер строки в нашем исходном коде.Если вы нажмете на нее, вы обнаружите, что код был скомпилирован.Мой текущий код очень простой, и видно, что после усложнения кода проекта он "маме" будет трудно его прочитать и скомпилировать. , это не способствует нашей разработке и отладке, не то, что мы хотим, мы определенно все еще надеемся, что сможем напрямую соответствовать исходному коду.
7.devtool
devtool
В , есть некоторые настройки, которые могут помочь нам сопоставить скомпилированный код с исходным исходным кодом. Различные значения могут существенно повлиять на скорость сборки и пересборки.
Для меня достаточно иметь возможность найти строку исходного кода, поэтому комплексную скорость сборки, в режиме разработки, я поставилdevtool
Значениеcheap-module-eval-source-map
.
//webpack.config.js
module.exports = {
devtool: 'cheap-module-eval-source-map' //开发环境下使用
}
Производственная среда может использоватьnone
илиsource-map
,использоватьsource-map
в конечном итоге будет упакован отдельно.map
файл, мы можем использовать сообщение об ошибке, и этоmap
файл, проанализируйте ошибку и найдите исходный код.
source-map
а такжеhidden-source-map
будет упакован для создания отдельного.map
файл, разница в том,source-map
В упакованный файл js будет добавлен справочный комментарий, чтобы средства разработки знали, где его найти.hidden-source-map
Никакие справочные комментарии не будут добавлены к упакованному js.
Однако мы, как правило, напрямую не.map
Файл развертывается в CDN, потому что он будет напрямую сопоставлен с исходным кодом, желательно.map
Файл отправляется в систему анализа ошибок, а затем на основе сообщенной информации об ошибке, она напрямую анализируется на расположение исходного кода ошибки.
Вы также можете установить другиезначение инструмента разработки, вы можете использовать разные значения для построения различий контраста.
Теперь мы сказалиhtml
,js
, и вы также можете увидеть эффект в реальном времени в браузере.Теперь я должен сказать, что один из трех гигантов разработки страницcss
.
8. Как быть с этим файлом стилей
webpack
не может быть обработано напрямуюcss
, требуется помощьloader
. если.css
, нам нужноloader
Обычно бывают:style-loader
,css-loader
, учитывая вопросы совместимости, также необходимоpostcss-loader
, и еслиless
илиsass
Если тебе нужноless-loader
а такжеsass-loader
, настройте его здесьless
а такжеcss
документ(sass
, использоватьsass-loader
только что):
Сначала установите зависимости, которые вам нужно использовать:
npm install style-loader less-loader css-loader postcss-loader autoprefixer less -D
//webpack.config.js
module.exports = {
//...
module: {
rules: [
{
test: /\.(le|c)ss$/,
use: ['style-loader', 'css-loader', {
loader: 'postcss-loader',
options: {
plugins: function () {
return [
require('autoprefixer')({
"overrideBrowserslist": [
">0.25%",
"not dead"
]
})
]
}
}
}, 'less-loader'],
exclude: /node_modules/
}
]
}
}
Протестируй, создай новыйless
документ,src/index.less
:
//src/index.less
@color: red;
body{
background: @color;
transition: all 2s;
}
Затем импортируйте это в файл вводаless
:
//src/index.js
import './index.less';
Мы изменили файл конфигурации и перезапустили службу:npm run dev
. Вы можете видеть, что цвет фона страницы изменился на красный.
Хорошо, давайте кратко поговорим о приведенной выше конфигурации:
-
style-loader
динамически созданныйstyle
лейбл, будетcss
вставить вhead
середина. -
css-loader
ответственный за обработку@import
И другие заявления. -
postcss-loader
а такжеautoprefixer
, Автоматически генерировать префиксы совместимости браузеров - 2020, никто не должен писать префиксы браузеров самостоятельно -
less-loader
Отвечает за обработку компиляции.less
файл, преобразовать его вcss
Здесь между намиwebpack.config.js
написалautoprefixer
Требуется совместимый браузер только для презентационных целей. Рекомендуется создавать в корневом каталоге.browserslistrc
, пропишите в этом файле соответствующие правила, кромеautoprefixer
использовать снаружи,@babel/preset-env
,stylelint
,eslint-plugin-conmpat
можно поделиться.
Уведомление:
loader
Порядок выполнения выполняется справа налево, то есть последнийloader
Выполнить сначала, вышеloader
Порядок выполнения такой:less-loader
---> postcss-loader
---> css-loader
---> style-loader
Конечно,loader
На самом деле есть еще один параметр, вы можете изменить приоритет,enforce
параметр, значение которого может быть:pre
(приоритет) илиpost
(отставание в исполнении).
Теперь мы можем справиться.less
файл,.css
В файле нужно только изменить правила сопоставления, удалитьless-loader
Вот и все.
Теперь все выглядит идеально, но допустим, мы используем локальное изображение в нашем файле, например:
body{
background: url('../images/thor.png');
}
Вы обнаружите, что сообщается об ошибке, так что же нам делать с изображениями или некоторыми другими файлами локальных ресурсов? Не думай об этом, он тебе обязательно понадобится сноваloader
вне.
9. Обработка файла изображения/шрифта
мы можем использоватьurl-loader
илиfile-loader
для обработки локальных файлов ресурсов.url-loader
а такжеfile-loader
функция похожа, ноurl-loader
Вы можете указать, что когда размер файла меньше указанного предела, возвращатьDataURL
Следовательно, люди предпочли использоватьurl-loader
.
Сначала установите зависимости:
npm install url-loader -D
Установитьurl-loader
Когда консоль предложит вам, вам также необходимо установитьfile-loader
, слушайте другие и устанавливайте его (новая версияnpm
не будет устанавливаться автоматическиpeerDependencies
):
npm install file-loader -D
существуетwebpack.config.js
настроить в:
//webpack.config.js
module.exports = {
//...
modules: {
rules: [
{
test: /\.(png|jpg|gif|jpeg|webp|svg|eot|ttf|woff|woff2)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10240, //10K
esModule: false
}
}
],
exclude: /node_modules/
}
]
}
}
установить здесьlimit
имеет размер значения 10240, т.е. размер ресурса меньше10K
, преобразовать ресурс вbase64
, более 10 КБ, скопируйте изображение вdist
содержание.esModule
Установить какfalse
,иначе,<img src={require('XXX.jpg')} />
Будет появляться<img src=[Module Object] />
Преобразовать ресурс вbase64
может уменьшить количество сетевых запросов, ноbase64
Данные больше, если слишком много ресурсовbase64
, приведет к замедлению загрузки, поэтому установитеlimit
значение, необходимо учитывать и то, и другое.
По умолчанию имя файла сгенерированного файла является содержимым файла.MD5
Хэш-значение сохранит исходное расширение указанного ресурса.Например, имя файла, соответствующее моему изображению выше (thor.jpeg), выглядит следующим образом:
Конечно, вы также можетеoptions
параметры изменены.
//....
use: [
{
loader: 'url-loader',
options: {
limit: 10240, //10K
esModule: false,
name: '[name]_[hash:6].[ext]'
}
}
]
Перекомпилируйте, проверьте элемент в браузере, вы можете увидеть, что имя изображения стало таким:thor_a5f7c0.jpeg
.
Когда локальных ресурсов много, иногда хочется, чтобы они были упакованы в папку, что тоже очень просто, нужно толькоurl-loader
изoptions
указано вoutpath
,Такие как:outputPath: 'assets'
, созданный каталог выглядит следующим образом:
болееurl-loader
конфигурация можетПроверить
здесь, немногохорошее времячувство.
Но это еще не конец, если выpublic/index.html
В файле используем локальный образ, например, изменим егоpublic/index.html
:
<img src="./a.jpg" />
Перезапустите локальную службу, хотя консоль не сообщит об ошибке, но вы обнаружите, что эта картинка вообще не может загрузиться в браузере, почему? Потому что после сборки картинку вообще нельзя найти по относительному пути.
Как? Как это решить?
10. Обработка локальных изображений в html
Установитьhtml-withimg-loader
чтобы решить это.
npm install html-withimg-loader -D
Исправлятьwebpack.config.js
:
module.exports = {
//...
module: {
rules: [
{
test: /.html$/,
use: 'html-withimg-loader'
}
]
}
}
тогда в нашемhtml
Введите файл для проверки (адрес картинки написан вами, здесь просто указание):
<!-- index.html -->
<img src="./thor.jpeg" />
Перезапустите локальную службу, изображение не загружается, если вы осмотрите элемент, вы обнаружите, что адрес изображения показывает{"default":"assets/thor_a5f7c0.jpeg"}
.
я в настоящее времяfile-loader
Версия 5.0.2, после версии 5 нужно повышатьesModule
Атрибуты:
//webpack.config.js
module.exports = {
//...
modules: {
rules: [
{
test: /\.(png|jpg|gif|jpeg|webp|svg|eot|ttf|woff|woff2)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10240, //10K
esModule: false
}
}
]
}
]
}
}
Затем перезапустите локальную службу, и все готово.
использование словhtml-withimg-loader
После обработки изображенияhtml
нельзя использовать вvm
, ejs
шаблон, если вы хотите продолжить вhtml
используется в<% if(htmlWebpackPlugin.options.config.header) { %>
Такой синтаксис, но, надеюсь, использовать локальные образы, можно? Я хочу и рыбу, и медвежьи лапы.Хотя много раз хорошо есть рыбу, но здесь все в порядке.Напишите адрес картинки, как показано ниже, и удалите ее.html-withimg-loader
можно настроить.
<!-- index.html -->
<img src="<%= require('./thor.jpeg') %>" />
Изображение загружается нормально, и<% %>
Грамматика также может использоваться как обычно, ху-ху-ху~~~
несмотря на то что,webpack
Конфигурация по умолчанию очень полезна, но иногда у нас есть некоторые другие потребности, например, у нас есть более одного файла ввода, что нам делать в это время?
11. Входная конфигурация
Поля записи:entry
//webpack.config.js
module.exports = {
entry: './src/index.js' //webpack的默认配置
}
entry
Значение может быть строкой, массивом или объектом.
О случае строк говорить больше не нужно, то есть запись ведется на основе соответствующего файла.
Когда это массив, это означает, что есть «несколько основных записей».Если вы хотите внедрить несколько файлов зависимостей вместе, вы настроите его следующим образом. Например:
entry: [
'./src/polyfills.js',
'./src/index.js'
]
polyfills.js
Файл может просто представить некоторыеpolyfill
,Напримерbabel-polyfill
,whatwg-fetch
и т. д., его нужно импортировать спереди (я так настроил в webpack2).
Когда это объект? Не торопитесь, я расскажу об этом позже при настройке нескольких страниц.
12. Экспорт конфигурации
настроитьoutput
варианты управленияwebpack
Как выводить скомпилированные файлы.
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'), //必须是绝对路径
filename: 'bundle.js',
publicPath: '/' //通常是CDN地址
}
}
Например, ваш окончательный скомпилированный код развернут в CDN, а адрес ресурса: 'https://AAA/BBB/YourProject/XXX', то произведенныйpublicPath
Настроен как://AAA/BBB/
.
При компиляции его можно не настраивать, или настраивать как/
. можно упомянуть передconfig.js
указано вpublicPath
(config.js
дифференцированный вdev
а такжеpublic
), конечно, вы также можете различать разные среды и указывать файлы конфигурации для установки или в соответствии сisDev
поле для установки.
Кроме того, учитывая проблему кэширования CDN, мы обычно добавляем имя файлаhash
.
//webpack.config.js
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'), //必须是绝对路径
filename: 'bundle.[hash].js',
publicPath: '/' //通常是CDN地址
}
}
если ты чувствуешьhash
Если строка слишком длинная, вы также можете указать длину, напримерbundle.[hash:6].js
. использоватьnpm run build
Проверьте это.
Возникла проблема, каждый раз при изменении файла происходит его переупаковка, в результате чегоdist
Файлов в каталоге становится все больше. Было бы неплохо очищать каталог перед каждым пакетом. Можно ли это сделать? Должен уметь!
13. Очищайте каталог dist перед каждой упаковкой
Да и вообще мне лень чистить вручную.Пока ты достаточно ленив,всегда найдёшь хороший способ.Ленивые люди способствуют техническому прогрессу. Здесь нам понадобится плагин:clean-webpack-plugin
Зависимости установки:
npm install clean-webpack-plugin -D
до,clean-webpack-plugin
Он экспортируется по умолчанию, а не сейчас, поэтому нужно быть внимательным при цитировании. Кроме того, параметр, который принимает конструктор, теперь является объектом, для которого можно использовать значение по умолчанию.
//webpack.config.js
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
//...
plugins: [
//不需要传参数喔,它可以找到 outputPath
new CleanWebpackPlugin()
]
}
Теперь вы изменяете файл и воспроизводите сборку, сгенерированное значение хэша отличается от предыдущего dist, но потому что каждый разclean-webpack-plugin
поможет нам очистить волну в первую очередь.dist
каталог, поэтому файлов не будет слишком много, и глупо различать, какой из них является вновь созданным файлом.
Я надеюсь, что папка в Dist Directory не будет опустошена
Однако иногда мы не хотим, чтобы всеdist
Каталоги все пустые, например, мы не хотим удалять их каждый раз при упаковкеdll
каталог иdll
Как насчет файлов или подкаталогов в каталоге?
clean-webpack-plugin
дает нам параметрыcleanOnceBeforeBuildPatterns
.
//webpack.config.js
module.exports = {
//...
plugins: [
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns:['**/*', '!dll', '!dll/**'] //不删除dll目录下的文件
})
]
}
также,clean-webpack-plugin
Есть и другие настройки, но я ими мало пользуюсь, можете посмотретьclean-webpack-plugin
На данный момент мы завершили базовую настройку. Но это не идеально, или иногда у нас будут другие потребности. Далее О насwebpack
В статье о конфигурации будут рассмотрены некоторые другие случаи.
использованная литература
наконец
Если эта статья была вам полезна, поставьте лайк ей.
Не можешь посмотреть?
Подробно разблокируйте серию Webpack (дополнительно) Позвольте вам подробно разблокировать серию Webpack (оптимизация)
Обратите внимание на мой публичный номер
Добро пожаловать в группу технического обмена, пожалуйста, не добавляйте милую рекламу.