Tobias KoppersandGitHub 0070514701 Turbopack: make available_modules an OperationVc and simplify merged module bookkeeping (#94055)
### What?

Reworks how `chunk_group_content` exposes `available_modules` for
downstream chunking, and consolidates the bookkeeping for merged modules
in `ChunkGroup`.

- Splits `ChunkGroupContent` into a `turbo_tasks::value`
`ChunkGroupContentInner` (carrying `chunkable_items`, `batch_groups`,
`async_modules`, `traced_modules`, and `available_modules`) plus a thin
wrapper that pairs it with the resulting `AvailabilityInfo`.
`chunk_group_content_operation` now runs entirely inside `turbo_tasks`,
allowing `AvailableModules` to store its set as an
`OperationVc<AvailableModulesSet>` and `.connect()` it on read.
- Replaces the separate `included` set and
`should_create_chunk_item_for` method on `MergedModuleInfo` with an
`Option<ChunkableModule>` value type on the `replacements` map. Call
sites now decide all three cases (replace / skip / keep) in one match
via `should_replace_module`.

### Why?

- `AvailableModules::snapshot` did not correctly derive its invalidation
priority, which caused double invalidations: the snapshot was treated as
a low-priority dependency even though it gated chunking work, so when
its inputs changed turbo-tasks would invalidate it after dependent
computations had already started, triggering them a second time.
Exposing `available_modules` as an `OperationVc` makes
`AvailableModules` inherit the correct invalidation priority from the
operation that produces it, which removes the double-invalidation.
- The previous `MergedModuleInfo` API had two parallel data structures
(`replacements` and `included`) and a helper that combined them. Folding
`included` into the value of `replacements` removes the duplication,
makes the three states (replace, skip-because-merged, keep) explicit,
and shrinks the call-site logic in `chunk_group.rs`.

### How?

**`available_modules` as an `OperationVc`:**

- New `ChunkGroupContentInner` is a `turbo_tasks::value` holding the
chunkable items, batch groups, async/traced modules, and an
`OperationVc<AvailableModulesSet>` for `available_modules`.
- `ChunkGroupContent` becomes a plain struct wrapping
`ResolvedVc<ChunkGroupContentInner>` together with the
`AvailabilityInfo` computed for the group.
- `chunk_group_content_operation` is an `OperationVc`-producing function
so its inner `available_modules` can be returned as an
`OperationVc<AvailableModulesSet>`. `AvailableModules` now stores that
operation Vc and `.connect()`s it whenever the set is read, so consumers
reach the set through the operation and inherit its priority.
- Browser and Node.js chunking contexts are updated to thread the new
shape through `make_chunk_group` and friends.

**`MergedModuleInfo` simplification:**

- `replacements` changes from `HashMap<ChunkableModule,
ChunkableModule>` to `HashMap<ChunkableModule,
Option<ChunkableModule>>`: `Some(m)` means "replace with `m`", `None`
means "skip — already included in another merged module", absent means
"keep as-is".
- The old `included` set and `should_create_chunk_item_for` helper are
removed; `should_replace_module` returns the three-way outcome and
consumers match on it once.
- Call sites in `chunk_group.rs` are restructured around the single
match so the logic is no longer split across two lookups.

### Notes

- No user-facing behavior change is intended — this is an internal
refactor in `turbopack-core` (`chunk_group_content`,
`available_modules`, `chunk_group`) and the browser/nodejs chunking
contexts.
- Existing chunking tests in `turbopack-core` exercise the new shape.

<!-- NEXT_JS_LLM_PR -->
2026-05-26 13:10:04 +02:00
2025-10-13 10:43:51 +02:00
2026-05-25 23:40:28 +00:00
…
…
2026-05-20 20:28:20 +02:00
2026-05-04 10:02:50 +02:00
2026-05-25 23:40:28 +00:00
2026-05-25 23:40:28 +00:00
…

Next.js logo

Next.js

Vercel logo NPM version License Join the community on GitHub

Getting Started

Used by some of the world's largest companies, Next.js enables you to create full-stack web applications by extending the latest React features, and integrating powerful Rust-based JavaScript tooling for the fastest builds.

Documentation

Visit https://nextjs.org/docs to view the full documentation.

Community

The Next.js community can be found on GitHub Discussions where you can ask questions, voice ideas, and share your projects with other people.

To chat with other community members you can join the Next.js Discord server.

Do note that our Code of Conduct applies to all Next.js community channels. Users are highly encouraged to read and adhere to it to avoid repercussions.

Contributing

Contributions to Next.js are welcome and highly appreciated. However, before you jump right into it, we would like you to review our Contribution Guidelines to make sure you have a smooth experience contributing to Next.js.

Good First Issues:

We have a list of good first issues that contain bugs that have a relatively limited scope. This is a great place for newcomers and beginners alike to get started, gain experience, and get familiar with our contribution process.


Security

If you believe you have found a security vulnerability in Next.js, we encourage you to responsibly disclose this and NOT open a public issue.

To participate in our Open Source Software Bug Bounty program, please email [email protected]. We will add you to the program and provide further instructions for submitting your report.

S
Description
The React Framework
Readme
2.4 GiB
Languages
JavaScript 55.6%
TypeScript 30%
Rust 12.9%
MDX 0.7%
CSS 0.7%