---
title: "Turbopack: What's New in Next.js 16.3"
description: "Turbopack in Next.js 16.3 adds development memory eviction, persistent file cache for builds, experimental Rust React Compiler, and `import.meta.glob` support."
url: "https://nextjs.org/blog/next-16-3-turbopack"
docs_index: /docs/llms.txt
publishedAt: June 29th 2026
authors:
  - Andrew Imm
---



<Next163PreviewRelease />

As the Next.js 16.3 Preview nears a stable release, we're sharing a series of posts about what's inside. Our previous posts cover new [Instant Navigation](/blog/next-16-3-instant-navigations) features and the latest [AI improvements](/blog/next-16-3-ai-improvements). This third post details the latest improvements to the Turbopack bundler within Next.js.

With [Next.js 16.3](/blog/next-16-3-instant-navigations), Turbopack's latest stable release focuses on compiler performance. Many of the newest features are centered around reducing CPU and Memory usage, speeding up build times, and improving runtime experience.
* Reducing dev server memory usage by up to 90%
* Persistent file system cache for faster builds
* Experimental Rust React Compiler support
* `import.meta.glob` API support
* Faster HMR and dev startup

## Reducing memory usage in dev mode

Turbopack's core design is focused on incremental compilation. By caching the work it previously did, it avoids recompiling files that haven't changed. When developing large Next.js applications, this means compile time is proportional to the size of your changes, not the size of your route.

In pursuing this design, we made a very deliberate trade-off: caching more results in memory, for reduced CPU usage. Since Turbopack first launched, though, memory usage has been at a premium. Coding agents, IDEs, typecheckers, and linters all run at dev time, and each consumes a significant chunk of system memory. Over the last three months, the Turbopack team has been committed to reducing its contribution to system memory pressure. **With an upgrade to 16.3, developers should immediately see less memory usage for long-running dev sessions.**

<div
  className="not-prose my-8 rounded-lg border border-[var(--ds-gray-400)] overflow-hidden"
  role="figure"
  aria-label="Memory usage comparison showing improvements after eviction is enabled"
>
  <div className="py-0 pr-3 pl-4 rounded-t-md border-b border-[var(--ds-gray-400)] h-10 flex items-center bg-[var(--ds-background-200)]">
    <span className="text-sm font-medium text-[var(--ds-gray-1000)]">
      Memory usage after compiling 50 routes
    </span>
  </div>
  <div className="p-4 flex flex-col gap-4 bg-[var(--ds-background-100)]">
    <div>
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">vercel.com (dashboard)</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~90% smaller
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="vercel.com dev server memory usage"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Before
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Without eviction: 21.5 gigabytes"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">21.5 GB</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">21.5 GB</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            After
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={10}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="With eviction: 2 gigabytes"
          >
            <div
              className="w-[10%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">2 GB</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">2 GB</span>
        </div>
      </div>
    </div>

    <div className="border-t border-[var(--ds-gray-400)] pt-4">
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">nextjs.org</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~82% smaller
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="nextjs.org dev server memory usage"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Before
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Without eviction: 4600 megabytes"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">4,600 MB</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">4,600 MB</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            After
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={18}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="With eviction: 840 megabytes"
          >
            <div
              className="w-[18%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">840 MB</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">840 MB</span>
        </div>
      </div>
    </div>
  </div>
</div>


