webpack 4 был выпущен в феврале 2018 года. С тех пор мы добавили множество функций без критических изменений. Мы знаем, что людям не нравятся серьезные изменения с критическими изменениями. Особенно с webpack, к которому люди обычно прикасаются только два раза в год, а остальное время он «просто работает». Но за доставку функций без критических изменений также приходится платить: мы не можем вносить существенные улучшения API или архитектуры.
Время от времени наступает момент, когда трудности накапливаются, и мы вынуждены вносить критические изменения, чтобы не все испортить. Пришло время для новой основной версии. Таким образом, webpack 5 содержит эти архитектурные улучшения и функции, которые невозможно реализовать без них.
Основная версия также давала возможность пересмотреть некоторые настройки по умолчанию и привести их в соответствие с предложениями и спецификациями, которые появляются в то же время.
Итак, сегодня (2020-10-10) выпущен webpack 5.0.0, но это не значит, что он готов, без ошибок или даже с полным набором функций. Как и в случае с webpack 4, мы продолжаем разработку, исправляя проблемы и добавляя функции. В ближайшие дни, вероятно, будет много исправлений. Функции появятся позже.
Содержание статьи
- 1 Общие вопросы
- 2 Общее направление
- 3 Миграция Руководство
- 4 Основные изменения: Удаление
- 5 Основные изменения: долгосрочное кэширование
- 6 Основные изменения: Поддержка разработки
- 7 Основные изменения: новые функции веб-платформы
- 8 Основные изменения: Новые функции экосистемы Node.js
- 9 Основные изменения: Опыт разработки
- 10 Основные изменения: Оптимизация
- 10.1 Вложенный древовидный пакет
- 10.2 Встряхивание внутреннего модуля
- 10.3 CommonJs Tree Shaking
- 10.4 Анализ побочных эффектов
- 10.5 Оптимизация для каждой среды выполнения
- 10.6 Объединение модулей
- 10.7 Общие улучшения Tree Shaking
- 10.8 Сходство разработки и производства
- 10.9 Улучшенная генерация кода
- 10.10 Улучшенная цель вариант
- 10.11 SplitChunks and Module Sizes
- 11 Major Changes: Performance
- 12 Major Changes: Long outstanding problems
- 13 Major Changes: Future
- 14 Changes to the Configuration
- 15 Major Internal Changes
- 15.1 New plugin order
- 15.2 Runtime Modules
- 15.3 Serialization
- 15.4 Plugins for Caching
- 15.5 Hook Object Frozen
- 15.6 Tapable Upgrade
- 15.7 Staged Hooks
- 15.8 Main/Chunk/ModuleTemplate deprecation
- 15.9 Entry point descriptor
- 15.10 Order and IDs
- 15.11 Arrays to Sets
- 15.12 Compilation.fileSystemInfo
- 15.13 Filesystems
- 15.14 Hot Module Replacement
- 15.15 Work Queues
- 15.16 Logging
- 15.17 Module and Chunk Graph
- 15.18 Init Fragments
- 15.19 Module Source Types
- 15.20 Plugins for Stats
- 15.21 New Watching
- 15.22 SizeOnlySource after emit
- 15.23 Emitting assets multiple times
- 15.24 ExportsInfo
- 15.25 Code Generation Phase
- 15.26 DependencyReference
- 15.27 Presentational Dependencies
- 15.28 Deprecated loaders
- 16 Minor Changes
- 17 Other Minor Changes
Общие вопросы
Итак, что означает релиз?
Это означает, что мы закончили вносить критические изменения. Было сделано множество рефакторингов для повышения уровня архитектуры и создания хорошей основы для будущих функций (и текущих функций).
Так когда же пора обновляться?
Это зависит от обстоятельств. Существует большая вероятность того, что обновление не удастся, и вам потребуется повторить попытку. Если вы готовы к этому, попробуйте выполнить обновление сейчас и оставьте отзыв о веб-пакете, плагинах и загрузчиках. Мы очень хотим исправить эти проблемы. Кто-то должен начать, и вы будете одним из первых, кто получит от этого пользу.
Webpack полностью основан на спонсорстве. Он не привязан к большой компании (и не оплачивается ею), как некоторые другие проекты с открытым исходным кодом. 99% доходов от спонсорства распределяются между вкладчиками и сопровождающими в зависимости от их вкладов. Мы верим в то, что вложим деньги в улучшение Webpack.
Но сейчас пандемия, и компании больше не открыты для спонсирования. Webpack тоже страдает в этих условиях (как и многие другие компании и люди).
Мы никогда не могли выплатить нашим вкладчикам ту сумму, которую, по нашему мнению, они заслуживают, но теперь у нас есть только половина имеющихся денег, поэтому нам нужно сделать более серьезное сокращение. Пока ситуация не улучшится, мы будем платить участникам и сопровождающим только первые 10 дней каждого месяца. Остальные дни они могли работать добровольно, оплачивая их работодателем, работать над чем-то другим или брать выходные. Это позволяет нам оплачивать их работу в течение первых 10 дней в размере, превышающем затраченное время.
Наибольшее спасибо trivago, который спонсирует webpack в течение последних 3 лет. К сожалению, они не могут продолжить свое спонсорство в этом году, так как сильно пострадали от Covid-19. Я надеюсь, что какая-то другая компания пойдет и пойдет по этим (гигантским) стопам.
Спасибо всем спонсорам.
Общее направление
В этом выпуске основное внимание уделяется следующему:
- Повышение производительности сборки с помощью постоянного кэширования.
- Улучшите долгосрочное кэширование с помощью лучших алгоритмов и параметров по умолчанию.
- Увеличьте размер пакета за счет улучшенного встряхивания дерева и генерации кода.
- Улучшение совместимости с веб-платформой.
- Очистите внутренние структуры, которые оставались в странном состоянии при реализации функций в версии 4, без внесения каких-либо критических изменений.
- Подготовьтесь к будущим функциям, внося критические изменения прямо сейчас, что позволит нам оставаться на версии 5 как можно дольше.
Миграция Руководство
См. Здесь руководство по миграции
Основные изменения: Удаление
Удаленные устаревшие элементы
Все устаревшие элементы в версии 4 были удалены.
МИГРАЦИЯ : убедитесь, что ваша сборка webpack 4 не выводит предупреждения об устаревании.
Вот несколько вещей, которые были удалены, но не имели предупреждений об устаревании в версии 4:
- IgnorePlugin и BannerPlugin теперь должны передавать только один аргумент, который может быть объектом, строкой или функцией.
Коды устаревания
Новые устаревшие коды включают код устаревания, поэтому на них легче ссылаться.
Синтаксис устарел
require.include
устарел и по умолчанию будет выдавать предупреждение при использовании.
Поведение можно изменить с помощью Rule.parser.requireInclude
на разрешенное, устаревшее или отключенное.
Автоматические полифиллы из Node.js удалены
Вначале целью webpack было позволить запускать большинство модулей Node.js в браузере, но структура модулей изменилась, и теперь написано множество вариантов использования модулей в основном для веб-интерфейса. webpack <= 4 поставляется с полифилами для многих основных модулей Node.js, которые автоматически применяются, когда модуль использует какой-либо из основных модулей (например, модуль crypto
).
Хотя это упрощает использование модулей, написанных для Node.js, они добавляют эти огромные полифилы в пакет. Во многих случаях в этих полифилах нет необходимости.
webpack 5 прекращает автоматическое полифиллинг этих основных модулей и фокусируется на модулях, совместимых с интерфейсом. Наша цель — улучшить совместимость с веб-платформой, где базовые модули Node.js недоступны.
МИГРАЦИЯ :
- По возможности старайтесь использовать модули, совместимые с интерфейсом.
- Можно вручную добавить полифилл для основного модуля Node.js. Сообщение об ошибке подскажет, как этого добиться.
- Авторы пакетов: Используйте поле
browser
вpackage.json
чтобы сделать пакет совместимым с внешним интерфейсом. Предоставьте альтернативные реализации / зависимости для браузера.
Основные изменения: долгосрочное кэширование
Детерминированный блок, идентификаторы модулей и имена экспорта
Добавлены новые алгоритмы для долгосрочного кэширования. По умолчанию они включены в производственном режиме.
chunkIds: «детерминированный»
moduleIds: «детерминированный»
mangleExports: «детерминированный»
Алгоритмы назначают короткие (3 или 5 digits) числовые идентификаторы модулей и блоков и короткие (2 символа) имена для экспорта детерминированным способом. Это компромисс между размером пакета и долгосрочным кешированием.
moduleIds / chunkIds / mangleExports: false
отключает поведение по умолчанию, и можно предоставить собственный алгоритм через плагин. Обратите внимание, что в webpack 4 moduleIds / chunkIds: false
без настраиваемого плагина получилась рабочая сборка, а в webpack 5 вы должны предоставить настраиваемый плагин.
МИГРАЦИЯ : лучше всего использовать значения по умолчанию для chunkIds
moduleIds
и mangleExports
. Вы также можете отказаться от старых значений по умолчанию chunkIds: "size", moduleIds: "size", mangleExports: "size"
это будет генерировать меньшие пакеты, но чаще делает их недействительными для кэширования.
Примечание. В webpack 4 хешированные идентификаторы модулей привели к снижению производительности gzip. Это было связано с изменением порядка модулей и исправлено.
Примечание. В webpack 5 детерминированные
идентификаторы включены по умолчанию в производственном режиме
Хэш реального контента
Webpack 5 будет использовать реальный хэш содержимое файла при использовании [contenthash]
сейчас. Раньше он «всего лишь» использовал хеш своей внутренней структуры. Это может положительно повлиять на долгосрочное кеширование, когда изменяются только комментарии или переименовываются переменные. Эти изменения не видны после сворачивания.
Основные изменения: Поддержка разработки
Именованные идентификаторы фрагментов
Новый алгоритм именованных идентификаторов фрагментов, включенный по умолчанию в режиме разработки, дает фрагменты (и имена файлов) удобочитаемыми имена. Идентификатор модуля определяется его путем относительно контекста
. Идентификатор блока определяется содержимым блока.
Таким образом, вам больше не нужно использовать import (/ * webpackChunkName: "name" * / "module")
для отладки. Но это все равно имеет смысл, если вы хотите контролировать имена файлов для производственных сред.
В производственной среде можно использовать chunkIds: "named"
но убедитесь, что случайно не раскрыли конфиденциальную информацию об именах модулей.
МИГРАЦИЯ : если вам не нравится, что имена файлов меняются в процессе разработки, вы можете передать chunkIds: "natural"
чтобы использовать старый числовой режим.
Module Federation
Webpack 5 добавляет новую функцию под названием «Module Federation», которая позволяет нескольким сборкам webpack работать вместе. С точки зрения времени выполнения модули из нескольких сборок будут вести себя как огромный граф подключенных модулей. С точки зрения разработчика модули можно импортировать из указанных удаленных сборок и использовать с минимальными ограничениями.
Подробнее см. В этом отдельном руководстве.
Основные изменения: новые функции веб-платформы
Модули JSON
Модули JSON теперь соответствуют предложению и выдают предупреждение, когда используется экспорт, отличный от стандартного. Модули JSON больше не имеют именованный экспорт при импорте из строгого модуля ECMAScript.
МИГРАЦИЯ : использовать экспорт по умолчанию.
Даже при использовании экспорта по умолчанию неиспользуемые свойства удаляются при оптимизации optimisation.usedExports
а свойства искажаются при оптимизации optimangleExports
.
В Rule.parser.parse
можно указать собственный парсер JSON для импорта файлов, подобных JSON (например, для toml, yaml, json5 и т. Д.).
import.meta
-
import.meta.webpackHot
— это псевдоним дляmodule.hot
который также доступен в строгом ESM -
import.meta.webpack
— это основная версия веб-пакета под номером -
import.meta.url
— этофайл:
URL-адрес текущего файла (аналогично__ filename
но как URL-адрес файла)
Модули ресурсов
Webpack 5 теперь имеет встроенную поддержку модулей, представляющих ресурсы . Эти модули либо отправят файл в папку вывода, либо вставят DataURI в пакет javascript. В любом случае они предоставляют URL для работы.
Их можно использовать несколькими способами:
-
импортировать URL из ./image.png"
и установитьтип: "asset"
вmodule.rules
при сопоставлении такого импорта. (старый способ) -
новый URL ("./ image.png", import.meta.url)
(новый способ)
"Новый способ "был выбран синтаксис, позволяющий запускать код и без сборщика. Этот синтаксис также доступен во встроенных модулях ECMAScript в браузере.
Поддержка Native Worker
При объединении нового URL
для активов с new Worker
/ new SharedWorker
/ навигатором .serviceWorker.register
webpack автоматически создаст новую точку входа для веб-воркера.
новый рабочий (новый URL-адрес ("./ worker.js", import.meta.url))
Синтаксис был выбран так, чтобы можно было запускать код и без связующего. Этот синтаксис также доступен во встроенных модулях ECMAScript в браузере.
URI
Webpack 5 поддерживает обработку протоколов в запросах.
-
данные:
поддерживаются. Поддерживается кодировка Base64 или raw. Mimetype может быть сопоставлен с загрузчиками и типом модуля вmodule.rules
. Пример:импорт x из "data: text / javascript, экспорт по умолчанию 42"
-
файл:
поддерживается. -
http (s):
поддерживается, но требует согласия черезновый webpack.experiments.schemesHttp (s) UriPlugin ()
- По умолчанию, когда нацеленные на «Интернет», эти URI приводят к запросам к внешнему ресурсу (они являются внешними)
Поддерживаются фрагменты в запросах: Пример: ./ file.js # фрагмент
Асинхронные модули
Webpack 5 поддерживает так называемые «асинхронные модули». Это модули, которые не оцениваются синхронно, а вместо этого основаны на async и Promise.
Их импорт через import
выполняется автоматически, дополнительный синтаксис не требуется, а разница практически не заметна.
Импорт их через require ()
вернет обещание, которое разрешает экспорт.
В webpack есть несколько способов иметь асинхронные модули:
- async externals
- Модули WebAssembly в новой спецификации
- Модули ECMAScript, которые используют Top- Level-Await
Внешние
Webpack 5 добавляет дополнительные внешние типы, чтобы охватить больше приложений:
обещание
: выражение, которое оценивается как обещание. Внешний модуль — это асинхронный модуль, и разрешенное значение используется как экспорт модуля.
import
: Собственный import ()
используется для загрузки указанного запроса. Внешний модуль — это асинхронный модуль.
модуль
: еще не реализовано, но планируется загрузить модули через импорт x из "..."
.
скрипт
: загружает URL-адрес через тег