jsliang Job Search Series - 31 - Webpack

Webpack опрос

каталог

Чем отличается передок без закидывания от соленой рыбы?

содержание
каталог
2 Предисловие
Три Что такое Webpack
Четыре основных концепции Webpack
Пять процессов сборки Webpack
шесть вход
Семь выходов
восемь погрузчик
8.1 Общий загрузчик для обработки файлов
8.2 Общий загрузчик для проверки синтаксиса
8.3 Общий загрузчик для обработки HTML-кода
8.4 Часто задаваемые вопросы об обработке кода CSS
8.5 О распространенных загрузчиках, обрабатывающих код JS
Девять плагинов
9.1 Общие плагины
9.2 Плагины, повышающие эффективность
Десять различий между загрузчиком и плагином
одиннадцать решить
12 Настройка Webpack с 0
12.1 Технический отбор
12.2 Конфигурация загрузчика — обработка CSS, Меньше
12.3 Конфигурация загрузчика — обработка изображений
12.4 Конфигурация загрузчика — работа со шрифтами
12.5 Конфигурация загрузчика – общая схема многостраничной упаковки MPA
12.6 SourceMap
12.7 WebpackDevServer
12.8 парсинг бабеля
12.9 React
12.10 Оптимизация производительности
12.11 Прочее
Тринадцатое дополнение к знаниям: ленивая загрузка
13.1 Разделение кода
13.2 Принцип реализации
13.3 Загрузка Vue по запросу
Дополнение к четырнадцати знаниям: горячее обновление
14.1 Включить горячее обновление
14.2 Принцип горячего обновления
Пятнадцать дополнений к знаниям: 3 хэша
Дополнение к шестнадцати знаниям: исходная карта
Приложение к знаниям Seventeen: принцип упаковки Webpack
Восемнадцать ссылок
18.1 Серия статей Webpack
18.2 Оптимизация производительности Webpack
18.3 Scope Hoisting
18.4 Tree Shaking
18.5 ленивая загрузка

2 Предисловие

Назад к содержанию

Это 2020 год, и кажется немного неразумным не заказывать Webpack.

Но на самом деле, если он не будет отнесен к такой группе, как [Architecture Group], я чувствую, что вероятность связаться с Webpack будет меньше.

подобноjsliangВ предыдущей компании у меня не было возможности связаться с Webpack, я использовал это решение, которое уже настроили другие, просто чтобы быть мальчиком-бизнесменом~

Три Что такое Webpack

Назад к содержанию

Webpack — это сборщик статических модулей для современных приложений JavaScript (module bundler).

Когда Webpack обрабатывает приложение, он рекурсивно строит граф зависимостей (dependency graph), который содержит все модули, необходимые приложению, а затем упаковывает все эти модули в один или несколькоbundle.

Итак, его суть — упаковщик модулей, задачей которого является упаковка каждого модуля в соответствующийbundle.

Четыре основных концепции Webpack

Назад к содержанию

  • mode:модель. В соответствии с режимом разработки, режимом производства и т. д.
  • entry:Вход
  • output:Экспорт
  • loader: Преобразователь модулей, который используется для преобразования исходного содержимого модуля в новое содержимое по мере необходимости. Вебпак для.jpg,.txtКогда содержимое не может быть обработано, необходимоfile-loader,url-loaderжду помощи.
  • plugins: расширения, которые внедряют логику расширения в определенное время в процессе сборки Webpack для изменения результатов сборки или выполнения других нужных вам действий.

Пять процессов сборки Webpack

Назад к содержанию

Webpack подобен производственной линии, проходящей ряд процессов для преобразования исходных файлов в выходные данные.

Ответственность каждого процесса обработки на этой производственной линии едина, и между несколькими процессами существует отношение зависимости.Только после завершения текущей обработки он может быть передан следующему процессу для обработки.

