Vite vs Webpack vs Turbopack: Which Bundler to Use in 2026

A source-grounded comparison of Vite, Webpack, and Turbopack: how each bundles and hot-reloads code, what Vercel's own speed claims actually measured, and which one fits your stack in 2026.

The official Vite logo on a purple-to-yellow gradient background, Vite's social-preview image
Official Vite project social-preview image. Image: Vite.

If you're starting a plain browser app in 2026 and don't know which bundler to reach for, Vite is the safe default: it has the fastest cold starts for most project sizes, the broadest plugin ecosystem outside framework-specific tooling, and it's migrating its production bundler to the Rust-based Rolldown without changing how you write config. Pick Turbopack only if you're already on Next.js and want the framework's own built-in dev/build pipeline — it isn't a drop-in, framework-agnostic bundler for other stacks. Stick with Webpack if you depend on its mature plugin system, a legacy build pipeline, or loaders and plugins that don't yet have a Vite or Turbopack equivalent.

Key facts
  • Vite serves source over native ESM in dev and pre-bundles dependencies; for production it's moving from Rollup to Rolldown, a Rust bundler built specifically for Vite.
  • Webpack bundles everything, in dev and production, through a single static module-graph model with a mature loader/plugin API.
  • Turbopack is Rust-based and built into Next.js; Next.js's own docs say next dev/next build use it by default as of Next.js 16, with a Webpack opt-out flag for unsupported platforms or features.
  • Vercel's own blog reports up to 76.7% faster local server startup and up to 96.3% faster Fast Refresh versus Webpack on vercel.com — a vendor benchmark on one large app, not an independent, cross-framework result.

How Vite's dev-server model works

Vite's central idea is to avoid bundling in development entirely. According to Vite's own "Why Vite" docs, the dev server serves your source code over native ES modules: the browser requests whichever modules the current page actually needs, and Vite transforms each file on demand rather than compiling the whole app up front. Dependencies — which rarely change and can number in the hundreds for a typical app — are pre-bundled once using fast native tooling, so the browser doesn't have to resolve hundreds of nested imports on every page load.

Hot Module Replacement follows the same logic: when you edit a file, Vite swaps just that module over the existing native-ESM connection, without a full rebuild or a page reload. The docs describe the original design goal as a dev server that starts "nearly instant, regardless of application size," though the page gives no benchmark numbers to back that framing — it's a design claim, not a measured one.

The tradeoff shows up at the far end of the scale: Vite's own documentation acknowledges that very large codebases can see slower page loads from the sheer number of unbundled network requests a deeply nested dependency graph can generate, which is part of why the project is exploring a fuller bundling mode for dev in the Rolldown era.

How Webpack's bundling model works

Webpack's own concepts documentation describes it as a static module bundler: it starts from one or more entry points, walks every import/require to build a complete dependency graph, and emits that graph as one or more output bundles — in development just as much as in production. There's no "serve the source as-is" mode; even the dev server is handing the browser pre-bundled chunks.

That bundling-first model is also where Webpack's ecosystem strength comes from. Loaders transform individual files that aren't natively JavaScript, JSON, or WebAssembly — CSS, images, TypeScript, and much more — before they join the graph. Plugins hook into the compiler lifecycle for broader jobs: code splitting, asset optimization, environment-variable injection, and anything else that needs visibility into the whole build, not just one file.

Webpack's Hot Module Replacement, per its HMR concept page, runs through four layers — application, compiler, modules, and runtime. Each rebuild emits an update manifest plus the changed chunks; if a changed module (or one of its parents) has accept-handler code, the runtime swaps it in place. If the invalidation bubbles all the way to the entry point unhandled, the dev server falls back to a full page reload. This graph-traversal approach is thorough and configurable, but it also means update cost scales with how much of the graph has to be walked and recompiled, which Vercel's own team has pointed to as a reason large Webpack apps can feel slower to iterate on as they grow (see the speed section below for how that claim is sourced).

How Turbopack's incremental model works

Turbopack takes a third approach. Next.js's Turbopack reference describes it as "an incremental bundler optimized for JavaScript and TypeScript, written in Rust, and built into Next.js." Unlike Vite, it does bundle in development — the docs are explicit that pure native-ESM serving "works well for small apps but can slow down large apps due to excessive network requests," so Turbopack bundles, but lazily: it only compiles what the dev server actually requests, and it caches results down to the function level so finished work is never repeated.

