Turbopack у Next.js 16: продакшен-білди, налаштування та міграція з Webpack (2026)
Turbopack у Next.js 16 — стабільний Rust-білдер, що замінив Webpack. Як увімкнути, налаштувати loaders і aliases, використати persistent cache та мігрувати без даунтайму.
Turbopack у Next.js 16 — це стабільний Rust-білдер, який повністю замінює Webpack і для next dev, і для next build, прискорюючи холодний старт у 2–5 разів та скорочуючи час продакшен-білду на 30–80% залежно від розміру проєкту. У Next.js 16 Turbopack уперше офіційно production-ready: команда Vercel позначила його як стабільний для білдів, додала persistent cache і підтримку більшості Webpack-loaders. Нижче розберемо практичний посібник: як увімкнути, як налаштувати, як мігрувати з Webpack і як вичавити максимум зі швидкості.
У Next.js 16 Turbopack стабільний і для next dev, і для next build. Webpack більше не використовується за замовчуванням.
Холодний старт dev-сервера прискорюється у 2–5 разів, а продакшен-білди на 30–80% порівняно з Webpack у Next.js 15.
Persistent cache зберігає результати компіляції між запусками next build у .next/cache/turbopack, що особливо корисно для CI.
Більшість популярних Webpack-loaders (CSS modules, SVGR, MDX) підтримуються через секцію turbopack у next.config.ts.
Кастомні Webpack-плагіни не підтримуються напряму, їх потрібно замінити на Rust-плагіни SWC або еквівалентні SWC-перетворення.
Для проєктів із важкою кастомізацією Webpack можна тимчасово залишитися на ньому через прапорець --webpack.
Що таке Turbopack і чому він замінив Webpack
Turbopack — це інкрементальний бандлер, написаний на Rust і побудований поверх системи кешування Turbo Engine. Він спроєктований із розрахунком на функціональне кешування на рівні окремих обчислень: якщо ви змінили один рядок у компоненті, Turbopack перекомпілює лише цей файл та його прямі залежності, а не весь граф. Саме така архітектура дає драматичне прискорення HMR. У мене на проєкті з 4 000 модулів оновлення компонента застосовується за 80–150 мс проти 600–900 мс у Webpack. Чесно, перший раз я не повірив очам і запустив таймер двічі.
У Next.js 16 команда Vercel офіційно зробила Turbopack стандартним білдером. Webpack залишається доступним як легасі-опція через прапорець --webpack, але всі нові оптимізації (Cache Components, persistent build cache, PPR-інтеграція) розробляються виключно під Turbopack. Якщо ви хочете отримати найкращу продуктивність і нові можливості (наприклад, Partial Prerendering у Next.js 16 з повноцінним статичним fallback), залишатися на Webpack більше не варіант.
Важливо розуміти ще один аспект. Turbopack використовує спільну з SWC інфраструктуру для трансформацій. Це означає, що TypeScript, JSX і навіть експериментальний React Compiler обробляються тим самим Rust-пайплайном, без перемикання між Node-процесами. Менше JIT-розігріву, менше overhead, нижче споживання пам'яті: типовий моноліт у 50–100k модулів стабільно тримається у 3–4 ГБ RSS замість 8–12 ГБ на Webpack.
Turbopack vs Webpack: порівняння у Next.js 16
Якщо ви досі вагаєтеся, чи варто переходити, ось концентроване порівняння на основі офіційних релізних нот і моїх вимірювань на реальних проєктах.
Параметр
Turbopack (Next.js 16)
Webpack (legacy)
Холодний старт next dev
1.5–4 с (1k–10k модулів)
8–25 с
HMR після зміни компонента
50–200 мс
400–1200 мс
Продакшен-білд (середній проєкт)
30–60 с
90–180 с
Споживання RAM на білді
3–4 ГБ
8–12 ГБ
Persistent cache
Так, у .next/cache/turbopack
Лише filesystem-cache modules
Кастомні Webpack loaders
Більшість так, через turbopack.rules
Так, повна підтримка
Кастомні Webpack плагіни
Ні (треба замінити на SWC)
Так
Підтримка babel.config.js
Ні (треба перенести у SWC)
Так
Cache Components / PPR
Повна підтримка
Обмежено
Як увімкнути Turbopack для продакшен-білду
У Next.js 16 нічого вмикати не потрібно: Turbopack використовується за замовчуванням. Стандартні команди next dev і next build запускаються на Turbopack автоматично. Достатньо оновити package.json:
Якщо з якоїсь причини потрібно тимчасово повернутися на Webpack (наприклад, щоб локалізувати регресію), використовуйте прапорець --webpack:
# Продакшен-білд на Webpack (legacy режим)
next build --webpack
# Dev-сервер на Webpack
next dev --webpack
Щоб перевірити, що Turbopack дійсно активний, у логах next build з'явиться рядок ▲ Next.js 16.0.0 (Turbopack). Якщо такого маркера немає, десь у скриптах залишився старий прапорець --no-turbopack або змінна оточення NEXT_DISABLE_TURBOPACK=1.
Налаштування Turbopack у next.config.ts
Усі специфічні опції живуть у секції turbopack файла next.config.ts. Ось приклад типової конфігурації середнього проєкту з SVGR, MDX і кастомними aliases:
import type { NextConfig } from 'next';
import path from 'node:path';
const nextConfig: NextConfig = {
turbopack: {
// 1. Кастомні правила для нестандартних розширень
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
'*.mdx': {
loaders: ['@mdx-js/loader'],
as: '*.tsx',
},
},
// 2. Aliases (замість resolve.alias у Webpack)
resolveAlias: {
'@': path.resolve(__dirname, './src'),
'@ui': path.resolve(__dirname, './src/components/ui'),
},
// 3. Розширення, які Turbopack має шукати при імпорті без розширення
resolveExtensions: ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.json'],
// 4. Опційно: налаштування root для монорепо
root: path.resolve(__dirname, '../..'),
},
};
export default nextConfig;
Зверніть увагу на кілька важливих моментів. По-перше, turbopack.rules приймає той самий API loaders, що й Webpack. У переважній більшості випадків ви можете просто скопіювати масив із webpack.module.rules. По-друге, resolveAlias замінює webpack.resolve.alias і працює навіть із відносними шляхами. По-третє, секція root критична для монорепо: без неї Turbopack може некоректно визначити корінь pnpm-workspace і кешувати не ті файли (я ловив цей баг тричі, поки не додав явний root).
Одна з найважливіших новинок Next.js 16, це persistent build cache. У попередніх версіях кожен next build на CI починався «з нуля»: навіть якщо змінили один файл, бандлер перекомпільовував увесь граф. Тепер Turbopack зберігає функціональний кеш у .next/cache/turbopack і при повторному запуску відновлює до 80% результатів компіляції.
Кеш активний за замовчуванням. Щоб скористатися ним на GitHub Actions, достатньо додати .next/cache до actions/cache:
На моєму проєкті середнього розміру (~1 200 компонентів) холодний CI-білд триває близько 55 секунд, а «теплий» (з відновленим кешем після зміни кількох файлів) близько 12–15 секунд. Це дозволяє запускати окремий job для preview-deployment на кожен push без значного навантаження на CI-мінути. Чесно, для команди це була чи не найвідчутніша зміна за весь рік.
Як мігрувати з Webpack на Turbopack крок за кроком
Якщо ви оновлюєтеся з Next.js 14 або 15, де Webpack використовувався за замовчуванням, ось перевірений план міграції без даунтайму:
Інвентаризуйте webpack-конфігурацію. Відкрийте next.config.js і випишіть усі модифікації функції webpack(config): loaders, plugins, alias, externals.
Перенесіть loaders. Кожне правило з module.rules переходить у turbopack.rules із трохи зміненим синтаксисом: поле test замінюється на ключ-glob, а use стає loaders.
Перепишіть aliases. Усе з resolve.alias переходить у turbopack.resolveAlias «один-в-один».
Замініть babel на SWC. Якщо у проєкті є babel.config.js, переконайтеся, що Turbopack його не підбирає (він спеціально ігнорує Babel-конфіг). Перевірте, чи всі плагіни Babel мають SWC-аналоги; для більшості популярних (styled-components, emotion, lodash) аналоги вже існують.
Перевірте кастомні плагіни. Для DefinePlugin, BannerPlugin, ProvidePlugin Turbopack має вбудовані аналоги через опції env, turbopack.banner, turbopack.provide.
Запустіть білд паралельно. Зробіть next build на Turbopack і next build --webpack, порівняйте розміри бандлів і хеші чанків. Розбіжності у 1–3% це нормально (різний tree-shaking), у 10%+ це ознака проблеми.
Прокатайте на staging. Persistent cache треба «прогріти» один раз, перший білд буде як на холодну.
Видаліть webpack-блок. Після успішного prod-релізу видаліть функцію webpack() з next.config.ts. Вона більше не потрібна і лише вводить в оману майбутніх контриб'юторів.
Для проєктів з активною роботою з аутентифікацією та middleware варто додатково ознайомитися з контролем динамічного рендерингу через dynamicIO. У Next.js 16 ці зміни часто роблять одним рілізом.
Типові проблеми та їх вирішення
За пів року роботи з Turbopack у продакшені я зібрав «топ-5» проблем, на які наштовхуються команди. Ось вони з готовими рішеннями.
1. «Module not found» для пакетів, які раніше працювали
Часто причина у невказаному resolveExtensions. Turbopack за замовчуванням не шукає .cjs або .mts; якщо у залежностей такі файли є, додайте їх до масиву.
2. CSS-modules не застосовують стилі у продакшені
Перевірте, чи у вас немає кастомного postcss.config.js із непідтримуваними плагінами. Turbopack використовує SWC-PostCSS, тому деякі плагіни типу postcss-preset-env на старих опціях треба оновити.
3. Білд падає з «out of memory» на CI
Парадоксально, але Turbopack споживає менше RAM за Webpack у середньому, проте має пік на етапі завершення кешу. Підніміть ліміт через NODE_OPTIONS=--max-old-space-size=4096 або збільшіть машину CI до 8 ГБ.
4. SVGR-компоненти імпортуються як рядки
Це класична помилка. Забули вказати as: '*.js' у правилі. Без цього Turbopack обробляє SVG як статичний asset, а не як React-компонент. Я хапався за голову хвилин п'ятнадцять, поки не зрозумів, у чому справа.
5. HMR оновлює сторінку повністю замість часткового
Зазвичай це наслідок сайд-ефекту на верхньому рівні модуля (наприклад, виклик window.something = ...). Перевірте через // @refresh reset у файлі: якщо HMR починає працювати, проблема саме в сайд-ефекті.
Реальні бенчмарки на проєктах різного розміру
Щоб не оперувати голослівними «у рази швидше», ось вимірювання, які я зробив на трьох реальних проєктах. Усі тести проходили на однаковій машині (M2 Pro, 32 ГБ), Next.js 16.0.0 проти Next.js 15.4 на Webpack.
Малий проєкт (240 модулів, маркетинговий лендинг)
Холодний dev: Turbopack 1.1 с, Webpack 6.3 с (у 5.7 раза швидше).
HMR: Turbopack 40 мс, Webpack 320 мс.
Продакшен-білд: Turbopack 12 с, Webpack 28 с.
Середній проєкт (1 200 модулів, SaaS-дашборд)
Холодний dev: Turbopack 3.4 с, Webpack 14.7 с.
HMR: Turbopack 90 мс, Webpack 720 мс.
Продакшен-білд: Turbopack 41 с (12 с з cache), Webpack 112 с.
Великий моноліт (8 500 модулів, e-commerce)
Холодний dev: Turbopack 11 с, Webpack 47 с.
HMR: Turbopack 170 мс, Webpack 1.4 с.
Продакшен-білд: Turbopack 138 с (38 с з cache), Webpack 290 с.
Цифри говорять самі за себе: чим більший проєкт, тим помітніший виграш від Turbopack. У зв'язці з явним dynamicIO-рендерингом і Cache Components сумарне покращення TTFB на staging-середовищі у моєму проєкті склало 38%.
Так. У Next.js 16 (жовтень 2025) Turbopack отримав офіційний статус stable і для next dev, і для next build. Vercel використовує його у всіх власних продуктах, включно з vercel.com і v0.dev, що є найкращим доказом готовності.
Чи можна повернутися на Webpack, якщо щось зламається?
Так, використайте прапорець --webpack у next build або next dev. Webpack позначений як deprecated, але буде доступний ще щонайменше у Next.js 17. Однак нові фічі (Cache Components, persistent cache) залишаться ексклюзивними для Turbopack.
Чи підтримує Turbopack кастомні Webpack-плагіни?
Ні, кастомні Webpack-плагіни не підтримуються напряму через відмінну архітектуру (Rust замість JavaScript). Для більшості популярних плагінів є SWC-аналоги; решту функціональності можна реалізувати через опції turbopack.rules, resolveAlias та змінні оточення.
Наскільки швидший Turbopack за Webpack?
За моїми вимірюваннями на трьох реальних проєктах: холодний dev-старт у 4–6 разів швидший, HMR у 5–10 разів швидший, продакшен-білди на 30–80% швидші. Чим більший проєкт, тим помітніший виграш, особливо при увімкненому persistent cache на CI.
Чи працює Babel разом із Turbopack?
Ні, Turbopack ігнорує babel.config.js і використовує винятково SWC. Перед міграцією перевірте, чи всі ваші Babel-плагіни мають SWC-аналоги. Для популярних бібліотек (styled-components, emotion, lodash, relay) аналоги вже існують.
Практичний гайд зі стрімінгового SSR у Next.js 16. Де саме розставити Suspense-межі, як не зруйнувати LCP, як профілювати у DevTools із React 19 Performance Tracks. З прикладами коду й чек-листом перед деплоєм.
Як працює експериментальний прапор dynamicIO у Next.js 16, як вибрати між use cache та await connection(), та як уникнути типових помилок збірки під час міграції.
Як використовувати after() у Next.js 16 для логування, аналітики та фонових задач після відповіді. Робочі приклади для Server Components, Route Handlers, Server Actions, proxy.ts, порівняння з waitUntil() і налаштування self-hosted розгортання.