WebpackТекущий процесс является последовательным процессом, и следующие процессы будут выполняться последовательно от начала до конца:

  • Параметры инициализации: из файла конфигурации иShellПрочитайте и объедините параметры в операторе, чтобы получить окончательный параметр
  • начать компиляцию: Инициализировать с параметрами, полученными на предыдущем шаге.Compilerобъект, загружает все настроенные плагины, выполняетrunметод начинает выполнять компиляцию
  • Определить вход: в соответствии с конфигурациейentryНайти все входные файлы
  • модуль компиляции: Начиная с файла ввода, вызывать все настроенныеLoaderПереведите модуль, найдите модули, от которых зависит модуль, а затем повторите этот шаг, пока все файлы, от которых зависит запись, не будут обработаны на этом шаге.
  • полная компиляция модуля: используется после шага 4LoaderПосле перевода всех модулей получите окончательный контент каждого модуля после перевода и зависимости между ними
  • выходной ресурс: Согласно зависимостям между записью и модулем, он собирается в модуль, содержащий несколько модулей один за другим.Chunk, затем поставьте каждыйChunkПреобразованный в отдельный файл и добавленный в список вывода, этот шаг является последней возможностью изменить содержимое вывода.
  • вывод завершен: После определения содержимого вывода определите путь вывода и имя файла в соответствии с конфигурацией и запишите содержимое файла в файловую систему.

Проще говоря:

  • инициализация: запустить сборку, прочитать и объединить параметры конфигурации, загрузитьPlugin, экземплярCompiler(крюк)
  • компилировать:отEntryвыезд, за каждыйModule(модуль) последовательный вызов, соответствующийLoaderперевести содержимое файла, а затем найтиModuleзависимыйModule, который компилируется рекурсивно
  • выход: будет компилироватьModuleв сочетании сChunk,БудуChunkПреобразование в файл и вывод в файловую систему (ChunkТо есть в процессе упаковки модуль ввода ссылается на другие модули, а модуль ссылается на модуль.Эта цепочка отношений соединяетModuleсформированныйChunk)

Во время этого процессаWebpackКонкретное событие будет транслироваться в определенный момент времени, плагин будет выполнять определенную логику после прослушивания интересующего события, и плагин может вызыватьWebpackкоторый предоставилAPIИзменятьWebpackрезультат операции.

шесть вход

Назад к содержанию

Укажите упакованный входной файл, существует три разных формы:string | object | array.

Один к одному: одна запись, один файл пакета

module.exports = {
  entry: './src/index.js'
}

Многие к одному: несколько записей, один файл пакета

module.exports = {
  entry: [
    './src/index1.js',
    './src/index2.js',
  ]
}

Многие ко многим: несколько записей, несколько файлов пакетов

module.exports = {
  entry: {
    'index1': "./src/index1.js",
    'index2': "./src/index2.js"
  }
}

Семь выходов

Назад к содержанию

Расположение упакованного файла.

module.exports = {
  ...,
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
    filename: "[name].js"
  }
}
  • Можно указать фиксированное имя файла, если он мультивход-мультисход (entryобъект), нельзя использовать однофайловый экспорт, необходимо использовать следующие методы
  • пройти черезWebpackВстроенные переменные заполнители:[name]

восемь погрузчик

Назад к содержанию

loaderПорядок выполнения выполняется справа налево, то есть последнийloaderВыполнить первым.

Если есть конфигурация:

// webpack.config.js
module.exports = {
  //...
  module: {
    rules: [
      {
        test: /\.(le|c)ss$/,
        use: ['style-loader', 'css-loader', 'less-loader'],
        exclude: /node_modules/,
      },
    ],
  },
};

То есть разобраться в первую очередьless-loader, переработкаcss-loader, окончательная обработкаstyle-loader.

8.1 Общий загрузчик для обработки файлов

Назад к содержанию

  • file-loader: когда импортированный файл.png,.txtподождите, вы можете пройтиfile-loaderРазобрать проект вurlПредставлять. Скопируйте файл по соответствующему пути в соответствии с конфигурацией и измените путь импорта упакованного файла, чтобы он указывал на правильный файл.
  • url-loader:url-loaderупакованныйfile-loaderи может быть независимым отfile-loaderИспользуется отдельно и может быть настроенlimit. меньше чемlimitразмер изображения, преобразованный вBase64, больше, чемlimitкогда используешьfile-loaderметод в.

8.2 Общий загрузчик для проверки синтаксиса

Назад к содержанию

  • tslint-loader: проверка кода TypeScript через TSLint.
  • eslint-loader: проверить код JavaScript через ESLint

