Build1 publisher2 min readPublished
Dropping a 6.6-second trace phase saved more build time than Turbopack's faster compile
A developer timed every phase of a 60-route Next.js 16 build on both bundlers. The compile came out 19 times faster, the whole build only 4 times, and the largest single saving was a file-tracing step webpack ran for 6.6 seconds.
The Engineer · Build desk

What happened
- Next.js 16 ships Turbopack as the default bundler with an advertised 2-to-5x speedup over webpack, and a developer timed every phase of a 60-route app to see where the number lands.
- On a warm build with .next/cache kept, the compile ran 19 times faster at 143 milliseconds, while the total build improved only 4 times, to 3.45 seconds.
- Turbopack's .next directory measured 81 MB against webpack's 168 MB for the same app.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- decision Whether a pipeline caches .next/cache between jobs decides which figure a team gets, the 19x warm compile or the 2.5x cold one, and that is a CI config choice, not a bundler choice.
- exposure Teams migrating one branch at a time, or running both bundlers in the same pipeline, pay full cold-build cost on every switch with nothing in the log that names the cause.
- cost Halving the output directory takes 87 MB off what a cache step has to upload and restore per run, which is time charged to the cache step rather than the build.
Build traces are the file-dependency graph Next computes so a deployment knows which files each route needs [12]. On webpack that walk took 6.6 seconds on the 60-route app, printed with no progress bar [11]. Turbopack prints no such line at all: the author grepped the entire build output, found none, and reports that whatever Turbopack does instead is folded in and invisible [13]. It therefore cannot appear in anyone's phase table, including this one.
Webpack's warm build ran about fourteen seconds, of which compile at 2.8s, TypeScript at 1s and static generation at 0.4s accounted for roughly four [10]. Turbopack's warm build was 3.45 seconds [8]. That is 10.55 seconds saved, and the trace phase alone is 6.6 of them, about 63% of the win [3]. The faster compile contributes 2.66 seconds, about a quarter [4].
What remains is the part the swap does not reach. Compile is 143 milliseconds of that 3.45 second build, about 4% [8][1]. The other 3.31 seconds are type checking, static generation and Next's own orchestration [2], none of which get faster; the post's reading is that an infinitely fast bundler still leaves this build over three seconds [14]. Page count pushes the same way, since on 600 pages instead of 60 the static generation phase grows and the bundler's share shrinks further [15].
For the 19x compile number to transfer, several things have to hold. Each figure is a median of three runs on one machine with only the bundler flag changed [3]. The app is about 2,000 lines across 60 routes pulling in a Recharts chart, a Markdown renderer, lucide-react icons, date-fns and a zod schema, on Next.js 16.3.4 and React 19.2 [2]. Your CI also has to keep .next/cache between jobs, because a cold build is one with no .next directory at all, and that is the state CI runs in by default [4][6]. Without the cache you get the cold figure, 2.5x on compile, the bottom of the advertised 2-to-5x range [5][1].
The cache is bundler-specific too. The first warm Turbopack measurement came back at 3.1 seconds of compile instead of 143 milliseconds, because the previous build had been webpack and that cache does not carry over [16]. "Turbopack rebuilt from cold while believing it was warm," the write-up said [17]. Switching bundlers, or bouncing between them in CI, means the first build pays the full cold cost with no warning that it has [16].
Turbopack's .next directory came out at 81 MB, against 168 MB for webpack on the same app [18]. That is 87 MB less to upload and restore on every cached run [5].
What to watch
- Whether Next.js documents what replaced the Collecting build traces phase on Turbopack builds, or restores a visible line for it.
- A run of the same phase timing on a 600-page app, where static generation should swamp the bundler's share entirely.
- Whether CI templates start caching .next/cache by default, and whether a bundler switch invalidates it with a visible warning.