Skip to content

Commit 2c1f68e

Browse files
authored
[Turbopack] include async loaders in chunking instead of separating it (#75052)
### What? Chunk async loaders together with normal chunk items to avoid multiple chunkings and small chunks
1 parent 410250b commit 2c1f68e

File tree

24 files changed

+60
-67
lines changed

24 files changed

+60
-67
lines changed

turbopack/crates/turbopack-core/src/chunk/chunk_group.rs

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ pub async fn make_chunk_group(
163163
})
164164
.try_join()
165165
.await?;
166-
let has_async_loaders = !async_loaders.is_empty();
167166
let async_loader_chunk_items =
168167
async_loaders
169168
.iter()
@@ -180,14 +179,8 @@ pub async fn make_chunk_group(
180179
.map(|&loader| loader.references())
181180
.try_join()
182181
.await?;
183-
let async_loader_external_module_references = Vc::cell(
184-
async_loader_references
185-
.iter()
186-
.flat_map(|references| references.iter().copied())
187-
.collect(),
188-
);
189182

190-
let traced_output_assets = traced_modules
183+
let mut referenced_output_assets = traced_modules
191184
.into_iter()
192185
.map(|module| async move {
193186
Ok(ResolvedVc::upcast(
@@ -203,7 +196,7 @@ pub async fn make_chunk_group(
203196
.try_join()
204197
.await?;
205198

206-
let chunk_items = all_modules
199+
let mut chunk_items = all_modules
207200
.iter()
208201
.map(|(module, async_info)| {
209202
Either::Left(async move {
@@ -234,34 +227,21 @@ pub async fn make_chunk_group(
234227
.try_join()
235228
.await?;
236229

230+
chunk_items.extend(async_loader_chunk_items);
231+
referenced_output_assets.reserve(async_loader_references.iter().map(|r| r.len()).sum());
232+
referenced_output_assets.extend(async_loader_references.into_iter().flatten());
233+
237234
// Pass chunk items to chunking algorithm
238-
let mut chunks = make_chunks(
235+
let chunks = make_chunks(
239236
module_graph,
240237
*chunking_context,
241238
Vc::cell(chunk_items),
242239
"".into(),
243-
Vc::cell(traced_output_assets),
240+
Vc::cell(referenced_output_assets),
244241
)
245242
.await?
246243
.clone_value();
247244

248-
if has_async_loaders {
249-
// Pass async chunk loaders to chunking algorithm
250-
// We want them to be separate since they are specific to this chunk group due
251-
// to available chunk items differing
252-
let async_loader_chunks = make_chunks(
253-
module_graph,
254-
*chunking_context,
255-
Vc::cell(async_loader_chunk_items.into_iter().collect()),
256-
"async-loader-".into(),
257-
async_loader_external_module_references,
258-
)
259-
.await?;
260-
261-
// concatenate chunks
262-
chunks.extend(async_loader_chunks.iter().copied());
263-
}
264-
265245
Ok(MakeChunkGroupResult {
266246
chunks,
267247
availability_info,

turbopack/crates/turbopack-core/src/chunk/chunking/dev.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,29 @@ pub async fn app_vendors_split(
3939
mut name: String,
4040
split_context: &mut SplitContext<'_>,
4141
) -> Result<()> {
42+
let mut chunk_group_specific_chunk_items = Vec::new();
4243
let mut app_chunk_items = Vec::new();
4344
let mut vendors_chunk_items = Vec::new();
4445
for item in chunk_items {
45-
let ChunkItemWithInfo { asset_ident, .. } = &item;
46-
if is_app_code(asset_ident) {
46+
let ChunkItemWithInfo {
47+
asset_ident,
48+
module,
49+
..
50+
} = &item;
51+
if module.is_none() {
52+
// This happens for async module loaders.
53+
// We want them to be in a separate chunk.
54+
chunk_group_specific_chunk_items.push(item);
55+
} else if is_app_code(asset_ident) {
4756
app_chunk_items.push(item);
4857
} else {
4958
vendors_chunk_items.push(item);
5059
}
5160
}
61+
if !chunk_group_specific_chunk_items.is_empty() {
62+
let mut name = format!("{}-specific", name);
63+
make_chunk(chunk_group_specific_chunk_items, &mut name, split_context).await?;
64+
}
5265
let mut remaining = Vec::new();
5366
let mut key = format!("{}-app", name);
5467
if !handle_split_group(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push([
2+
"output/4c35f_tests_snapshot_basic-tree-shake_dynamic-import_input_index_aba1a0.js",
3+
{},
4+
{"otherChunks":["output/b1abf_turbopack-tests_tests_snapshot_basic-tree-shake_dynamic-import_input_lib_44a9b7.js","output/4c35f_tests_snapshot_basic-tree-shake_dynamic-import_input_index_92a5f4.js"],"runtimeModuleIds":["[project]/turbopack/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/input/index.js [test] (ecmascript)"]}
5+
]);
6+
// Dummy runtime

turbopack/crates/turbopack-tests/tests/snapshot/basic-tree-shake/dynamic-import/output/4c35f_tests_snapshot_basic-tree-shake_dynamic-import_input_index_d5474b.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

turbopack/crates/turbopack-tests/tests/snapshot/basic/async_chunk/output/4e721_crates_turbopack-tests_tests_snapshot_basic_async_chunk_input_index_3567a8.js

Lines changed: 0 additions & 6 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
(globalThis.TURBOPACK = globalThis.TURBOPACK || []).push([
2+
"output/4e721_crates_turbopack-tests_tests_snapshot_basic_async_chunk_input_index_c2e2cc.js",
3+
{},
4+
{"otherChunks":["output/4e721_crates_turbopack-tests_tests_snapshot_basic_async_chunk_input_import_46e42b.js","output/turbopack_crates_turbopack-tests_tests_snapshot_basic_async_chunk_input_463663._.js"],"runtimeModuleIds":["[project]/turbopack/crates/turbopack-tests/tests/snapshot/basic/async_chunk/input/index.js [test] (ecmascript)"]}
5+
]);
6+
// Dummy runtime

turbopack/crates/turbopack-tests/tests/snapshot/basic/async_chunk_build/output/index.entry.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

turbopack/crates/turbopack-tests/tests/snapshot/basic/top-level-await/output/4e721_crates_turbopack-tests_tests_snapshot_basic_top-level-await_input_index_b01f59.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)