8.3 Общий загрузчик для обработки HTML-кода

Назад к содержанию

  • html-withimg-loader: обрабатывать изображения в HTML

8.4 Общие загрузчики для обработки кода CSS

Назад к содержанию

  • style-loader: динамически созданныйstyleтеги, вставьте код CSS вheadсередина.
  • css-loader: отвечает за обработку@import,urlи т.д. приговоры. Напримерimport css from 'file.css',url(image.png).
  • postcss-loader: Отвечает за дальнейшую обработку файлов CSS, такую ​​как добавление префиксов браузера, сжатие CSS и т. д.
  • less-loader:Буду.lessСодержимое файла преобразуется в CSS.
  • sass-loader:Буду.sassСодержимое файла преобразуется в CSS.

8.5 О распространенных загрузчиках, обрабатывающих код JS

Назад к содержанию

  • babel-loader: Чтобы преобразовать код JS в более низкую версию, нам нужно использоватьbabel-loader.
  • ts-loader: конвертировать TypeScript в JavaScript

Девять плагинов

Назад к содержанию

9.1 Общие плагины

Назад к содержанию

  • clean-webpack-plugin: Автоматическая очистка перед упаковкойdistкаталог для предотвращения остатков файлов.
  • copy-webpack-plugin: скопировать один файл или весь каталог в каталог сборки
  • mini-css-extract-plugin: Извлеките CSS и упакуйте его отдельно, а также настройте сжатие или нет.
  • html-webpack-plugin: этот плагин можно настроить для создания файла HTML5 сscriptТег содержит все пакеты Webpack. Если вы настроили несколько точек входа, вы можете соответствующим образом реализовать многостраничную упаковку приложения.

9.2 Плагины, повышающие эффективность

Назад к содержанию

  • webpack-dashboard: он может отображать соответствующую информацию об упаковке более удобно.
  • webpack-merge: Извлечение общей конфигурации и сокращение повторяющегося кода конфигурации.
  • speed-measure-webpack-plugin: для краткости SMP анализирует время, отнимаемое загрузчиком и плагином в процессе упаковки Webpack, что помогает найти узкие места производительности в процессе сборки.
  • size-plugin: Отслеживайте изменения объема ресурсов, чтобы обнаруживать проблемы как можно раньше.
  • HotModuleReplacementPlugin: Горячая замена модуля

Десять различий между загрузчиком и плагином

Назад к содержанию

  • Loader

LoaderПо сути, это функция, которая преобразует полученный контент и возвращает преобразованный результат.

потому чтоWebpackЗнайте только JavaScript, поэтомуLoaderОн становится переводчиком и обрабатывает различные типы ресурсов.

подобноfile-loaderилиurl-loader, на него можно правильно ссылаться после настройкиpngФорматирование изображений,txtи другие файлы форматов.

подобноstyle-loaderтак же какcss-loader, содержимое CSS может быть предварительно скомпилировано после ссылки.

  • Plugin

PluginЭто плагин, напримерjsliangТо же, что написано в плагине VS Code,PluginрасширенныйWebpackфункция.

Pluginтолько что вWebpackВ жизненном цикле плагина выполняются различные операции для достижения цели пользователя.

подобноhtml-webpack-plugin, после использования его с многовходовой формой может быть реализована функция многостраничного приложения.

подобноclean-webpack-pluginОчистить перед упаковкойdistсодержание,copy-webpack-pluginОтдельные файлы или целые каталоги могут быть скопированы в каталог сборки.

одиннадцать решить

Назад к содержанию

resolveНастройте, как Webpack ищет файлы, соответствующие модулям.

Webpack имеет встроенную функцию анализа модульного синтаксиса JavaScript.По умолчанию он будет использовать правила, согласованные в модульном стандарте, для поиска, но вы можете изменить правила по умолчанию в соответствии со своими потребностями.