The other structural difference from both Vite and Webpack is a unified module graph across environments. Next.js has to produce separate output for the server and the client (and, with React Server Components, has to track which imports cross that boundary). Webpack needs two separate compiler instances to do this; Turbopack's graph is "transition"-aware internally, so one compiler pass can represent both sides and hand off between them.

Turbopack's docs also list real constraints: it requires platform-specific native bindings (with a WebAssembly fallback that drops Turbopack support entirely, falling back to the --webpack flag), and — notably — "Turbopack does not support webpack plugins." It does support a subset of the webpack loader API, and a documented list of loaders (such as @svgr/webpack, babel-loader, and file-loader) are verified to work. Anything that relies on Webpack's plugin hooks, rather than its loader API, has no path onto Turbopack today.

Speed claims: what's measured, and by whom

Every bundler's marketing leans on speed, so it matters who is making which claim and under what conditions.

Vercel's claim about Turbopack vs. Webpack is the most specific and the most self-reported. In the post announcing "Turbopack Dev is Now Stable," the Next.js and Turbopack teams report, measured on vercel.com — "a large Next.js app" — up to 76.7% faster local server startup, up to 96.3% faster code updates via Fast Refresh, and up to 45.8% faster initial route compile without caching, all relative to the same app running on Webpack. These are Vercel's own numbers on Vercel's own application, not a third-party or multi-project benchmark, and the post itself notes the comparison excludes disk caching because "Turbopack does not have disk caching yet" at that point — so treat the percentages as a directional vendor claim about one workload, not a settled, general ratio between the two tools. The post is also explicit that this release only covers next dev; the team put production-build speed claims on a separate track.

Rolldown's claim about itself is similarly self-published, on Rolldown's own site, which cites a specific benchmark (19,000 modules — roughly 10,000 React JSX components and 9,000 Iconify JS files, with minification and source maps enabled) run against a snapshot of a benchmark repository dated December 2025. In that run, Rolldown reports ~1.61s versus esbuild's ~1.70s, Rspack's ~4.07s, and a Rollup+esbuild combination's ~40.10s. Notably, the Rolldown site makes no direct comparison against Webpack at all — its stated competitive set is esbuild, Rspack, and Rollup, not Webpack.

Independent, cross-tool benchmarks that try to compare Vite, Webpack, and Turbopack side by side on identical projects are harder to find and tend to disagree with each other and with the vendors' own numbers, because results depend heavily on project size, dependency count, caching state, and hardware. Treat any single bundler-vs-bundler percentage — including the ones above — as a claim from one source about one workload, not a universal ranking.

Ecosystem and plugin compatibility

Webpack's plugin and loader ecosystem is the oldest and broadest of the three, a direct result of nearly a decade as the default choice for React, Angular, and Vue tooling. Its loader API (module.rules, pairing a test pattern with a use loader) and its plugin API (hooking into the compiler lifecycle) are both documented and stable, and most build-time integrations in the JavaScript ecosystem have, at some point, shipped a Webpack-first implementation.

Vite's plugin API is deliberately designed to extend Rollup's plugin interface with Vite-specific hooks, which is why most Rollup plugins work in Vite with little or no change, and why the Vite plugin ecosystem (framework integrations, SVG/image handling, PWA tooling, and more) has grown quickly without needing to reinvent a parallel plugin standard. The move to Rolldown is designed to preserve this: Rolldown aims for Rollup-compatible options and a familiar plugin shape precisely so the existing Vite/Rollup plugin ecosystem keeps working as the underlying bundler changes.

Turbopack is the newest and most constrained of the three on this axis. Per Next.js's own documentation, Turbopack supports webpack loaders (a documented, partial list is verified working) but explicitly does not support webpack plugins — which rules out any integration that depends on compiler-level plugin hooks rather than per-file loader transforms. Several commonly used tools (Less without a loader, @vanilla-extract/css, StyleX, custom Sass functions) are listed as unsupported or planned-but-not-yet-available. If your project's build depends on a Webpack plugin with no Turbopack-compatible alternative, Turbopack isn't a drop-in swap yet.

