предисловие
Давным-давно, когда наш фронтенд был просто обрезчиком страниц, мы разрабатывали html-страницу и обычно сталкивались с такими ситуациями:
- Необходимо импортировать более десятка файлов css и js, а поскольку они имеют зависимости друг от друга, порядок введения не может быть хаотичным.
- традиционный
html+css+js
Метод развития не может быть использован хорошоless/scss
и т. д. препроцессоры css, а такжеES6+
расширенный синтаксис. - Плохая возможность повторного использования кода и плохая ремонтопригодность.
На данный момент необходим инструмент для решения этих проблем, и появился веб-пакет.
webpack можно рассматривать как инструмент упаковки модулей: он объединяет различные статические ресурсы (такие как:javaScript
файл изображения,css
файлы и т. д.) в виде модулей, он может выполнять такие операции, как оптимизация синтаксического анализа и преобразование этих модулей, и, наконец, упаковывать их вместе, а упакованные файлы можно использовать в браузерах.
связанное предложение
Мой гитхаб:github.com/Michael-lzg
Преимущества веб-пакета:
- Преобразование кода:
typeScript
скомпилировано вjavaScript
,scss,less
скомпилировано вcss
. - Оптимизация файлов: сжатие
javaScript
,css
,html
код для сжатия и объединения изображений. - Разделение кода: Извлеките общий код нескольких страниц, извлеките код, который не нужно выполнять на первом экране, и дайте ему возможность загружаться асинхронно.
- Слияние модулей: в модульном проекте будет много модулей и файлов, и для классификации и объединения модулей в один файл требуется функция сборки.
- Автоматическое обновление: отслеживайте изменения локального исходного кода, автоматически перестраивайте и обновляйте браузер.
- Сильная расширяемость и совершенный механизм подключаемых модулей.
Процесс упаковки веб-пакета:
- Используйте babel для завершения преобразования кода и создания зависимостей для одного файла.
- Начать рекурсивный анализ с записи и сгенерировать граф зависимостей
- Упакуйте каждый упомянутый модуль в немедленно выполняемую функцию
- Запишите окончательный файл пакета в bundle.js
Четыре ядра Webpack:
- запись: исходный файл записи js
- вывод: сгенерированный файл
- загрузчик: для обработки файлов
- Плагины: Плагины, более мощные, чем загрузчик, могут использовать больше API веб-пакетов.
Entry
Какой модуль должен использовать webpack в качестве входного файла, чтобы начать построение своего внутреннего графа зависимостей. После входа в точку входа webpack узнает, какие модули и библиотеки зависят от точки входа (напрямую и косвенно), каждая зависимость затем обрабатывается и, наконец, выводится в файл с именем bundles.
Одиночная запись: запись представляет собой строку
module.exports = {
entry: './src/index.js'
}
Несколько записей: запись является объектом
module.exports = {
entry: {
index: './src/index.js',
manager: './src/manager.js'
}
}
Output
Сообщите веб-пакету, куда выводить созданные им пакеты и как назвать эти файлы, которые можно указать в файле конфигурации веб-пакета.
Конфигурация с одним входом
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js’,
path: __dirname + '/dist'
}
};
Многовходовая конфигурация
module.exports = {
entry: {
app: './src/app.js',
search: './src/search.js'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
}
Обеспечьте уникальные имена файлов с заполнителем [имя]
Loader
loader
Позволятьwebpack
способен справиться с темиjavaScript
документ(webpack
только понятьjavaScript
).loader
Может конвертировать все типы файлов вwebpack
Действительный модуль, который может обрабатывать, тогда вы можете воспользоватьсяwebpack
возможности упаковки для их обработки.
Особенности загрузчика
- Ответственность загрузчика едина, и необходимо выполнить только одно преобразование.
- Загрузчик на самом деле является модулем Node.js, которому необходимо экспортировать функцию.
- Загрузчики всегда вызываются справа налево.
Часто используемые загрузчики
стиль обработки
-
css-loader
: загрузить файл .css, -
style-loader
: используйте тег стиля, чтобыcss-loader
Внутренние стили, внедренные в нашу html-страницу -
less-loader, sass-loader
: Препроцессор парсинга css
обрабатывать js
- Позволяет использовать последний код js (ES6, ES7...)
- Позволяет использовать языки, которые были расширены на основе js, такие как JSX React;
обрабатывать файлы
При обработке ресурсов изображений мы обычно используем два загрузчика:file-loader
илиurl-loader
, главное различие между ними.url-loader
Вы можете установить ограничение размера изображения. Когда изображение превышает ограничение, его поведение эквивалентноfile-loader
, а когда изображение не превышает предела, изображение будетbase64
Упакован в css файлы в виде для уменьшения количества запросов
Обработка файлов .vue
vue-loader
даwebpack
модуль загрузчика, который позволяет нам использовать.vue
формат файла для записи однофайловых компонентов. Файл компонента, состоящий из одного файла, состоит из трех частей: шаблонов, сценариев и стилей.vue-loader
модуль позволяетwebpack
Используйте отдельный модуль загрузчика (например,sass 或 scss 加载器
) для извлечения и обработки каждой части. Этот параметр позволяет нам использовать.vue
файл для беспрепятственной записи программ.
разработать загрузчик
Требование: рукописныйloader
,Буду'kobe'
Перевести в'Black Mamba'
. Конечно, вы можете проектировать в соответствии с вашими потребностями. Это просто для объяснения метода.
1. Пишем загрузчик
В корневом каталоге создайте новый каталогkobe-loader
как мы пишемloader
имя, выполнитьnpm init -y
команду, создайте новый модульный проект, а затем создайте новыйindex.js
Соответствующий исходный код выглядит следующим образом:
module.exports = function(content) {
return content && content.replace(/kobe/gi, 'Black Mamba')
}
2. Модуль регистрации
Обычно мы устанавливалиloader
Отnpm
Скачайте и установите, но мы можемkobe-loader
Использовать в каталогеnpm link
Свяжите исходный код разрабатываемого локального модуля с исходным кодом проекта, не выпуская модульnode_modules
каталог, чтобы проект мог напрямую использовать локальныйnpm
модуль.
npm link
Затем выполните следующую команду в корневом каталоге проекта, чтобы зарегистрироваться в глобальном локальномnpm
Модуль связан с проектомnode_modules
Вниз
$ npm link kobe-loader
После успешной регистрации мы можемnode_modules
Соответствующий каталог можно найти вloader
.
3. Настроить загрузчик в вебпаке
существуетwebpack.base.conf.js
Добавьте следующую конфигурацию
{
test:/\.js/,
loader: 'kobe-loader'
}
На данный момент пишем под всеми js файлами'kobe'
заменить все на'Black Mamba'
.
4. Параметры конфигурации
Вышеупомянутая копия является жестко запрограммированной заменой.Если я хочу изменить ее с помощью элементов конфигурации, я могу внести следующие коррективы в загрузчик
// custom-loader/index.js
var utils = require('loader-utils')
module.exports = function (content) {
const options = utils.getOptions(this)
return content && content.replace(/kobe/gi, options.name)
}
// webpack.base.conf.js
{
test:/\.js/,
use: {
loader: 'kobe-loader',
options: {
name: 'kobe',
}
}
}
Plugin
Функциональные модули, которые фокусируются на конкретной задаче в процессе компиляции webpack, можно назвать плагинами.
Особенности плагина
- это отдельный модуль
- Модуль предоставляет функцию js внешнему миру.
- прототип функции
(prototype)
определяет инъекцию наcompiler
объектapply
методapply
Функция должна пройтиcompiler
Объект смонтированwebpack
Крюк событий, Clooth Callback может получить текущую компиляциюcompilation
Объект, если это плагин асинхронной компиляции, вы можете получить обратный вызовcallback
- Завершите процесс пользовательской субкомпиляции и обработайте
complition
внутренние данные объекта - Если плагин скомпилирован асинхронно, он будет выполнен после завершения обработки данных.
callback
Перезвоните.
Общие плагины
-
HotModuleReplacementPlugin
代码热替换。 потому чтоHot-Module-Replacement
Горячее обновление зависит отwebpack-dev-server
, последний - обновить файл пакета или перезагрузить, чтобы обновить всю страницу при изменении файла пакета,HRM
заключается в обновлении только измененной части. -
HtmlWebpackPlugin
, чтобы сгенерировать html-файл. в вебпакеentry
Настроены связанные фрагменты записей иextract-text-webpack-plugin
Извлеченные стили css вставляются в предоставленный плагинtemplate
илиtemplateContent
Создайте HTML-файл на основе содержимого, указанного в элементе конфигурации. Конкретный метод вставки заключается в вставке стиляlink
вставить вhead
элемент,script
вставить вhead
илиbody
середина. -
ExtractTextPlugin
, будет генерировать файл css вместо встроенного. Основная цель этого плагина — извлечь стиль css и предотвратить нарушение загрузки стиля страницы, вызванное упаковкой стиля в js. -
NoErrorsPlugin
Сообщите об ошибке без выхода из процесса WebPack -
UglifyJsPlugin
, код некрасивый, и открывать его в процессе разработки не рекомендуется.uglifyJsPlugin
Он используется для сжатия файлов js, тем самым уменьшая размер файлов js и ускоряя скорость загрузки.uglifyJsPlugin
Это замедлит скорость компиляции веб-пакета, поэтому рекомендуется просто отключить его во время разработки и снова включить во время развертывания. Несколько html совместно используют файл js (чанк), доступныйCommonsChunkPlugin
-
purifycss-webpack
. При упаковке и компиляции неиспользуемый css в странице и js можно исключить, так что при использовании сторонней библиотеки классов загружаются только используемые классы, что сильно уменьшает размер css -
optimize-css-assets-webpack-plugin
Сжатие css, оптимизация структуры css, облегчение загрузки и рендеринга веб-страниц. -
webpack-parallel-uglify-plugin
Плагин UglifyJS может работать параллельно, что может эффективно сократить время сборки.
разработать плагин
- В процессе компиляции Webpack будет транслировать множество событий, таких как запуск, компиляция, выполнение, сбой и т.д., посмотреть можно на официальном сайте;
- Механизм потока событий Webpack применяет режим наблюдателя, а подключаемые модули, которые мы пишем, могут прослушивать события Webpack для запуска соответствующей логики обработки;
- Многие API, предоставляемые Webpack, можно использовать в плагинах, например, для чтения выходных ресурсов, блоков кода, модулей и зависимостей;
1. Напишите плагин
В корневом каталоге создайте новый каталог my-plugin в качестве имени нашего плагина, выполните команду npm init -y, создайте новый модульный проект, а затем создайте новый файл index.js Соответствующий исходный код выглядит следующим образом :
class MyPlugin {
constructor(doneCallback, failCallback) {
// 保存在创建插件实例时传入的回调函数
this.doneCallback = doneCallback
this.failCallback = failCallback
}
apply(compiler) {
// 成功完成一次完整的编译和输出流程时,会触发 done 事件
compiler.plugin('done', stats => {
this.doneCallback(stats)
})
// 在编译和输出的流程中遇到异常时,会触发 failed 事件
compiler.plugin('failed', err => {
this.failCallback(err)
})
}
}
module.exports = MyPlugin
2. Модуль регистрации
В соответствии с описанным выше методом мы используем ссылку npm в каталоге my-plugin, чтобы связать исходный код разрабатываемого локального модуля с каталогом node_modules проекта без публикации модуля, чтобы проект мог напрямую использовать локальные модули npm. .
npm link
Затем выполните следующую команду в корневом каталоге проекта, чтобы связать глобальный локальный модуль npm, зарегистрированный в node_modules проекта.
$ npm link my-plugin
После успешной регистрации мы можем найти соответствующий плагин в каталоге node_modules.
3. Настройте плагин
Добавьте следующую конфигурацию в webpack.base.conf.js.
plugins: [
new MyPlugin(
stats => {
console.info('编译成功!')
},
err => {
console.error('编译失败!')
}
)
]
Выполните команду запуска или компиляции, чтобы убедиться, что наш плагин работает.