// webpack.config.js
module.exports = {
  //....
  resolve: {
    modules: ['./src/components', 'node_modules'] // 从左到右依次查找
  }
}
  • resolve.modules: укажите, в каких каталогах Webpack будет искать сторонние модули.node_modulesЕсли у вас есть модули в определенной папке в вашем проекте, которые часто импортируются и вы не хотите писать длинный путь, вы можете настроитьresolve.modulesчтобы упростить.
  • resolve.alias: элемент конфигурации сопоставляет исходный путь импорта с новым путем импорта через псевдоним.
  • resolve.extensions: В проектах, адаптированных для нескольких терминалов, могут.web.js, .wx.js, например, в проекте переноса в сеть мы хотим найти.web.js, если нет, ищите.js.extensions: ['web.js', '.js'].

12 Настройка Webpack с 0

Назад к содержанию

Как настроить собственные леса Webpack с 0? Затем возникает вопрос выбора.

12.1 Технический отбор

Назад к содержанию

  • Мобильный || ПК
  • MPA || SPA
  • HTML || Механизм шаблонов
  • CSS || Препроцессор
  • JavaScript ES5 || ES6
  • Служба локальной публикации (моделирование данных)
  • React || Vue
  • Многопользовательский проект || Одиночный проект
  • Спецификация синтаксиса Eslint
  • модульный тест
  • спецификация фиксации

12.2 Конфигурация загрузчика — обработка CSS, Меньше

Назад к содержанию

  • use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
  • less less-loader: разбор.lessдокумент
  • postcss-loader autoprefixer:правильноflexМакет и т. д. имеют префикс

12.3 Конфигурация загрузчика - обработка изображений

Назад к содержанию

  • file-loader: разбор.txt,.png,.mdи т.д. файл
  • url-loader:limit: 1024, чтобы определить, обрабатывается ли размер вbase64Формат

12.4 Конфигурация загрузчика — работа со шрифтами

Назад к содержанию

  • url-loader

12.5 Конфигурация загрузчика – общая схема многостраничной упаковки MPA

Назад к содержанию

  • Установитьglob
  • Будуentryа такжеhtmlwebpackpluginДинамическая генерация

12.6 SourceMap

Назад к содержанию

  • Конфигурация среды разработки:devtool: "cheap-module-eval-source-map
  • Создайте конфигурацию онлайн (не рекомендуется):devtool: "cheap-module-source-map"

12.7 WebpackDevServer

Назад к содержанию

  • Установить
  • Конфигурация:devServer
  • HMR(горячая замена модуля)
  • включить JS-модульHMR,нужноWebpackСотрудничать

12.8 парсинг бабеля

Назад к содержанию

  • Установить:npm i babel-loader @babel/core @babel-preset-env -D
    • @babel/core:babelосновной
    • babel-loader:babelа такжеWebpackсоединительный мост
    • babel-preset-env: какой код выводить, использовать для решения
  • babel-loader: Разобрать ES6+
  • @babel/polyfill: Прокладка. Содержит весь код новой функции ES6+.
  • .babelrc

12.9 React

Назад к содержанию

  • Установить:react react-dom
  • использовать:@babel/preset-react

12.10 Оптимизация производительности