DimensionViteWebpackTurbopack
Dev-server modelNative ESM; transforms files on request, pre-bundles depsBundles everything, dev includedBundles, but lazily — only what the dev server requests
Production bundlerRollup today, moving to Rolldown (Rust)Webpack's own JS-based bundlerTurbopack itself (Rust); build support stable as of Next.js 16
HMR / Fast RefreshPer-module swap over the existing ESM connectionFour-layer update-chunk system; bubbles to full reload if unhandledFunction-level incremental caching via "Turbo Engine"
Framework couplingFramework-agnostic; used standalone or via Vue/React/Svelte templatesFramework-agnostic; configurable for any stackBuilt into Next.js; not a standalone, portable bundler
Plugin/loader compatibilityRollup-compatible plugin API; broad plugin ecosystemMature loader + plugin API; largest ecosystemSupports a documented loader subset; does not support webpack plugins
Headline speed claimDev-server docs describe "near-instant" startup (no cited figure)No vendor speed claim; baseline most others compare againstVercel reports up to 76.7% faster startup, 96.3% faster Fast Refresh vs. Webpack on vercel.com
Best-fit use caseNew framework-agnostic apps, libraries, most SPAsLegacy apps, custom plugin-dependent pipelines, non-Next stacks needing deep configNext.js App/Pages Router projects wanting the framework default

Vite's move to Rolldown

Vite has used esbuild for dependency pre-bundling in dev and Rollup for production builds since its first release — two different tools with two different performance profiles and, occasionally, two different sets of edge-case behavior. Rolldown is the project's answer to that split: a Rollup-API-compatible bundler written in Rust, built by a dedicated team, intended to replace both esbuild's dev-time role and Rollup's production role with a single engine. Rolldown's own site describes it as free and open source, aiming for Rollup-style configuration plus esbuild feature parity (built-in transforms, define, injection, and minification) so existing Vite and Rollup setups need minimal changes.

The practical reason this matters for picking a bundler in 2026: Vite isn't just "the fast one today," it's actively consolidating its own toolchain to close the remaining gap with bundle-while-you-dev tools like Turbopack, without asking users to adopt a new config format or plugin API. If you're choosing Vite now, you're choosing into that transition — worth checking the current Rolldown adoption status in your specific framework template (Vue, React, SvelteKit, etc.) before assuming it's already the default everywhere.

Turbopack's Next.js coupling

The most important thing to understand about Turbopack is that it is not a general-purpose bundler you can add to an arbitrary project the way you would Vite or Webpack. Next.js's documentation is direct about this: Turbopack is "built into Next.js," and as of Next.js 16 it's the default bundler for both next dev and next build, with Webpack available only as an explicit opt-out via a --webpack flag — a flag that's also the mandatory fallback on platforms (like FreeBSD or OpenBSD) that lack native Rust bindings and only get WebAssembly bindings, which don't support Turbopack at all.

Vercel has said it eventually plans to ship a standalone version of Turbopack outside Next.js, but as of the "Turbopack Dev is Now Stable" announcement, that's a stated future intention, not a shipped product — the team's own framing was that they want to "prove its merit" inside Next.js first. If your project isn't a Next.js app, Turbopack currently isn't on your list of options at all; the choice is between Vite and Webpack (or another bundler entirely).

Developer-experience differences beyond raw speed

Speed numbers aside, the three tools diverge in day-to-day feel. Vite's native-ESM dev server means the browser's own devtools and network panel show your actual source files, which many developers find easier to debug than a bundled dev output. Webpack's dev builds have historically diverged from production in ways the Turbopack team called out explicitly — things like style-loader injecting CSS via JavaScript in dev (causing a flash-of-unstyled-content workaround) and eval-source-map wrapping code in eval for sourcemap support, both of which affect what you're actually debugging versus what ships. Turbopack's docs claim its dev output "closely matches production" by avoiding both of those workarounds, outputting real CSS files and non-eval sourcemaps by default — though that claim comes from the same Next.js team building the tool, so it's worth validating against your own project's behavior rather than taking as given.

All three also differ in how observable failures are. Webpack's maturity means an enormous base of Stack Overflow answers, GitHub issues, and third-party guides for nearly any error message. Turbopack is newer and error messages, while improving, have a smaller base of prior art to search against. Vite's errors tend to map closely to native browser module-resolution errors, which can be either clearer or more cryptic depending on how used to ESM semantics you already are.

