Webpack — Примеры

Пример 1 — Целая библиотека, импортированная ради одной функции

Нужен всего один строковый помощник, а файл точки входа импортирует экспорт пакета по умолчанию. Бандл вырос на два порядка. Объясните, как сборщик решил, что включать, и перепишите импорт так, чтобы в бандл попадало только используемое.

// src/index.js
import _ from "lodash";

const slug = _.kebabCase(title);
пример вывода
main.[contenthash].js   72 kB

Решение

// src/index.js
import kebabCase from "lodash/kebabCase";

const slug = kebabCase(title);
пример вывода
main.[contenthash].js   3.1 kB

Сборщик не загружает перечисленные вами файлы — он их находит. Он стартует с точки входа и идёт по каждому импорту, поэтому импорт пакета по умолчанию втягивает точку входа этого пакета и всё, до чего она дотягивается. Импорт конкретного модуля оставляет остальную часть графа вне бандла; а если у пакета вовсе нет маленькой точки входа, честный ответ — зависимость поменьше или несколько строк, написанных вручную. Граф обнаруживается, а не объявляется, поэтому случайный импорт в любом месте меняет вывод: вот почему осмотр бандла после добавления зависимости — часть работы, а не необязательный аудит.

Пример 2 — Отладочная сборка, отправленная в продакшн

Одна и та же конфигурация обслуживает и локальную работу, и развёрнутый сайт, а на выходе — единственный нехешированный файл с читаемыми именами функций. Перечислите, чего стоит каждая отсутствующая настройка, и разделите две сборки.

export default {
  entry: "./src/index.js",
  output: { filename: "bundle.js" },
};

Решение

export default {
  mode: "production",
  entry: "./src/index.js",
  output: { filename: "[name].[contenthash].js", clean: true },
};

mode переключает весь набор значений по умолчанию. Без него сборка остаётся в отладочной форме: не минифицированная, без tree shaking, с удобным для отладки кодом, который стоит байтов и времени разбора каждому посетителю. Вторая половина дела — хеш содержимого в имени файла: он меняется только тогда, когда меняется содержимое файла, и именно это позволяет браузеру кэшировать бандл надолго, а не загружать его заново при каждом развёртывании. clean удаляет из выходного каталога устаревшие артефакты, чтобы старый хешированный файл нельзя было отдать по ошибке. Разработка и продакшн хотят противоположного: быстрых пересборок и читаемого исходного кода против маленького, хешированного, прошедшего tree shaking вывода. Большая часть сложности конфигурации идёт как раз из попытки обслужить обе задачи одним объектом настроек.