Skip to content

Commit 5aa9fc6

Browse files
jridgewellsokra
andauthored
Chunking Refactor Step 2 (vercel/turborepo#6120)
### Description The second step in our chunking refactoring, this removes our use of `Module::as_chunk` and `Module::as_root_chunk`. Instead, the only way to generate a chunk is directly from a root `ChunkItem`. Re: vercel/turborepo#6104 ### Testing Instructions <!-- Give a quick description of steps to test your changes. --> Closes WEB-1720 --------- Co-authored-by: Tobias Koppers <[email protected]>
1 parent 067b170 commit 5aa9fc6

File tree

14 files changed

+130
-175
lines changed

14 files changed

+130
-175
lines changed

crates/turbopack-build/src/chunking_context.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ use turbo_tasks::{
88
};
99
use turbo_tasks_fs::FileSystemPath;
1010
use turbopack_core::{
11-
chunk::{Chunk, ChunkableModuleExt, ChunkingContext, Chunks, EvaluatableAssets},
11+
chunk::{
12+
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkableModule, ChunkingContext,
13+
Chunks, EvaluatableAssets,
14+
},
1215
environment::Environment,
1316
ident::AssetIdent,
1417
module::Module,
@@ -163,7 +166,12 @@ impl BuildChunkingContext {
163166
module: Vc<Box<dyn EcmascriptChunkPlaceable>>,
164167
evaluatable_assets: Vc<EvaluatableAssets>,
165168
) -> Result<Vc<Box<dyn OutputAsset>>> {
166-
let entry_chunk = module.as_root_chunk(Vc::upcast(self));
169+
let entry_chunk =
170+
module
171+
.as_chunk_item(Vc::upcast(self))
172+
.as_chunk(Value::new(AvailabilityInfo::Root {
173+
current_availability_root: Vc::upcast(module),
174+
}));
167175

168176
let other_chunks = self
169177
.get_chunk_assets(entry_chunk, evaluatable_assets)
@@ -214,7 +222,10 @@ impl BuildChunkingContext {
214222
.map({
215223
move |evaluatable_asset| async move {
216224
evaluatable_asset
217-
.as_root_chunk(Vc::upcast(self))
225+
.as_chunk_item(Vc::upcast(self))
226+
.as_chunk(Value::new(AvailabilityInfo::Root {
227+
current_availability_root: Vc::upcast(*evaluatable_asset),
228+
}))
218229
.resolve()
219230
.await
220231
}
@@ -350,8 +361,12 @@ impl ChunkingContext for BuildChunkingContext {
350361
#[turbo_tasks::function]
351362
async fn chunk_group(
352363
self: Vc<Self>,
353-
entry_chunk: Vc<Box<dyn Chunk>>,
364+
module: Vc<Box<dyn ChunkableModule>>,
365+
availability_info: Value<AvailabilityInfo>,
354366
) -> Result<Vc<OutputAssets>> {
367+
let entry_chunk = module
368+
.as_chunk_item(Vc::upcast(self))
369+
.as_chunk(availability_info);
355370
let parallel_chunks = get_parallel_chunks([entry_chunk]).await?;
356371

357372
let optimized_chunks = get_optimized_chunks(parallel_chunks).await?;
@@ -368,7 +383,7 @@ impl ChunkingContext for BuildChunkingContext {
368383
#[turbo_tasks::function]
369384
async fn evaluated_chunk_group(
370385
self: Vc<Self>,
371-
_entry_chunk: Vc<Box<dyn Chunk>>,
386+
_ident: Vc<AssetIdent>,
372387
_evaluatable_assets: Vc<EvaluatableAssets>,
373388
) -> Result<Vc<OutputAssets>> {
374389
// TODO(alexkirsz) This method should be part of a separate trait that is

crates/turbopack-cli/src/build/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use turbopack_build::{BuildChunkingContext, MinifyType};
1414
use turbopack_cli_utils::issue::{ConsoleUi, LogOptions};
1515
use turbopack_core::{
1616
asset::Asset,
17-
chunk::{ChunkableModule, ChunkableModuleExt, ChunkingContext, EvaluatableAssets},
17+
chunk::{ChunkableModule, ChunkingContextExt, EvaluatableAssets},
1818
environment::{BrowserEnvironment, Environment, ExecutionEnvironment},
1919
issue::{handle_issues, IssueReporter, IssueSeverity},
2020
module::Module,
@@ -269,7 +269,7 @@ async fn build_internal(
269269
} else if let Some(chunkable) =
270270
Vc::try_resolve_sidecast::<Box<dyn ChunkableModule>>(entry_module).await?
271271
{
272-
chunking_context.chunk_group(chunkable.as_root_chunk(chunking_context))
272+
chunking_context.root_chunk_group(chunkable)
273273
} else {
274274
// TODO convert into a serve-able asset
275275
bail!(

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

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use anyhow::Result;
2-
use turbo_tasks::{ValueToString, Vc};
2+
use turbo_tasks::{Upcast, Value, ValueToString, Vc};
33
use turbo_tasks_fs::FileSystemPath;
44

5-
use super::{Chunk, EvaluatableAssets};
5+
use super::{availability_info::AvailabilityInfo, ChunkableModule, EvaluatableAssets};
66
use crate::{
77
chunk::{ChunkItem, ModuleId},
88
environment::Environment,
@@ -57,11 +57,15 @@ pub trait ChunkingContext {
5757

5858
fn with_layer(self: Vc<Self>, layer: String) -> Vc<Self>;
5959

60-
fn chunk_group(self: Vc<Self>, entry: Vc<Box<dyn Chunk>>) -> Vc<OutputAssets>;
60+
fn chunk_group(
61+
self: Vc<Self>,
62+
module: Vc<Box<dyn ChunkableModule>>,
63+
availability_info: Value<AvailabilityInfo>,
64+
) -> Vc<OutputAssets>;
6165

6266
fn evaluated_chunk_group(
6367
self: Vc<Self>,
64-
entry: Vc<Box<dyn Chunk>>,
68+
ident: Vc<AssetIdent>,
6569
evaluatable_assets: Vc<EvaluatableAssets>,
6670
) -> Vc<OutputAssets>;
6771

@@ -77,3 +81,20 @@ pub trait ChunkingContext {
7781
Ok(ModuleId::String(ident.to_string().await?.clone_value()).cell())
7882
}
7983
}
84+
85+
pub trait ChunkingContextExt {
86+
fn root_chunk_group(self: Vc<Self>, module: Vc<Box<dyn ChunkableModule>>) -> Vc<OutputAssets>
87+
where
88+
Self: Send;
89+
}
90+
91+
impl<T: ChunkingContext + Send + Upcast<Box<dyn ChunkingContext>>> ChunkingContextExt for T {
92+
fn root_chunk_group(self: Vc<Self>, module: Vc<Box<dyn ChunkableModule>>) -> Vc<OutputAssets> {
93+
self.chunk_group(
94+
module,
95+
Value::new(AvailabilityInfo::Root {
96+
current_availability_root: Vc::upcast(module),
97+
}),
98+
)
99+
}
100+
}

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

Lines changed: 12 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use turbo_tasks_hash::DeterministicHash;
2929

3030
use self::availability_info::AvailabilityInfo;
3131
pub use self::{
32-
chunking_context::ChunkingContext,
32+
chunking_context::{ChunkingContext, ChunkingContextExt},
3333
data::{ChunkData, ChunkDataOption, ChunksData},
3434
evaluate::{EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets},
3535
passthrough_asset::PassthroughModule,
@@ -40,7 +40,6 @@ use crate::{
4040
module::{Module, Modules},
4141
output::OutputAssets,
4242
reference::{ModuleReference, ModuleReferences},
43-
resolve::ModuleResolveResult,
4443
};
4544

4645
/// A module id, which can be a number or string
@@ -91,43 +90,6 @@ pub trait ChunkableModule: Module + Asset {
9190
) -> Vc<Box<dyn ChunkItem>>;
9291
}
9392

94-
pub trait ChunkableModuleExt {
95-
fn as_chunk(
96-
self: Vc<Self>,
97-
chunking_context: Vc<Box<dyn ChunkingContext>>,
98-
availability_info: Value<AvailabilityInfo>,
99-
) -> Vc<Box<dyn Chunk>>
100-
where
101-
Self: Send;
102-
fn as_root_chunk(
103-
self: Vc<Self>,
104-
chunking_context: Vc<Box<dyn ChunkingContext>>,
105-
) -> Vc<Box<dyn Chunk>>
106-
where
107-
Self: Send;
108-
}
109-
110-
impl<T: ChunkableModule + Send + Upcast<Box<dyn Module>>> ChunkableModuleExt for T {
111-
fn as_chunk(
112-
self: Vc<Self>,
113-
chunking_context: Vc<Box<dyn ChunkingContext>>,
114-
availability_info: Value<AvailabilityInfo>,
115-
) -> Vc<Box<dyn Chunk>> {
116-
let chunk_item = self.as_chunk_item(chunking_context);
117-
chunk_item.as_chunk(availability_info)
118-
}
119-
120-
fn as_root_chunk(
121-
self: Vc<Self>,
122-
chunking_context: Vc<Box<dyn ChunkingContext>>,
123-
) -> Vc<Box<dyn Chunk>> {
124-
let chunk_item = self.as_chunk_item(chunking_context);
125-
chunk_item.as_chunk(Value::new(AvailabilityInfo::Root {
126-
current_availability_root: Vc::upcast(self),
127-
}))
128-
}
129-
}
130-
13193
#[turbo_tasks::value(transparent)]
13294
pub struct Chunks(Vec<Vc<Box<dyn Chunk>>>);
13395

@@ -224,53 +186,6 @@ pub trait ChunkableModuleReference: ModuleReference + ValueToString {
224186
}
225187
}
226188

227-
/// A reference to multiple chunks from a [ChunkGroup]
228-
#[turbo_tasks::value]
229-
pub struct ChunkGroupReference {
230-
chunking_context: Vc<Box<dyn ChunkingContext>>,
231-
entry: Vc<Box<dyn Chunk>>,
232-
}
233-
234-
#[turbo_tasks::value_impl]
235-
impl ChunkGroupReference {
236-
#[turbo_tasks::function]
237-
pub fn new(
238-
chunking_context: Vc<Box<dyn ChunkingContext>>,
239-
entry: Vc<Box<dyn Chunk>>,
240-
) -> Vc<Self> {
241-
Self::cell(ChunkGroupReference {
242-
chunking_context,
243-
entry,
244-
})
245-
}
246-
247-
#[turbo_tasks::function]
248-
async fn chunks(self: Vc<Self>) -> Result<Vc<OutputAssets>> {
249-
let this = self.await?;
250-
Ok(this.chunking_context.chunk_group(this.entry))
251-
}
252-
}
253-
254-
#[turbo_tasks::value_impl]
255-
impl ModuleReference for ChunkGroupReference {
256-
#[turbo_tasks::function]
257-
async fn resolve_reference(self: Vc<Self>) -> Result<Vc<ModuleResolveResult>> {
258-
let set = self.chunks().await?.clone_value();
259-
Ok(ModuleResolveResult::output_assets(set).cell())
260-
}
261-
}
262-
263-
#[turbo_tasks::value_impl]
264-
impl ValueToString for ChunkGroupReference {
265-
#[turbo_tasks::function]
266-
async fn to_string(&self) -> Result<Vc<String>> {
267-
Ok(Vc::cell(format!(
268-
"chunk group ({})",
269-
self.entry.ident().to_string().await?
270-
)))
271-
}
272-
}
273-
274189
pub struct ChunkContentResult<I> {
275190
pub chunk_items: Vec<I>,
276191
pub chunks: Vec<Vc<Box<dyn Chunk>>>,
@@ -440,17 +355,20 @@ where
440355
}
441356
}
442357
ChunkingType::Parallel => {
443-
let chunk = chunkable_module.as_chunk(
444-
chunk_content_context.chunking_context,
445-
chunk_content_context.availability_info,
446-
);
358+
let chunk = chunkable_module
359+
.as_chunk_item(chunk_content_context.chunking_context)
360+
.as_chunk(chunk_content_context.availability_info);
447361
graph_nodes.push((
448362
Some((module, chunking_type)),
449363
ChunkContentGraphNode::Chunk(chunk),
450364
));
451365
}
452366
ChunkingType::IsolatedParallel => {
453-
let chunk = chunkable_module.as_root_chunk(chunk_content_context.chunking_context);
367+
let chunk = chunkable_module
368+
.as_chunk_item(chunk_content_context.chunking_context)
369+
.as_chunk(Value::new(AvailabilityInfo::Root {
370+
current_availability_root: Vc::upcast(chunkable_module),
371+
}));
454372
graph_nodes.push((
455373
Some((module, chunking_type)),
456374
ChunkContentGraphNode::Chunk(chunk),
@@ -479,10 +397,9 @@ where
479397
}
480398
}
481399

482-
let chunk = chunkable_module.as_chunk(
483-
chunk_content_context.chunking_context,
484-
chunk_content_context.availability_info,
485-
);
400+
let chunk = chunkable_module
401+
.as_chunk_item(chunk_content_context.chunking_context)
402+
.as_chunk(chunk_content_context.availability_info);
486403
graph_nodes.push((
487404
Some((module, chunking_type)),
488405
ChunkContentGraphNode::Chunk(chunk),

crates/turbopack-dev-server/src/html.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ use turbo_tasks_fs::{File, FileSystemPath};
55
use turbo_tasks_hash::{encode_hex, Xxh3Hash64Hasher};
66
use turbopack_core::{
77
asset::{Asset, AssetContent},
8-
chunk::{ChunkableModule, ChunkableModuleExt, ChunkingContext, EvaluatableAssets},
8+
chunk::{ChunkableModule, ChunkingContext, ChunkingContextExt, EvaluatableAssets},
99
ident::AssetIdent,
10+
module::Module,
1011
output::{OutputAsset, OutputAssets},
1112
version::{Version, VersionedContent},
1213
};
@@ -131,11 +132,18 @@ impl DevHtmlAsset {
131132
.map(|entry| async move {
132133
let (chunkable_module, chunking_context, runtime_entries) = entry;
133134

134-
let chunk = chunkable_module.as_root_chunk(*chunking_context);
135135
let assets = if let Some(runtime_entries) = runtime_entries {
136-
chunking_context.evaluated_chunk_group(chunk, *runtime_entries)
136+
let runtime_entries = if let Some(evaluatable) =
137+
Vc::try_resolve_downcast(*chunkable_module).await?
138+
{
139+
runtime_entries.with_entry(evaluatable)
140+
} else {
141+
*runtime_entries
142+
};
143+
chunking_context
144+
.evaluated_chunk_group(chunkable_module.ident(), runtime_entries)
137145
} else {
138-
chunking_context.chunk_group(chunk)
146+
chunking_context.root_chunk_group(Vc::upcast(*chunkable_module))
139147
};
140148

141149
assets.await

0 commit comments

Comments
 (0)