When to pick each

Pick Vite if you're starting a new project that isn't tied to Next.js — a Vue, React, Svelte, Solid, or vanilla app, a component library, or anything where you want fast cold starts and a dev server that mirrors how the browser actually loads modules. It's also the better fit if you want your production bundler story to keep improving without you doing anything, since Rolldown adoption happens underneath Vite's existing config surface.

Pick Webpack if you have an existing app with custom plugins or a build pipeline that depends on Webpack's compiler-level plugin hooks, if you need a loader or plugin that has no Vite or Turbopack equivalent yet, or if you're on a non-Next framework (older Angular setups, certain enterprise Node tooling) where Webpack is still the default and switching bundlers isn't worth the migration risk for the speed gain.

Pick Turbopack if you're already building on Next.js — at which point, as of Next.js 16, it's the default and you likely don't need to "pick" it at all unless you're opting back out. Opt out to Webpack specifically if your project depends on an actual webpack plugin (not just a loader), relies on CSS Modules features Turbopack doesn't yet support, needs Less without extra configuration, or runs on a platform where Turbopack's native bindings aren't available.

For context on how the broader JavaScript toolchain is moving toward Rust- and Zig-based native tooling — the same trend driving Rolldown and Turbopack — see how that plays out in linting, where Biome is challenging ESLint on similar speed grounds, and in package manager speed comparisons, where the same native-tooling pressure shows up in install times rather than bundling.

What next

None of these three tools is static right now. Watch Vite's release notes for Rolldown graduating from opt-in to default in your framework's starter template; watch Next.js's version-changes log for Turbopack production-build stability updates (build support only reached stable status in Next.js 16); and if you're evaluating Webpack's continued fit, check whether the specific plugin or loader you depend on has announced Turbopack or Rolldown support before planning a migration around speed alone. If your stack also touches runtime choice rather than just bundling, how Node.js, Deno, and Bun compare is a related decision that interacts with which bundler makes sense. Whatever you pick, treat every cross-tool speed percentage — including the ones in this piece — as a claim about one workload from one source, and verify it against your own project before committing a team migration to it.

Frequently asked questions

Is Turbopack faster than Webpack?

Vercel reports up to 76.7% faster local server startup and up to 96.3% faster Fast Refresh on vercel.com, compared to the same app on Webpack. That is a vendor benchmark on one large Next.js app, not an independent or universal result, and it only covers next dev, not production builds.

Can I use Turbopack without Next.js?

Not yet as a general-purpose, framework-agnostic tool. Turbopack is built into Next.js, and Vercel has said a standalone release is a future goal, not something shipped today.

What is Rolldown and why is Vite switching to it?

Rolldown is a Rust-based bundler built specifically for Vite, designed to replace both esbuild (used for dev pre-bundling) and Rollup (used for production builds) with one Rollup-API-compatible engine, aiming to keep existing Vite and Rollup plugins working.

Does Turbopack support webpack plugins?

No. Next.js's own documentation states Turbopack supports a subset of webpack loaders but does not support webpack plugins, so any build step relying on Webpack's plugin hooks has no direct path to Turbopack yet.

Which bundler has the most mature plugin ecosystem?

Webpack, by a wide margin, reflecting roughly a decade as the default choice for React, Angular, and Vue tooling. Vite's plugin API extends Rollup's, giving it a large and fast-growing ecosystem; Turbopack's is the newest and most limited.

Should I migrate an existing Webpack app to Vite or Turbopack for speed alone?

Not without checking plugin and loader compatibility first. Migrating purely for a vendor-reported speed percentage, without verifying your specific plugins and loaders have equivalents, risks trading a slow build for a broken one.

Sources

More on JavaScript Bundlers →ViteWebpackTurbopackJavaScript bundlersNext.jsRolldown
Felix Moreau
Written byFelix Moreau

Felix Moreau writes Pandromeda's software coverage and how-to guides. He covers Windows, macOS and Linux updates, the apps people rely on, emulators and developer tools, and turns official documentation into clear, numbered steps that work on the current version.

More from Software & Guides

See all