← Усі статті

Як Turbopack ділить JavaScript на фрагменти в Next.js

Компроміс «один бандл vs сотні запитів», групи фрагментів і експериментальні опції Next.js 16.3: розумне завантаження, аналітика маршрутів, видалення мертвого коду в CJS.

Як Turbopack ділить JavaScript на фрагменти в Next.js
Зміст

Коротко

Turbopack у Next.js збирає клієнтський JavaScript не в один файл, а в багато фрагментів бандла: власний код, залежності й середовище виконання. У блозі Next.js пояснюють, чому «все в одному файлі» і «файл на кожен модуль» однаково погані на довгій дистанції — і як злиття фрагментів усередині групи балансує розмір завантаження та кількість мережевих запитів. У Next.js 16.3 з’явилися експериментальні важелі: розумний вибір уже завантажених шматків, налаштування під реальні маршрути, видалення невикористовуваного коду в модулях CommonJS і спільний фрагмент середовища виконання.

Що сталося

Крайнощі прості. Один величезний файл добре кешується, але тягне код усіх сторінок навіть на «легкий» маршрут. По файлу на сторінку — без зайвого коду, зате спільний <Footer /> завантажується знову й знову. По файлу на модуль — нічого зайвого й чудовий кеш, але сотні дрібних запитів: накладні витрати HTTP і гірше стиснення, ніж у великих файлів.

Turbopack об’єднує дрібні фрагменти в більші, але лише всередині групи фрагментів — набору, що завжди вантажиться разом (наприклад, усе для /home чи /blog). Так не можна «донавантажити» на сторінку код, який їй не потрібен: усередині групи він і так уже в плані завантаження. Рішення «зливати чи ні» зважує сценарії: людина відкрила одну сторінку й пішла, чи пішла далі сайтом. Злиття спільного й вузького модуля вигідне при одному заході; при переході на сторінку, де потрібен лише спільний шматок, браузер може скачати спільне повторно — бо воно вже «склеєне» з непотрібним.

На сайті nextjs.org порівняли три режими: без злиття, налаштування за замовчуванням і «все в групі в один файл». Умовчання зрізали кількість запитів більш ніж удвічі за трохи меншого обсягу коду; максимальне злиття дало ще менше запитів, але приблизно на 10% більше скачаного JavaScript на довгій сесії.

Чому це важливо

Поділ на фрагменти — не «налаштування збирача заради краси», а прямий компроміс між першим екраном, кешем і м’якою навігацією. Збірка вирішує злиття до візиту й не знає, що вже лежить у кеші браузера; алгоритм ще й вгадує частку односторінкових сесій (у статті — близько двох третин). Звідси розрив між «швидким першим заходом» і «дешевими наступними переходами».

Для команди на Next.js це пояснює, чому «просто зменште число фрагментів» або «дробить усе дрібніше» без урахування маршрутів часто погіршують картину. Нові прапорці в 16.3 якраз закривають сліпі зони: середовище виконання може обрати дешевше — злитий файл чи відсутні шматки; конфіг може підказати реальні кластери сторінок замість універсальної здогадки.

На практиці

  1. Оновіться до Next.js 16.3+ і читайте опції під experimental.turbopackChunking у next.config.js, а не копіюйте чужі «магічні» числа.
  2. Увімкніть generateComponentChunks: поруч зі злитими фрагментами емітяться незлиті; під час запиту обирається дешевший варіант з урахуванням уже завантаженого.
  3. Підставте свою аналітику: firstPageLoadPriority (за замовчуванням 0.67), priorityRoutes для важливих URL, clusters — групи маршрутів, які ходять разом.
  4. Для меншого обсягу клієнта: experimental.turbopackCjsTreeShaking (видалення невикористовуваного коду в CommonJS; раніше стабільно працював переважно ESM) і experimental.turbopackSharedRuntime — один спільний фрагмент середовища виконання замість окремого на кожну сторінку (близько 10 КБ і один блокувальний запит на наступних переходах).
  5. Міряйте на своїх сценаріях навігації: на маркетинговому сайті з високим «відскоком» вигідніше інше злиття, ніж у кабінеті з довгими сесіями.

Підсумок

Хороший поділ JavaScript — це не максимум і не мінімум файлів, а свідомий компроміс усередині груп фрагментів плюс дані про те, як люди реально ходять застосунком. Експериментальні опції Turbopack у Next.js 16.3 дають шанс наблизити збірку до кешу браузера й до вашої карти маршрутів — варто вмикати їх свідомо й перевіряти замірами, а не «наосліп на все».