Much of this was achieved through small incremental wins: compressing data structures and avoiding storing data longer than was necessary. The biggest win, though, comes from a new ability to evict much of the in-memory cache. Leveraging the file-system persistence feature that was [first introduced in Next.js 16.1](/blog/next-16-1#turbopack-file-system-caching-for-next-dev), Turbopack is able to remove cached results from memory. This avoids unbounded growth of memory in dev sessions, since the memory cache no longer holds onto every visited route.

Memory eviction requires the development filesystem cache to be enabled. In 16.3, both of these options are on by default. It can be disabled when investigating cache or development performance with the experimental [`turbopackMemoryEviction` config value](/docs/app/api-reference/config/next-config-js/turbopackMemoryEviction):

```ts
const nextConfig = {
  experimental: {
    turbopackMemoryEviction: false, // disables memory eviction, default value is 'full'
  },
};
```

There is no single reduction percentage that applies to every application. Individual results depend on the size of the route graph, how much of it was touched during the development session, and how long the session was running.

## File System cache for builds

Persisting the Turbopack memory cache to disk has been speeding up `next dev` sessions [since the 16.1 release](/blog/next-16-1#turbopack-file-system-caching-for-next-dev). After months of hardening in production with Vercel's own sites, the same persisted cache is now available for `next build`.

<div
  className="not-prose my-8 rounded-lg border border-[var(--ds-gray-400)] overflow-hidden"
  role="figure"
  aria-label="Next.js build time comparison showing impact of file system cache"
>
  <div className="py-0 pr-3 pl-4 rounded-t-md border-b border-[var(--ds-gray-400)] h-10 flex items-center bg-[var(--ds-background-200)]">
    <span className="text-sm font-medium text-[var(--ds-gray-1000)]">
      Turbopack compile time for `next build`
    </span>
  </div>
  <div className="p-4 flex flex-col gap-4 bg-[var(--ds-background-100)]">
    <div>
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">nextjs.org</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~2.3&times; faster
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="nextjs.org Turbopack build time"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cold
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Without cache: 21 seconds"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">21s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">21s</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cached
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={9}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="With cache: 9.2 seconds"
          >
            <div
              className="w-[44%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">9.2s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">9.2s</span>
        </div>
      </div>
    </div>
    <div className="border-t border-[var(--ds-gray-400)] pt-4">
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">vercel.com/home</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~1.4&times; faster
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="vercel.com (logged out) Turbopack build time"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cold
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Without cache: 66 seconds"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">66s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">66s</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cached
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={70}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="With cache: 46 seconds"
          >
            <div
              className="w-[70%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">46s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">46s</span>
        </div>
      </div>
    </div>
    <div className="border-t border-[var(--ds-gray-400)] pt-4">
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">vercel.com/geist</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~5.5&times; faster
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="vercel.com/geist Turbopack build time"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cold
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Without cache: 30 seconds"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">30s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">30s</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cached
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={18}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="With cache: 5.5 seconds"
          >
            <div
              className="w-[18%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">5.5s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">5.5s</span>
        </div>
      </div>
    </div>
  </div>
</div>


With persistent disk cache, builds can take advantage of previously computed work and reduce the time it takes to compile your static assets. CI setups can take advantage of this by copying the generated `.next` directory from one run to the next. When Turbopack sees the cache at the start of a build, it reads entries from disk before compiling any new changes.

Persistent cache for builds can be enabled with the [`turbopackFileSystemCacheForBuild` config flag](/docs/app/api-reference/config/next-config-js/turbopackFileSystemCache).

```ts
const nextConfig = {
  experimental: {
    // Enable filesystem caching for `next build`
    turbopackFileSystemCacheForBuild: true,
  }
}
```

## Experimental Rust React compiler

Next.js has provided stable support for the React Compiler [since the first 16.0 release](/blog/next-16#react-compiler-support-stable). Until now, the React Compiler has only been available as a Babel transform. On larger applications, we observed that it could slow down builds while waiting for JS execution resources. Recently, the React team published a native Rust port of the compiler, which we were quick to integrate into Turbopack.

Promising early tests against large React apps like [v0](https://v0.app) showed compilation wins of 20-50%, so we are releasing the native compiler integration as an experimental feature to drive more adoption.

To test out the Rust React Compiler, enable the compiler and use the experimental `turbopackRustReactCompiler` flag to use the native version:

```ts
const nextConfig = {
  // enable the compiler
  reactCompiler: true,
  experimental: {
    // use the Rust version, instead of the OG Babel one
    turbopackRustReactCompiler: true,
  }
}
```

There are many ways to configure the React Compiler for features like opt-in functionality. You can [read the full documentation](/docs/app/api-reference/config/next-config-js/reactCompiler) for more details.

## `import.meta.glob`

Turbopack now supports the Vite-compatible `import.meta.glob` API:

```ts
const posts = import.meta.glob('./posts/*.mdx');
```

This API can import all modules that match this pattern, without hardcoding their names. The result is an object keyed by the matching file paths. By default, each value is an async function that loads the module:

```ts
for (const path in posts) {
  const post = await posts[path]();
}
```

Use `eager: true` to `import` each match immediately:

```ts
const posts = import.meta.glob('./posts/*.mdx', {
  eager: true,
})
```

The implementation also supports named imports, multiple patterns, negative patterns, custom search path, query strings for loaders, and generated TypeScript types.

This functionality is powered by Turbopack's file watcher. When a file is added to or removed from this match set, it will trigger recompilation in dev mode, so your site always reflects the latest changes. This API is perfect for fetching sets of similar documents, like product descriptions or blog posts. We also expect that library developers will benefit from this API existing across the broader JS ecosystem.

`import.meta.glob` is available as a Turbopack feature, and will not work for Next.js apps built with the `--webpack` option.

See the [`import.meta.glob` reference](/docs/app/api-reference/turbopack#importmetaglob) for all of the available options.

## HMR improvements

By analyzing the performance of Turbopack in large Next.js apps at Vercel, we identified a number of performance improvements that could benefit all Turbopack users. Much of that investigation centered around making HMR subscriptions more efficient. One significant change streamlined the tracking of chunks that are loaded on a page. By reducing multiple subscriptions to a single one, we were able to reduce dev server cold start by over 15% on complex apps.

This is only the beginning of our HMR resource investigations, and we expect to deliver more memory and cold-start improvements in future Next.js releases.

## Smaller runtime size

Turbopack ships runtime code to every route that allows it to resolve modules and dynamically fetch new chunks. This also includes code for loading WebAssembly, workers, and top-level async modules. Not every Next.js application uses that functionality, though. Now Turbopack will only ship those features when they're needed, and avoids shipping extra runtime code the rest of the time.

## Local PostCSS configuration

Monorepos may need different PostCSS transforms for different packages.

The experimental `turbopackLocalPostcssConfig` option lets Turbopack resolve the configuration closest to each CSS file before falling back to the project root:

```ts filename="next.config.ts"
const nextConfig = {
  experimental: {
    turbopackLocalPostcssConfig: true,
  },
};
```

This allows package-level CSS to use a local configuration while application CSS continues to use the root configuration.

## Compatibility and reliability

Next.js 16.3 rolls up all of the fixes from the 16.2 patch line and adds more improvements across module resolution, tracing, and HMR, including:

 - Correct file URLs for `import.meta.url` on Windows
 - Retry chunk fetching on failure
 - Better support for `createRequire(new URL(..., import.meta.url))`
 - Correct `worker_threads` URL resolution
 - Support for the `module-sync` export condition
 - Better errors when webpack loaders crash
 - CSS HMR fixes in Safari
