Skip to content

Commit

Permalink
Turbopack: accept ChunkGroup in chunking context
Browse files Browse the repository at this point in the history
  • Loading branch information
mischnic committed Feb 19, 2025
1 parent 7076218 commit 0c2e325
Show file tree
Hide file tree
Showing 13 changed files with 214 additions and 458 deletions.
34 changes: 19 additions & 15 deletions crates/next-api/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,15 @@ use turbopack::{
use turbopack_core::{
asset::AssetContent,
chunk::{
availability_info::AvailabilityInfo, ChunkGroupType, ChunkableModule, ChunkableModules,
ChunkingContext, ChunkingContextExt, EvaluatableAsset, EvaluatableAssets,
availability_info::AvailabilityInfo, ChunkGroupType, ChunkingContext, ChunkingContextExt,
EvaluatableAsset, EvaluatableAssets,
},
file_source::FileSource,
ident::AssetIdent,
module::Module,
module_graph::{GraphEntries, ModuleGraph, SingleModuleGraph, VisitedModules},
module_graph::{
chunk_group_info::ChunkGroup, GraphEntries, ModuleGraph, SingleModuleGraph, VisitedModules,
},
output::{OutputAsset, OutputAssets},
raw_output::RawOutput,
reference_type::{CssReferenceSubType, ReferenceType},
Expand Down Expand Up @@ -1661,20 +1663,17 @@ impl AppEndpoint {
let client_references = client_references.await?;
let span = tracing::trace_span!("server utils");
async {
let server_utils = client_references
.server_utils
.iter()
.map(|m| async move {
Ok(*ResolvedVc::try_downcast::<Box<dyn ChunkableModule>>(*m)
.context("Expected server utils to be chunkable")?)
})
.try_join()
.await?;
let server_utils = client_references.server_utils.clone();
let chunk_group = chunking_context
.chunk_group_multiple(
.chunk_group(
AssetIdent::from_path(this.app_project.project().project_path())
.with_modifier(server_utils_modifier()),
ChunkableModules::interned(server_utils),
// TODO this should be ChunkGroup::Shared
ChunkGroup::Entry {
entries: server_utils,
ty: ChunkGroupType::Entry,
}
.cell(),
module_graph,
Value::new(current_availability_info),
)
Expand Down Expand Up @@ -1709,7 +1708,12 @@ impl AppEndpoint {
let chunk_group = chunking_context
.chunk_group(
server_component.ident(),
*ResolvedVc::upcast(server_component),
// TODO this should be ChunkGroup::Shared
ChunkGroup::Entry {
entries: vec![ResolvedVc::upcast(server_component)],
ty: ChunkGroupType::Entry,
}
.cell(),
module_graph,
Value::new(current_availability_info),
)
Expand Down
191 changes: 102 additions & 89 deletions crates/next-core/src/next_app/app_client_references_chunks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,19 @@ use turbo_tasks::{
FxIndexMap, ResolvedVc, TryFlatJoinIterExt, TryJoinIterExt, Value, ValueToString, Vc,
};
use turbopack_core::{
chunk::{
availability_info::AvailabilityInfo, ChunkableModules, ChunkingContext, ChunkingContextExt,
},
chunk::{availability_info::AvailabilityInfo, ChunkingContext},
module::Module,
module_graph::ModuleGraph,
module_graph::{chunk_group_info::ChunkGroup, ModuleGraph},
output::OutputAssets,
};

use crate::{
next_client_reference::{
visit_client_reference::ClientReferenceGraphResult, ClientReferenceType,
ecmascript_client_reference::ecmascript_client_reference_module::{
ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_CLIENT, ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_SSR,
},
visit_client_reference::ClientReferenceGraphResult,
ClientReferenceType,
},
next_server_component::server_component_module::NextServerComponentModule,
};
Expand Down Expand Up @@ -57,91 +59,92 @@ pub async fn get_app_client_references_chunks(
let separate_chunk_group_per_client_reference = false;
let app_client_references = app_client_references.await?;
if separate_chunk_group_per_client_reference {
let app_client_references_chunks: Vec<(_, (_, Option<_>))> = app_client_references
.client_references
.iter()
.map(|client_reference| async move {
let client_reference_ty = client_reference.ty();
Ok((
client_reference_ty,
match client_reference_ty {
ClientReferenceType::EcmascriptClientReference(
ecmascript_client_reference,
) => {
let ecmascript_client_reference_ref =
ecmascript_client_reference.await?;
todo!();
// let app_client_references_chunks: Vec<(_, (_, Option<_>))> = app_client_references
// .client_references
// .iter()
// .map(|client_reference| async move {
// let client_reference_ty = client_reference.ty();
// Ok((
// client_reference_ty,
// match client_reference_ty {
// ClientReferenceType::EcmascriptClientReference(
// ecmascript_client_reference,
// ) => {
// let ecmascript_client_reference_ref =
// ecmascript_client_reference.await?;

let client_chunk_group = client_chunking_context
.root_chunk_group(
*ResolvedVc::upcast(
ecmascript_client_reference_ref.client_module,
),
module_graph,
)
.await?;
// let client_chunk_group = client_chunking_context
// .root_chunk_group(
// module_graph,
// *ResolvedVc::upcast(
// ecmascript_client_reference_ref.client_module,
// ),
// )
// .await?;

(
(
client_chunk_group.assets,
client_chunk_group.availability_info,
),
if let Some(ssr_chunking_context) = ssr_chunking_context {
let ssr_chunk_group = ssr_chunking_context
.root_chunk_group(
*ResolvedVc::upcast(
ecmascript_client_reference_ref.ssr_module,
),
module_graph,
)
.await?;
// (
// (
// client_chunk_group.assets,
// client_chunk_group.availability_info,
// ),
// if let Some(ssr_chunking_context) = ssr_chunking_context {
// let ssr_chunk_group = ssr_chunking_context
// .root_chunk_group(
// *ResolvedVc::upcast(
// ecmascript_client_reference_ref.ssr_module,
// ),
// module_graph,
// )
// .await?;

Some((
ssr_chunk_group.assets,
ssr_chunk_group.availability_info,
))
} else {
None
},
)
}
ClientReferenceType::CssClientReference(css_client_reference) => {
let client_chunk_group = client_chunking_context
.root_chunk_group(
*ResolvedVc::upcast(css_client_reference),
module_graph,
)
.await?;
// Some((
// ssr_chunk_group.assets,
// ssr_chunk_group.availability_info,
// ))
// } else {
// None
// },
// )
// }
// ClientReferenceType::CssClientReference(css_client_reference) => {
// let client_chunk_group = client_chunking_context
// .root_chunk_group(
// *ResolvedVc::upcast(css_client_reference),
// module_graph,
// )
// .await?;

(
(
client_chunk_group.assets,
client_chunk_group.availability_info,
),
None,
)
}
},
))
})
.try_join()
.await?;
// (
// (
// client_chunk_group.assets,
// client_chunk_group.availability_info,
// ),
// None,
// )
// }
// },
// ))
// })
// .try_join()
// .await?;

Ok(ClientReferencesChunks {
client_component_client_chunks: app_client_references_chunks
.iter()
.map(|&(client_reference_ty, (client_chunks, _))| {
(client_reference_ty, client_chunks)
})
.collect(),
client_component_ssr_chunks: app_client_references_chunks
.iter()
.flat_map(|&(client_reference_ty, (_, ssr_chunks))| {
ssr_chunks.map(|ssr_chunks| (client_reference_ty, ssr_chunks))
})
.collect(),
layout_segment_client_chunks: FxIndexMap::default(),
}
.cell())
// Ok(ClientReferencesChunks {
// client_component_client_chunks: app_client_references_chunks
// .iter()
// .map(|&(client_reference_ty, (client_chunks, _))| {
// (client_reference_ty, client_chunks)
// })
// .collect(),
// client_component_ssr_chunks: app_client_references_chunks
// .iter()
// .flat_map(|&(client_reference_ty, (_, ssr_chunks))| {
// ssr_chunks.map(|ssr_chunks| (client_reference_ty, ssr_chunks))
// })
// .collect(),
// layout_segment_client_chunks: FxIndexMap::default(),
// }
// .cell())
} else {
let mut client_references_by_server_component: FxIndexMap<_, Vec<_>> =
FxIndexMap::default();
Expand Down Expand Up @@ -212,9 +215,14 @@ pub async fn get_app_client_references_chunks(
)
.entered();

ssr_chunking_context.chunk_group_multiple(
ssr_chunking_context.chunk_group(
base_ident.with_modifier(ssr_modules_modifier()),
ChunkableModules::interned(ssr_modules),
// TODO use correct parameters here, and sort the modules?
ChunkGroup::isolated_merged_interned(
0,
ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_SSR.clone(),
ssr_modules,
),
module_graph,
Value::new(current_ssr_availability_info),
)
Expand Down Expand Up @@ -246,9 +254,14 @@ pub async fn get_app_client_references_chunks(
)
.entered();

Some(client_chunking_context.chunk_group_multiple(
Some(client_chunking_context.chunk_group(
base_ident.with_modifier(client_modules_modifier()),
ChunkableModules::interned(client_modules),
// TODO use correct parameters here, and sort the modules?
ChunkGroup::isolated_merged_interned(
0,
ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_CLIENT.clone(),
client_modules,
),
module_graph,
Value::new(current_client_availability_info),
))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use std::{io::Write, iter::once};

use anyhow::{bail, Context, Result};
use indoc::writedoc;
use once_cell::sync::Lazy;
use turbo_rcstr::RcStr;
use turbo_tasks::{ResolvedVc, Value, ValueToString, Vc};
use turbo_tasks_fs::File;
Expand Down Expand Up @@ -191,6 +192,10 @@ fn ecmascript_client_reference_ssr_ref_modifier() -> Vc<RcStr> {
Vc::cell("ecmascript client reference to ssr".into())
}

pub static ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_CLIENT: Lazy<RcStr> =
Lazy::new(|| "client".into());
pub static ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_SSR: Lazy<RcStr> = Lazy::new(|| "ssr".into());

#[turbo_tasks::value_impl]
impl Module for EcmascriptClientReferenceModule {
#[turbo_tasks::function]
Expand All @@ -216,7 +221,7 @@ impl Module for EcmascriptClientReferenceModule {
EcmascriptClientReference::new(
*ResolvedVc::upcast(*client_module),
ChunkGroupType::Evaluated,
Some("client".into()),
Some(ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_CLIENT.clone()),
ecmascript_client_reference_client_ref_modifier(),
)
.to_resolved()
Expand All @@ -226,7 +231,7 @@ impl Module for EcmascriptClientReferenceModule {
EcmascriptClientReference::new(
*ResolvedVc::upcast(*ssr_module),
ChunkGroupType::Entry,
Some("ssr".into()),
Some(ECMASCRIPT_CLIENT_REFERENCE_MERGE_TAG_SSR.clone()),
ecmascript_client_reference_ssr_ref_modifier(),
)
.to_resolved()
Expand Down
33 changes: 9 additions & 24 deletions turbopack/crates/turbopack-browser/src/chunking_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ use turbopack_core::{
availability_info::AvailabilityInfo,
chunk_group::{make_chunk_group, MakeChunkGroupResult},
module_id_strategies::{DevModuleIdStrategy, ModuleIdStrategy},
Chunk, ChunkGroupResult, ChunkItem, ChunkableModule, ChunkableModules, ChunkingConfig,
ChunkingConfigs, ChunkingContext, EntryChunkGroupResult, EvaluatableAssets, MinifyType,
ModuleId, SourceMapsType,
Chunk, ChunkGroupResult, ChunkItem, ChunkableModule, ChunkingConfig, ChunkingConfigs,
ChunkingContext, EntryChunkGroupResult, EvaluatableAssets, MinifyType, ModuleId,
SourceMapsType,
},
environment::Environment,
ident::AssetIdent,
module::Module,
module_graph::ModuleGraph,
module_graph::{chunk_group_info::ChunkGroup, ModuleGraph},
output::{OutputAsset, OutputAssets},
};
use turbopack_ecmascript::{
Expand Down Expand Up @@ -415,39 +415,24 @@ impl ChunkingContext for BrowserChunkingContext {
}

#[turbo_tasks::function]
fn chunk_group(
self: Vc<Self>,
ident: Vc<AssetIdent>,
module: ResolvedVc<Box<dyn ChunkableModule>>,
module_graph: Vc<ModuleGraph>,
availability_info: Value<AvailabilityInfo>,
) -> Vc<ChunkGroupResult> {
self.chunk_group_multiple(
ident,
Vc::cell(vec![module]),
module_graph,
availability_info,
)
}

#[turbo_tasks::function]
async fn chunk_group_multiple(
async fn chunk_group(
self: ResolvedVc<Self>,
ident: Vc<AssetIdent>,
modules: Vc<ChunkableModules>,
chunk_group: Vc<ChunkGroup>,
module_graph: Vc<ModuleGraph>,
availability_info: Value<AvailabilityInfo>,
) -> Result<Vc<ChunkGroupResult>> {
let span = tracing::info_span!("chunking", ident = ident.to_string().await?.to_string());
async move {
let this = self.await?;
let modules = modules.await?;
let chunk_group = chunk_group.await?;
let modules = chunk_group.entries();
let input_availability_info = availability_info.into_value();
let MakeChunkGroupResult {
chunks,
availability_info,
} = make_chunk_group(
modules.iter().copied().map(ResolvedVc::upcast),
modules,
module_graph,
ResolvedVc::upcast(self),
input_availability_info,
Expand Down
Loading

0 comments on commit 0c2e325

Please sign in to comment.