A Next.js app depends on a webpack plugin that has no Turbopack equivalent, so the team cannot adopt Turbopack builds. As the lead, how do you decide between staying on webpack, replacing the tooling, or splitting the pipeline?
answer
- price the daily loop, not the CI banner
- ask whether the capability is still needed
- move the work out of the bundler
- split pipeline costs dev/prod parity
- decide with a trigger and an owner
basics
~20 sPrice both sides: what the faster builds and dev loop are worth across the team, against the cost of replacing the plugin's function or maintaining a split pipeline. Then pick an option with an explicit review date, because webpack is the legacy path in Next 16 and staying on it is a decision that expires.
solid answer
~50 sStart by quantifying rather than debating. What does the plugin actually do, is that capability required or merely habitual, and what would the switch buy in engineer-minutes per day and CI minutes per build? Then weigh four real options. **Stay on `--webpack`** — cheapest today, but you are on the path Next is moving away from, so re-evaluate every release. **Move the plugin's work out of the bundler** — often the best answer, since source-map upload, artifact generation and asset emission frequently work as a separate CI step. **Replace the tool** with one that ships a Turbopack-native integration. **Split the pipeline** — Turbopack in dev, webpack for builds — which buys the daily feedback loop at the cost of dev/prod parity, the one option I would time-box hardest, because a bug that appears only in the bundler you do not develop against is expensive to find. Whatever you choose, write down the trigger that changes the answer and who owns watching for it.
go deeper
Understand that a build tool that blocks an upgrade is a real constraint on the team, and that the first useful question is what the tool is for and whether anyone still depends on it.
Be able to lay out the options — stay on webpack, replace the tool, move its work into a separate CI step, or split dev and build — and say what each one costs rather than naming a favourite.
Show that you would measure before choosing: dev edit-to-update and CI build time on the real app, and an honest check of whether the blocking capability is still required at all.
Own the decision record. Pick an option, write the trigger that would change it, assign the owner who re-checks each release, and refuse the outcome where a temporary --webpack becomes an unexplained permanent state.
## Frame it as a cost with an expiry date The instinct is to treat this as a binary — Turbopack or webpack — and argue it on taste. It is better framed as: what is the ongoing cost of each option, and how long does that cost hold? The expiry matters because the ground moves. In Next 16 Turbopack is the default and webpack is reached through an opt-out flag. Being on the non-default path means your configuration gets less testing, the bugs you hit are less likely to be shared by others, and future releases optimize for the case you are not in. Staying on webpack is legitimate; staying on webpack *without a review date* is drift. ## Quantify what the switch is worth Before evaluating options, get numbers, because they usually decide it: - **Dev feedback loop.** Measure cold start, first-route compile and edit-to-update on the real application, both ways. Multiply the difference by edits per engineer per day, times headcount. This is where most of the value lives — it is paid every day by every engineer. - **CI build time.** Minutes per build times builds per day. This one converts to money directly and is easy to over-weight; a two-minute CI saving matters far less than two seconds off every edit. - **Recruiting and staleness.** Sitting on a legacy path has a slow cost in upgrade friction that is real but hard to put a number on. Name it as a risk rather than inventing a figure. Then ask the question people skip: **is the plugin's capability actually required?** A surprising share of `webpack()` blocks are historical — re-implementing something Next now handles natively, or serving a workflow nobody uses. Deleting the requirement is the cheapest resolution available and should be tested first. ## The four options and what each costs **Stay on `--webpack`.** Zero migration effort, everything keeps working. You forgo the speed benefit and you accumulate risk on the legacy path. Correct when the plugin is genuinely essential and the measured benefit is modest. Requires a named owner and a per-release re-check, or it silently becomes permanent. **Move the work out of the bundler.** Frequently the strongest answer. A great deal of what webpack plugins do — uploading source maps, emitting a manifest, generating an asset — does not need to happen *inside* the compilation. Made a discrete CI step, it becomes bundler-independent and stops blocking every future toolchain move. Cost is a one-off engineering effort plus owning a small piece of pipeline. **Replace the tool.** If the plugin belongs to a vendor product, check whether that vendor ships a Turbopack-native integration; many have. Cost is a vendor migration and its risk, so this depends on how deep the tool sits in your workflows. **Split the pipeline** — Turbopack for `next dev`, webpack for `next build`. Tempting, because the daily benefit lands and the blocker only exists at build time. The cost is dev/prod parity: you develop against one bundler and ship artifacts from another, so a bundler-specific difference is invisible until production. Acceptable as an explicitly time-boxed bridge with a date attached; corrosive as a permanent state. ## Decide, then write down what changes the decision The deliverable is not the choice, it is the choice plus its trigger. Something like: we stay on webpack builds; the trigger is that vendor shipping a Turbopack integration or our measured CI time crossing a threshold; the platform team owns re-checking at each Next major; if nothing changes in two quarters we move the plugin's work into a CI step instead. That converts a stalled debate into a tracked item and prevents the outcome where nobody can explain, a year later, why the app still passes `--webpack`. ## The failure modes to name Two, and both are common. **Migrating for the speed number alone** — adopting a bundler because a benchmark looked good, then discovering the source maps stopped uploading and a week of incident debugging cost more than the builds saved. And **freezing** — declaring the migration blocked, filing nothing, and rediscovering the problem during a forced upgrade under time pressure. A lead's job here is to make the constraint explicit and give it an owner, not to win the tooling argument.
- Why is running Turbopack in dev and webpack for builds a risky long-term state?Because you develop against one bundler and ship artifacts from another. Differences in resolution, chunking or CSS ordering then appear only in production, where they are most expensive to diagnose, and every incident carries an extra hypothesis. It is a defensible bridge with an end date, because the daily benefit is real, but as a permanent arrangement it quietly taxes every debugging session.
- Which measurement should carry the most weight in this decision?Edit-to-update time in development, multiplied by edits per engineer per day and by headcount. It is paid continuously by everyone, unlike CI build time which is paid per pipeline run and is usually the smaller number despite being the easier one to quote. Cold-start time is the least important of the three, since engineers restart the dev server rarely.
- What makes 'stay on webpack for now' a defensible decision rather than drift?A written trigger and a named owner. State what would change the answer — a vendor shipping a Turbopack integration, a measured threshold crossed, a Next release deprecating the flag — say who re-checks it and when, and set a fallback action if nothing moves by a date. Without those, the temporary decision becomes permanent and nobody can reconstruct why.
saying these in an interview costs you the question
- Adopts the new bundler because a benchmark number looked good
- Declares the migration blocked and files nothing
- Never asks whether the plugin's capability is still needed
- Treats a split dev/build pipeline as a free permanent arrangement
- Weighs CI minutes heavily while ignoring the daily edit loop