Назад к содержанию

  • уменьшитьloaderОбъем файла:loaderизincludeконфигурация, вы можете указатьsrcкаталог, уменьшая объем проверки.
  • оптимизацияresolve.modulesКонфигурация: конфигурацияWebpackВ каких каталогах искать сторонние модули, по умолчаниюnode_modules.
  • Отдельный CSS:MiniCssExtractPlugin
  • hash,chunkhash,contenthashразница
    • hashОбласть применения JS, CSS, изображениеhashСуществует разница, это меняется один раз за построить пакет.
    • chunkhashкchunkКак единое целое, если вы измените эту часть, вы измените какую часть.hash. (При этом изменятся и зависимые модулиhash)
    • contenthashИзменение происходит только тогда, когда меняется собственное содержание (отличное отchunkhash.
    • Итак, JS работает дляchunkhash; CSS применяется кcontenthash; Изображение относится кhash
  • Сжать CSS:optimize-css-assets-webpack-pluginа такжеcssnano
  • Сжать HTML:html-webpack-plugin
  • Сжать изображение:img-webpack-loader
  • отдельныйWebpackКонфигурация: Разделениеbase.config,dev.config,mpa.configа такжеpro.config4, черезmergeпровестиconfigОбъединение конфигураций

Подробнее здесь:

Оптимизация производительности веб-пакета

12.11 Прочее

Назад к содержанию

  • Как просто написатьWebpackпарсер
  • как написатьWebpack loader
  • как написатьWebpack plugin

Тринадцатое дополнение к знаниям: ленивая загрузка

Назад к содержанию

Отложенная загрузка или загрузка по запросу — отличный способ оптимизировать веб-страницы или приложения.

Этот метод фактически разделяет ваш код в некоторых логических точках останова, а затем ссылается или собирается ссылаться на другие новые блоки кода после выполнения определенных операций в некоторых блоках кода.

Это ускоряет первоначальную загрузку приложения и уменьшает его общий размер, поскольку некоторые блоки кода могут никогда не загрузиться.

13.1 Разделение кода

Назад к содержанию

расщепление кода (code splitting) Относится к процессу перехода кода, который не требуется, чтобы быть немедленно вызываться в коде, встроенном в асинхронный процесс загрузки.

Когда Webpack собран, он не будет загружать код, объявленный для асинхронной загрузки.Асинхронный код будет выделен в отдельный файл и загружен на страницу при фактическом вызове кода.

Ядром технологии разделения кода являетсяЗагружать ресурсы асинхронно.

К счастью, браузеры позволяют нам это делать, W3Cstage 3Технические характеристики:whatwg/loaderОпределение этого: вы можете пройтиimport()Ключевое слово заставляет браузер асинхронно загружать связанные ресурсы во время выполнения программы.

В Vue вы можете напрямую использоватьimport()ключевые слова делают это, тогда как в React вам нужно использоватьreact-loadableчтобы выполнить одно и то же.

13.2 Принцип реализации

Назад к содержанию

  1. Подмодуль, который необходимо лениво загрузить, упакован отдельно (children chunk)
  2. Используйте функции для задержки загрузки кода подмодулей (import)

print.js

console.log('输出 1');

export default () => {
  console.log('输出 2');
};

index.js

const btn = document.querySelector('.btn');
btn.onclick = import('./print.js').then((module) => {
  const print = module.default;
  print();
});

13.3 Загрузка Vue по запросу

Назад к содержанию

Vue характеризуется SPA — Single Page Application (одностраничное приложение).

Только при первой загрузке страницы и каждом последующем переключении страниц требуется только замена компонентов.

Это уменьшает количество запросов, ускоряет отклик страницы, снижает нагрузку на сервер и многое другое.

Однако, поскольку Vue — это SPA, все компоненты и ресурсы, связанные с компонентами, будут загружены при первой загрузке домашней страницы, что замедлит скорость открытия домашней страницы веб-сайта и ухудшит взаимодействие с пользователем.

В проекте Vue вы можете комбинировать Webpack, вvue-routerпройти черезimportВыполнить динамическую загрузку:

const routes = [{
  path: '/',
  name: 'Home',
  component: () => import('../views/Home.vue')
}];

Дополнение к четырнадцати знаниям: горячее обновление

Назад к содержанию

Обновление обычно делится на два типа:

  • Один из них — обновить страницу без сохранения состояния страницы, что является простым и грубым, напрямуюwindow.location.reload().
  • Другой основан наWDS(Webpack-dev-server) модуль горячей замены, вам нужно только частично обновить измененные модули на странице, и в то же время сохранить текущее состояние страницы, например, отмеченное состояние флажка, ввод поля ввода и т. д.

WebpackГорячее обновление также известно как горячая замена (Hot Module Replacement), сокращенноHMR.

Этот механизм позволяет заменять старые модули новыми модулями без обновления браузера.

14.1 Включить горячее обновление

Назад к содержанию

в вебпакеwebpack.config.jsсередина:

  1. настроитьdevServerизhotдляtrue
  2. существуетpluginsувеличить вnew webpack.HotModuleReplacementPlugin()
// webpack.config.js
const webpack = require('webpack');
module.exports = {
  //....
  devServer: {
    hot: true
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin() // 热更新插件
  ]
}

И в конфигурации файла записи:

if(module && module.hot) {
  module.hot.accept()
}

Когда код изменяется в это время, соответствующим образом обновляется только содержимое соответствующей части.

14.2 Принцип горячего обновления

Назад к содержанию

HMRСуть в том, что клиент подтягивает обновленный файл с сервера, если быть точнымchunk diff(chunkраздел, который необходимо обновить).

Фактическиwebpack-dev-server(WDS), а браузер поддерживаетWebsocket, при изменении локального ресурса,WDSОбновления будут отправлены в браузер вместе со временем сборки.hash, пусть клиент сравнит с последним ресурсом.

После того, как клиент сравнит различия, он отправитWDSположить началоAjaxзапрос на получение изменений (список файлов,hash), чтобы клиент мог использовать эту информацию для продолженияWDSположить началоjsonpпросьба получитьchunkдобавочное обновление.

Последующая часть (что делать после получения дополнительного обновления? Какие государства должны быть сохранены? Какие из них необходимо обновить?) Состоит изHotModulePluginзавершить, предоставив соответствующиеAPIДля разработчиков, чтобы иметь дело со своими собственными сценариями, такими какreact-hot-loaderа такжеvue-loaderс помощью этихAPIвыполнитьHMR.

Пятнадцать дополнений к знаниям: 3 хэша

Назад к содержанию

Отпечаток файла — это суффикс имени выходного файла после упаковки, соответствующий 3 видамhash.

  • hashЭто связано с построением всего проекта. Пока в проекте есть изменения файлов, будет построен весь проект.hashзначения изменены, и все файлы имеют одинаковыйhashстоимость. (детализация для всего проекта)
  • chunkhashОн предназначен для выполнения анализа файла зависимостей в соответствии с различными записями и создания соответствующихchunk(модуль), сгенерируйте соответствующийhashстоимость. только модифицированныйchunk(модуль) не будет генерировать новые до тех пор, пока не будет перестроенhashзначение, не повлияет на другиеchunk. (детализацияentryкаждого входного файла)
  • contenthashЭто связано с каждым сгенерированным файлом, каждый файл имеет уникальныйhashстоимость.当要构建的文件内容发生改变时,就会生成新的hashзначение, и изменения в этом файле не повлияют на другие файлы в том же модуле, что и он. (гранулированное содержимое каждого файла)

Дополнение к шестнадцати знаниям: исходная карта

Назад к содержанию

source mapЭто процесс сопоставления скомпилированного, упакованного и сжатого кода с исходным кодом. Упакованный и сжатый код не имеет хорошей читабельности.Если вы хотите отладить исходный код, вам нужноsoucre map.

mapФайл не будет загружен браузером, пока не открыты инструменты разработчика.

Обычно в онлайн-среде есть три решения для обработки:

  • hidden-source-map: С помощью сторонней платформы мониторинга ошибокSentryиспользовать
  • nosources-source-map: Будут отображаться только конкретный номер строки и стек ошибок для просмотра исходного кода. коэффициент безопасностиsource mapвысоко
  • source map:пройти черезnginxнастройка будет.mapФайл открыт только для белого списка (внутренняя сеть компании)

Примечание. Избегайте использования его в производстве.inline-а такжеeval-, потому что они увеличатсяbundleразмера и снижает общую производительность.

Приложение к знаниям Seventeen: принцип упаковки Webpack

Назад к содержанию

В простой реализации Webpack просто делается упаковка кода:

  1. использоватьbabelПолное преобразование кода и создание зависимостей для одного файла
  2. Сгенерировать граф зависимостей
  3. Сгенерировать окончательный код упаковки

18 ссылок

Назад к содержанию

В этой серии ссылок 51 статья.

18.1 Серия статей Webpack

Назад к содержанию

разное:

2020 Статьи:

2019 Статьи:

2018 Статьи:

2017 статьи:

18.2 Оптимизация производительности Webpack

Назад к содержанию

2019 Статьи:

2018 Статьи:

2017 Статьи:

18.3 Scope Hoisting

Назад к содержанию

18.4 Tree Shaking

Назад к содержанию

18.5 Ленивая загрузка

Назад к содержанию


репозиторий документации jsliang предоставляетсяЛян ЦзюньронгиспользоватьCreative Commons Attribution-NonCommercial-ShareAlike 4.0 Международная лицензияЛицензия.
на основеGitHub.com/l ian Jun Ron…Создание работ выше.
Права на использование, отличные от разрешенных в настоящем Лицензионном соглашении, могут быть получены отCreative Commons.org/licenses/не…получено в.