Когда React-приложение растёт, размер бандла становится критичным. От него напрямую зависят скорость загрузки, время до первого рендера и даже SEO.
Вот проверенные приёмы, которые реально уменьшают размер бандла и ускоряют загрузку 👇
1️⃣ Tree shaking
Webpack умеет автоматически выкидывать неиспользуемый код.
Главное — использовать import/export, а не require().
Например, если ты импортировал только map из lodash, в бандл не попадёт весь lodash, а только нужная часть.
Это работает в продакшн-сборке (mode: 'production') и помогает избавиться от «мёртвых» зависимостей.
2️⃣ Code splitting / Lazy loading
Разделяем приложение на отдельные чанки, чтобы не грузить всё сразу.
В React это делается просто:
const Settings = React.lazy(() => import('./Settings'));Компонент подгружается только при переходе на нужную страницу — это ускоряет загрузку первого экрана и экономит трафик пользователю.
3️⃣ Dynamic imports
Похожи на lazy loading, но гибче: модуль можно подгрузить в любой момент, например, при клике или определённом событии.
button.onclick = async () => {
const { run } = await import('./heavyModule');
run();
};Так можно динамически подгружать тяжёлые утилиты, графики или редакторы, которые нужны не всем пользователям.
4️⃣ Vendor splitting
Отделяем сторонние библиотеки (React, Lodash, Axios и т.д.) от остального кода.
Они попадают в отдельный чанк (vendors.js), и браузер может кешировать его между обновлениями приложения.
При следующем релизе пользователь скачает только изменившийся код, а не всё приложение заново.
5️⃣ Bundle analyzer
Инструмент webpack-bundle-analyzer показывает визуально, какие файлы занимают больше всего места в бандле.
Это помогает быстро понять, стоит ли заменить тяжёлую библиотеку на более лёгкий аналог или удалить неиспользуемые импорты.
Пример: часто moment.js можно заменить на dayjs, и размер падает на десятки килобайт.
6️⃣ Compression (gzip / brotli)
После сборки важно сжимать файлы перед отправкой пользователю.
На сервере (или CDN) включается gzip или brotli, и вес бандла уменьшается в 2–3 раза.
Например, 600 KB превращаются в 200 KB — и страница загружается ощутимо быстрее.
7️⃣ Minification
Минификация удаляет пробелы, переносы строк, комментарии и переименовывает переменные.
Инструменты вроде Terser или esbuild делают это автоматически при продакшн-сборке.
В итоге код становится компактнее и быстрее загружается, но функционально не меняется.
8️⃣ Dead code elimination
Webpack и Babel умеют находить и удалять код, который никогда не выполнится.
Например:
if (process.env.NODE_ENV !== 'production') {
console.log('debug info');
}В продакшн-версии эти строки просто не попадут в итоговый бандл.
Это избавляет от лишнего мусора и ускоряет работу.
9️⃣ Asset optimization
Изображения, шрифты и SVG тоже влияют на размер бандла.
Используй оптимизацию — например, image-webpack-loader или svgo.
Преобразуй картинки в современные форматы (.webp, .avif), чтобы они весили меньше.
Иногда просто переконвертация PNG → WebP уменьшает размер в 5–10 раз.
🔟 Prefetch / Preload
Позволяет браузеру заранее подгружать чанки, которые скоро понадобятся.
<link rel="prefetch" href="settings.chunk.js">
Например, пользователь на главной странице, но браузер уже «знает», что он, скорее всего, откроет настройки — и подгружает их заранее.
Это улучшает перформанс без лишней нагрузки на сеть.
⚡️ Даже простое применение этих приёмов может сократить размер бандла в 2–3 раза и сделать приложение визуально «быстрее» для пользователя.
А если подключить анализатор и немного поработать с динамическими импортами — результат будет заметен сразу.
#react #frontend #webpack #vite #оптимизация #performance
#оптимизации #react #frontend #webpack
