предисловие
Давным-давно, когда наш фронтенд был просто обрезчиком страниц, мы разрабатывали 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('编译失败!')
}
)
]
Выполните команду запуска или компиляции, чтобы убедиться, что наш плагин работает.