8.1. Отличия webpack v4 и webpack v5

В этой статье мы поговорим о ключевых отличиях двух версий webpack: старой четвёртой и новой пятой.

Webpack v5 является инкрементальной версией по сравнению с v4.

В этом контексте «инкрементальный» означает, что webpack v5 является новой версией, которая добавляет к старой дополнительные функции и улучшения, но при этом не меняет основную структуру и архитектуру. Приложения, созданные с помощью предыдущей версии, можно легко обновить до новой, используя существующий код и конфигурацию.

В новой версии улучшены производительность и оптимизация размера бандла — то есть файлов на выходе. Введение ModuleFederationPlugin позволяет легче делиться кодом между проектами, основанными на webpack, а встроенный CLI (консольная утилита) упрощает запуск. Кроме того, режимы разработки и производства объединены и автоматически настраиваются в зависимости от окружения.

Основные отличия

Функция webpack v4 webpack v5
Размер бандла Размер бандла по умолчанию не оптимизирован, необходимо использовать плагины. Размер бандла оптимизирован по умолчанию с помощью таких техник, как Tree Shaking и Module Federation.
Экосистема Использует традиционные загрузчики для обработки активов. Использует правила webpack для обработки активов с введением ModuleFederationPlugin.
Режимы Разработка и производство разделены, нужно настраивать их отдельно. Разработка и производство объединены и автоматически настраиваются в зависимости от окружения.
CLI Необходим CLI для запуска webpack. CLI встроен и может запускаться с помощью npx webpack или npm run build.
Производительность Улучшена с использованием кэширования и параллельной обработки. Дополнительное улучшение производительности с введением AssetModule и PerformanceBudget.
Разделение кода Динамические import(). Динамические import() и import.meta.webpack.
Кэширование сборки Нет встроенной поддержки. Встроенная поддержка с опцией --cache.
Генерация манифеста Нет встроенной поддержки. Встроенная поддержка с плагином ManifestPlugin.
Долгосрочное кэширование Нет встроенной поддержки. Имена файлов с хэшем и хэшем содержимого.
Поддержка WebAssembly Нет встроенной поддержки. Встроенная поддержка с плагином WebAssemblyModulesPlugin.
Node.js API Нет встроенной поддержки. Встроенная поддержка с Node.js API для компиляции.

У webpack v5 есть дополнительные функции, которые могут быть полезны при разработке и сборке проектов. Добавлена поддержка кэширования сборки, манифеста, долгосрочного кэширования, WebAssembly и Node.js API. Также v5 поддерживает разделение кода с помощью динамических import() и import.meta.webpack, которые позволяют более эффективно разделять код и улучшать производительность.

«Встроенная поддержка с Node.js API для компиляции» означает, что webpack v5 имеет встроенный API, который может быть использован для компиляции и сборки проектов с использованием платформы Node.js. Это позволяет нам использовать webpack не только из командной строки, но и прямо из кода приложения. Мы можем автоматизировать и интегрировать его в существующую систему сборки. А ещё можно использовать webpack внутри серверных приложений или других скриптов Node.js.

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

  • webpack v4:
const webpack = require('webpack');
const config = {
  entry: './src/index.js', // входная точка
  output: {
    path: __dirname + '/dist', // папка, куда будут помещаться все файлы после сборки
    filename: 'bundle.js' // имя файла после сборки
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: 'common' // разделение на чанки (CodeSplitting)
    })
  ]
};
module.exports = config;
  • webpack v5:
const webpack = require('webpack');
const config = {
  entry: './src/index.js',
  output: {
    path: __dirname + '/dist',
    filename: 'bundle.js'
  },
  optimization: {
    splitChunks: {
      chunks: 'all',
      name: 'common'
    }
  }
};
module.exports = config;

В этом примере в webpack v4 используется плагин CommonsChunkPlugin для создания сплит-чанка и назначения ему имени common. В webpack v5 мы используем опцию optimization.splitChunks для создания сплит-чанка. В ней указываем chunks: 'all' для разделения всех чанков и назначаем имя common. Также в v5 убрали некоторые плагины, которые использовались в v4 для минификации файлов, и заменили их на опции оптимизации.

Если вы хотите ознакомиться с дополнительными отличиями, вот официальные и наиболее актуальные источники: webpack v4 и  webpack v5.