Skip to content

Commit 94adfc8

Browse files
committed
Turbopack: Refactor output assets to allow to lazy compute output assets
1 parent 2c56a69 commit 94adfc8

File tree

88 files changed

+1400
-1312
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+1400
-1312
lines changed

crates/next-api/src/app.rs

Lines changed: 87 additions & 144 deletions
Large diffs are not rendered by default.

crates/next-api/src/dynamic_imports.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ use turbo_tasks::{
3131
};
3232
use turbopack_core::{
3333
chunk::{
34-
ChunkItem, ChunkableModule, ChunkingContext, ModuleChunkItemIdExt, ModuleId,
34+
ChunkableModule, ChunkingContext, ModuleChunkItemIdExt, ModuleId,
3535
availability_info::AvailabilityInfo,
3636
},
3737
module::Module,
3838
module_graph::{ModuleGraph, SingleModuleGraph, SingleModuleGraphModuleNode},
39-
output::OutputAssets,
39+
output::{OutputAssetsReference, OutputAssetsWithReferenced},
4040
};
4141

4242
use crate::module_graph::DynamicImportEntriesWithImporter;
@@ -72,6 +72,7 @@ pub(crate) async fn collect_next_dynamic_chunks(
7272
)?,
7373
)
7474
.context("Client reference chunk group not found for next/dynamic import")?
75+
.await?
7576
.availability_info
7677
}
7778
NextDynamicChunkAvailability::AvailabilityInfo(availability_info) => {
@@ -103,7 +104,7 @@ pub(crate) async fn collect_next_dynamic_chunks(
103104
pub struct DynamicImportedChunks(
104105
pub FxIndexMap<
105106
ResolvedVc<NextDynamicEntryModule>,
106-
(ResolvedVc<ModuleId>, ResolvedVc<OutputAssets>),
107+
(ResolvedVc<ModuleId>, ResolvedVc<OutputAssetsWithReferenced>),
107108
>,
108109
);
109110

crates/next-api/src/font.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use anyhow::Result;
2-
use next_core::{all_assets_from_entries, next_manifests::NextFontManifest};
2+
use next_core::next_manifests::NextFontManifest;
33
use turbo_rcstr::RcStr;
44
use turbo_tasks::{ResolvedVc, Vc};
55
use turbo_tasks_fs::{File, FileSystemPath};
66
use turbopack_core::{
77
asset::{Asset, AssetContent},
8-
output::{OutputAsset, OutputAssets},
8+
output::{OutputAsset, OutputAssets, OutputAssetsReference},
9+
reference::all_assets_from_entries,
910
};
1011

1112
use crate::paths::get_font_paths_from_root;
@@ -22,6 +23,9 @@ pub struct FontManifest {
2223
pub app_dir: bool,
2324
}
2425

26+
#[turbo_tasks::value_impl]
27+
impl OutputAssetsReference for FontManifest {}
28+
2529
#[turbo_tasks::value_impl]
2630
impl OutputAsset for FontManifest {
2731
#[turbo_tasks::function]

crates/next-api/src/instrumentation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use anyhow::{Result, bail};
22
use next_core::{
3-
all_assets_from_entries,
43
next_edge::entry::wrap_edge_entry,
54
next_manifests::{InstrumentationDefinition, MiddlewaresManifestV2},
65
};
@@ -21,6 +20,7 @@ use turbopack_core::{
2120
chunk_group_info::{ChunkGroup, ChunkGroupEntry},
2221
},
2322
output::{OutputAsset, OutputAssets, OutputAssetsWithReferenced},
23+
reference::all_assets_from_entries,
2424
reference_type::{EntryReferenceSubType, ReferenceType},
2525
source::Source,
2626
virtual_output::VirtualOutputAsset,

crates/next-api/src/loadable_manifest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub async fn create_react_loadable_manifest(
2323
let mut loadable_manifest: FxIndexMap<String, LoadableManifest> = FxIndexMap::default();
2424

2525
for (_, (module_id, chunk_output)) in dynamic_import_entries.into_iter() {
26-
let chunk_output = chunk_output.await?;
26+
let chunk_output = chunk_output.assets().await?;
2727

2828
let id = &*module_id.await?;
2929

crates/next-api/src/middleware.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::future::IntoFuture;
22

33
use anyhow::{Result, bail};
44
use next_core::{
5-
all_assets_from_entries,
65
middleware::get_middleware_module,
76
next_edge::entry::wrap_edge_entry,
87
next_manifests::{EdgeFunctionDefinition, MiddlewaresManifestV2, ProxyMatcher, Regions},
@@ -26,6 +25,7 @@ use turbopack_core::{
2625
chunk_group_info::{ChunkGroup, ChunkGroupEntry},
2726
},
2827
output::{OutputAsset, OutputAssets, OutputAssetsWithReferenced},
28+
reference::all_assets_from_entries,
2929
reference_type::{EntryReferenceSubType, ReferenceType},
3030
source::Source,
3131
virtual_output::VirtualOutputAsset,

crates/next-api/src/next_server_nft.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use turbopack_core::{
1616
asset::{Asset, AssetContent},
1717
context::AssetContext,
1818
file_source::FileSource,
19-
output::{OutputAsset, OutputAssets},
19+
output::{OutputAsset, OutputAssets, OutputAssetsReference},
2020
reference_type::{CommonJsReferenceSubType, ReferenceType},
2121
resolve::{origin::PlainResolveOrigin, parse::Request},
2222
traced_asset::TracedAsset,
@@ -76,6 +76,9 @@ impl ServerNftJsonAsset {
7676
}
7777
}
7878

79+
#[turbo_tasks::value_impl]
80+
impl OutputAssetsReference for ServerNftJsonAsset {}
81+
7982
#[turbo_tasks::value_impl]
8083
impl OutputAsset for ServerNftJsonAsset {
8184
#[turbo_tasks::function]

crates/next-api/src/nft_json.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use turbo_tasks_fs::{
1414
};
1515
use turbopack_core::{
1616
asset::{Asset, AssetContent},
17-
output::{OutputAsset, OutputAssets},
17+
output::{OutputAsset, OutputAssets, OutputAssetsReference},
1818
};
1919

2020
use crate::project::Project;
@@ -59,6 +59,9 @@ impl NftJsonAsset {
5959
}
6060
}
6161

62+
#[turbo_tasks::value_impl]
63+
impl OutputAssetsReference for NftJsonAsset {}
64+
6265
#[turbo_tasks::value_impl]
6366
impl OutputAsset for NftJsonAsset {
6467
#[turbo_tasks::function]
@@ -454,7 +457,7 @@ impl Visit<(ResolvedVc<Box<dyn OutputAsset>>, Option<ReadRef<RcStr>>)>
454457
node: &(ResolvedVc<Box<dyn OutputAsset>>, Option<ReadRef<RcStr>>),
455458
) -> Self::EdgesFuture {
456459
let client_root = self.client_root.clone();
457-
let exclude_glob = self.exclude_glob.clone();
460+
let exclude_glob: Option<ReadRef<Glob>> = self.exclude_glob.clone();
458461
get_referenced_server_assets(self.emit_spans, node.0, client_root, exclude_glob)
459462
}
460463

@@ -478,7 +481,7 @@ async fn get_referenced_server_assets(
478481
client_root: Option<FileSystemPath>,
479482
exclude_glob: Option<ReadRef<Glob>>,
480483
) -> Result<Vec<(ResolvedVc<Box<dyn OutputAsset>>, Option<ReadRef<RcStr>>)>> {
481-
let refs = asset.references().await?;
484+
let refs = asset.references().direct_assets().await?;
482485

483486
refs.iter()
484487
.map(async |asset| {

crates/next-api/src/pages.rs

Lines changed: 37 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use anyhow::{Context, Result, bail};
22
use futures::future::BoxFuture;
33
use next_core::{
4-
PageLoaderAsset, all_assets_from_entries, create_page_loader_entry_module,
5-
get_asset_path_from_pathname, get_edge_resolve_options_context,
4+
PageLoaderAsset, create_page_loader_entry_module, get_asset_path_from_pathname,
5+
get_edge_resolve_options_context,
66
hmr_entry::HmrEntryModule,
77
mode::NextMode,
88
next_client::{
@@ -56,7 +56,8 @@ use turbopack_core::{
5656
GraphEntries, ModuleGraph, SingleModuleGraph, VisitedModules,
5757
chunk_group_info::{ChunkGroup, ChunkGroupEntry},
5858
},
59-
output::{OptionOutputAsset, OutputAsset, OutputAssets, OutputAssetsWithReferenced},
59+
output::{OptionOutputAsset, OutputAsset, OutputAssets},
60+
reference::all_assets_from_entries,
6061
reference_type::{EcmaScriptModulesReferenceSubType, EntryReferenceSubType, ReferenceType},
6162
resolve::{origin::PlainResolveOrigin, parse::Request, pattern::Pattern},
6263
source::Source,
@@ -1002,34 +1003,24 @@ impl PageEndpoint {
10021003
NextRuntime::Edge => edge_chunking_context,
10031004
};
10041005

1005-
let mut current_chunks = OutputAssets::empty();
1006-
let mut current_referenced_assets = OutputAssets::empty();
1007-
let mut current_availability_info = AvailabilityInfo::Root;
1006+
let mut current_chunk_group = ChunkGroupResult::empty_resolved();
10081007
for layout in [document_module, app_module].iter().flatten().copied() {
10091008
let span = tracing::trace_span!(
10101009
"layout segment",
10111010
name = display(layout.ident().to_string().await?)
10121011
);
10131012
async {
1014-
let ChunkGroupResult {
1015-
assets,
1016-
referenced_assets,
1017-
availability_info,
1018-
} = *chunking_context
1019-
.chunk_group(
1020-
layout.ident(),
1021-
ChunkGroup::Shared(layout),
1022-
ssr_module_graph,
1023-
current_availability_info,
1024-
)
1025-
.await?;
1013+
let chunk_group = chunking_context.chunk_group(
1014+
layout.ident(),
1015+
ChunkGroup::Shared(layout),
1016+
ssr_module_graph,
1017+
current_chunk_group.await?.availability_info,
1018+
);
10261019

1027-
current_chunks = current_chunks.concatenate(*assets).resolve().await?;
1028-
current_referenced_assets = current_referenced_assets
1029-
.concatenate(*referenced_assets)
1030-
.resolve()
1020+
current_chunk_group = current_chunk_group
1021+
.concatenate(chunk_group)
1022+
.to_resolved()
10311023
.await?;
1032-
current_availability_info = availability_info;
10331024

10341025
anyhow::Ok(())
10351026
}
@@ -1041,27 +1032,22 @@ impl PageEndpoint {
10411032
.context("could not process page loader entry module")?;
10421033
let is_edge = matches!(runtime, NextRuntime::Edge);
10431034
if is_edge {
1044-
let OutputAssetsWithReferenced {
1045-
assets: edge_assets,
1046-
referenced_assets: edge_referenced_assets,
1047-
} = *edge_chunking_context
1048-
.evaluated_chunk_group_assets(
1049-
ssr_module.ident(),
1050-
ChunkGroup::Entry(vec![ResolvedVc::upcast(ssr_module_evaluatable)]),
1051-
ssr_module_graph,
1052-
current_availability_info,
1053-
)
1035+
let chunk_assets = edge_chunking_context.evaluated_chunk_group_assets(
1036+
ssr_module.ident(),
1037+
ChunkGroup::Entry(vec![ResolvedVc::upcast(ssr_module_evaluatable)]),
1038+
ssr_module_graph,
1039+
current_chunk_group.await?.availability_info,
1040+
);
1041+
1042+
let chunk_assets = current_chunk_group
1043+
.output_assets_with_referenced()
1044+
.concatenate(chunk_assets)
1045+
.to_resolved()
10541046
.await?;
10551047

10561048
Ok(SsrChunk::Edge {
1057-
assets: current_chunks
1058-
.concatenate(*edge_assets)
1059-
.to_resolved()
1060-
.await?,
1061-
referenced_assets: current_referenced_assets
1062-
.concatenate(*edge_referenced_assets)
1063-
.to_resolved()
1064-
.await?,
1049+
assets: chunk_assets.assets().to_resolved().await?,
1050+
referenced_assets: chunk_assets.referenced_assets().to_resolved().await?,
10651051
dynamic_import_entries,
10661052
regions: regions.clone(),
10671053
}
@@ -1078,9 +1064,9 @@ impl PageEndpoint {
10781064
ssr_entry_chunk_path,
10791065
EvaluatableAssets::empty().with_entry(*ssr_module_evaluatable),
10801066
ssr_module_graph,
1081-
current_chunks,
1082-
current_referenced_assets,
1083-
current_availability_info,
1067+
current_chunk_group.assets(),
1068+
current_chunk_group.referenced_assets(),
1069+
current_chunk_group.await?.availability_info,
10841070
)
10851071
.to_resolved()
10861072
.await?;
@@ -1320,21 +1306,14 @@ impl PageEndpoint {
13201306

13211307
let ssr_chunk = match this.ty {
13221308
PageEndpointType::Html => {
1323-
let client_chunk_group = self.client_chunk_group().await?;
1324-
let client_chunks = *client_chunk_group.assets;
1325-
client_assets.extend(client_chunks.await?.iter().map(|asset| **asset));
1326-
client_assets.extend(
1327-
client_chunk_group
1328-
.referenced_assets
1329-
.await?
1330-
.iter()
1331-
.map(|asset| **asset),
1332-
);
1309+
let client_chunk_group = self.client_chunk_group();
1310+
client_assets.extend(client_chunk_group.direct_assets().await?.iter().copied());
1311+
let client_chunks = *client_chunk_group.await?.assets;
13331312

13341313
let build_manifest = self.build_manifest(client_chunks).to_resolved().await?;
1335-
let page_loader = self.page_loader(client_chunks);
1314+
let page_loader = self.page_loader(client_chunks).to_resolved().await?;
13361315
let client_build_manifest = self
1337-
.client_build_manifest(page_loader)
1316+
.client_build_manifest(*page_loader)
13381317
.to_resolved()
13391318
.await?;
13401319
client_assets.push(page_loader);
@@ -1349,7 +1328,7 @@ impl PageEndpoint {
13491328
PageEndpointType::SsrOnly => self.ssr_chunk(emit_manifests),
13501329
};
13511330

1352-
let client_assets = OutputAssets::new(client_assets).to_resolved().await?;
1331+
let client_assets: ResolvedVc<OutputAssets> = ResolvedVc::cell(client_assets);
13531332

13541333
let manifest_path_prefix = get_asset_prefix_from_pathname(&this.pathname);
13551334
let node_root = this.pages_project.project().node_root().owned().await?;
@@ -1380,7 +1359,7 @@ impl PageEndpoint {
13801359
let webpack_stats = generate_webpack_stats(
13811360
self.client_module_graph(),
13821361
this.original_name.clone(),
1383-
client_assets.await?.iter().copied(),
1362+
client_assets.await?.into_iter().copied(),
13841363
)
13851364
.await?;
13861365
let stats_output = VirtualOutputAsset::new(

crates/next-api/src/paths.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use anyhow::Result;
2-
use next_core::{all_assets_from_entries, next_manifests::AssetBinding};
2+
use next_core::next_manifests::AssetBinding;
33
use tracing::Instrument;
44
use turbo_rcstr::RcStr;
55
use turbo_tasks::{ResolvedVc, TryFlatJoinIterExt, TryJoinIterExt, Vc};
66
use turbo_tasks_fs::FileSystemPath;
77
use turbopack_core::{
88
asset::Asset,
99
output::{OutputAsset, OutputAssets},
10+
reference::all_assets_from_entries,
1011
};
1112
use turbopack_wasm::wasm_edge_var_name;
1213

0 commit comments

Comments
 (0)