Skip to content

Commit b6be532

Browse files
authored
perf(turbopack): Use ResolvedVc for next-api, part 3 (#73236)
### What? Use `ResolvedVc<T>` instead of `Vc<T>` for struct fields in `next-api`, but split into multiple PRs. ### Why? To reduce scope of changes of each PRs so I can debug HMR failures. ### How?
1 parent 2efe544 commit b6be532

File tree

3 files changed

+63
-51
lines changed

3 files changed

+63
-51
lines changed

crates/next-api/src/app.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,15 +1149,15 @@ impl AppEndpoint {
11491149
)
11501150
.await?;
11511151
server_assets.insert(server_action_manifest.manifest);
1152-
Some(server_action_manifest.loader)
1152+
Some(server_action_manifest.loader.to_resolved().await?)
11531153
} else {
11541154
None
11551155
};
11561156

11571157
let (app_entry_chunks, app_entry_chunks_availability) = &*self
11581158
.app_entry_chunks(
11591159
client_references,
1160-
server_action_manifest_loader,
1160+
server_action_manifest_loader.map(|v| *v),
11611161
server_path,
11621162
process_client_assets,
11631163
)

crates/next-api/src/pages.rs

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ use crate::{
8080

8181
#[turbo_tasks::value]
8282
pub struct PagesProject {
83-
project: Vc<Project>,
83+
project: ResolvedVc<Project>,
8484
}
8585

8686
#[turbo_tasks::value_impl]
8787
impl PagesProject {
8888
#[turbo_tasks::function]
89-
pub fn new(project: Vc<Project>) -> Vc<Self> {
89+
pub fn new(project: ResolvedVc<Project>) -> Vc<Self> {
9090
PagesProject { project }.cell()
9191
}
9292

@@ -234,7 +234,7 @@ impl PagesProject {
234234

235235
#[turbo_tasks::function]
236236
fn project(&self) -> Vc<Project> {
237-
self.project
237+
*self.project
238238
}
239239

240240
#[turbo_tasks::function]
@@ -598,11 +598,11 @@ impl PagesProject {
598598
#[turbo_tasks::value]
599599
struct PageEndpoint {
600600
ty: PageEndpointType,
601-
pages_project: Vc<PagesProject>,
602-
pathname: Vc<RcStr>,
603-
original_name: Vc<RcStr>,
604-
page: Vc<PagesStructureItem>,
605-
pages_structure: Vc<PagesStructure>,
601+
pages_project: ResolvedVc<PagesProject>,
602+
pathname: ResolvedVc<RcStr>,
603+
original_name: ResolvedVc<RcStr>,
604+
page: ResolvedVc<PagesStructureItem>,
605+
pages_structure: ResolvedVc<PagesStructure>,
606606
}
607607

608608
#[derive(
@@ -629,11 +629,11 @@ impl PageEndpoint {
629629
#[turbo_tasks::function]
630630
fn new(
631631
ty: PageEndpointType,
632-
pages_project: Vc<PagesProject>,
633-
pathname: Vc<RcStr>,
634-
original_name: Vc<RcStr>,
635-
page: Vc<PagesStructureItem>,
636-
pages_structure: Vc<PagesStructure>,
632+
pages_project: ResolvedVc<PagesProject>,
633+
pathname: ResolvedVc<RcStr>,
634+
original_name: ResolvedVc<RcStr>,
635+
page: ResolvedVc<PagesStructureItem>,
636+
pages_structure: ResolvedVc<PagesStructure>,
637637
) -> Vc<Self> {
638638
PageEndpoint {
639639
ty,
@@ -657,7 +657,7 @@ impl PageEndpoint {
657657
let page_loader = create_page_loader_entry_module(
658658
this.pages_project.client_module_context(),
659659
self.source(),
660-
this.pathname,
660+
*this.pathname,
661661
);
662662
if matches!(
663663
*this.pages_project.project().next_mode().await?,
@@ -721,7 +721,7 @@ impl PageEndpoint {
721721
let client_relative_path = self.client_relative_path();
722722
let page_loader = PageLoaderAsset::new(
723723
node_root,
724-
this.pathname,
724+
*this.pathname,
725725
client_relative_path,
726726
client_chunks,
727727
);
@@ -762,13 +762,13 @@ impl PageEndpoint {
762762

763763
let ssr_module = if is_edge {
764764
create_page_ssr_entry_module(
765-
this.pathname,
765+
*this.pathname,
766766
reference_type,
767767
project_root,
768768
Vc::upcast(edge_module_context),
769769
self.source(),
770-
this.original_name,
771-
this.pages_structure,
770+
*this.original_name,
771+
*this.pages_structure,
772772
config.runtime,
773773
this.pages_project.project().next_config(),
774774
)
@@ -781,13 +781,13 @@ impl PageEndpoint {
781781
ssr_module
782782
} else {
783783
create_page_ssr_entry_module(
784-
this.pathname,
784+
*this.pathname,
785785
reference_type,
786786
project_root,
787787
Vc::upcast(module_context),
788788
self.source(),
789-
this.original_name,
790-
this.pages_structure,
789+
*this.original_name,
790+
*this.pages_structure,
791791
config.runtime,
792792
this.pages_project.project().next_config(),
793793
)
@@ -836,18 +836,23 @@ impl PageEndpoint {
836836
.context("could not process page loader entry module")?;
837837
evaluatable_assets.push(evaluatable);
838838

839-
let edge_files = edge_chunking_context.evaluated_chunk_group_assets(
840-
ssr_module.ident(),
841-
Vc::cell(evaluatable_assets),
842-
Value::new(AvailabilityInfo::Root),
843-
);
839+
let edge_files = edge_chunking_context
840+
.evaluated_chunk_group_assets(
841+
ssr_module.ident(),
842+
Vc::cell(evaluatable_assets),
843+
Value::new(AvailabilityInfo::Root),
844+
)
845+
.to_resolved()
846+
.await?;
844847

845848
let client_chunking_context =
846849
this.pages_project.project().client_chunking_context();
847850
let dynamic_import_entries = collect_evaluated_chunk_group(
848851
Vc::upcast(client_chunking_context),
849852
dynamic_import_modules,
850853
)
854+
.await?
855+
.to_resolved()
851856
.await?;
852857

853858
Ok(SsrChunk::Edge {
@@ -882,6 +887,8 @@ impl PageEndpoint {
882887
dynamic_import_modules,
883888
Value::new(AvailabilityInfo::Root),
884889
)
890+
.await?
891+
.to_resolved()
885892
.await?;
886893

887894
let server_asset_trace_file = if this
@@ -1064,7 +1071,7 @@ impl PageEndpoint {
10641071
let pathname = this.pathname.await?;
10651072
let original_name = &*this.original_name.await?;
10661073

1067-
let client_assets = OutputAssets::new(client_assets);
1074+
let client_assets = OutputAssets::new(client_assets).to_resolved().await?;
10681075

10691076
let manifest_path_prefix = get_asset_prefix_from_pathname(&pathname);
10701077
let node_root = this.pages_project.project().node_root();
@@ -1075,7 +1082,7 @@ impl PageEndpoint {
10751082
original_name,
10761083
&manifest_path_prefix,
10771084
&pathname,
1078-
client_assets,
1085+
*client_assets,
10791086
false,
10801087
)
10811088
.await?;
@@ -1117,13 +1124,13 @@ impl PageEndpoint {
11171124
server_assets.push(pages_manifest);
11181125

11191126
let loadable_manifest_output =
1120-
self.react_loadable_manifest(dynamic_import_entries);
1127+
self.react_loadable_manifest(*dynamic_import_entries);
11211128
server_assets.extend(loadable_manifest_output.await?.iter().copied());
11221129
}
11231130

11241131
PageEndpointOutput::NodeJs {
11251132
entry_chunk: entry,
1126-
server_assets: Vc::cell(server_assets),
1133+
server_assets: ResolvedVc::cell(server_assets),
11271134
client_assets,
11281135
}
11291136
}
@@ -1157,7 +1164,7 @@ impl PageEndpoint {
11571164
file_paths_from_root
11581165
.extend(get_js_paths_from_root(&node_root_value, &files_value).await?);
11591166

1160-
let all_output_assets = all_assets_from_entries(files).await?;
1167+
let all_output_assets = all_assets_from_entries(*files).await?;
11611168

11621169
wasm_paths_from_root.extend(
11631170
get_wasm_paths_from_root(&node_root_value, &all_output_assets).await?,
@@ -1209,12 +1216,13 @@ impl PageEndpoint {
12091216
server_assets.push(ResolvedVc::upcast(middleware_manifest_v2));
12101217
}
12111218

1212-
let loadable_manifest_output = self.react_loadable_manifest(dynamic_import_entries);
1219+
let loadable_manifest_output =
1220+
self.react_loadable_manifest(*dynamic_import_entries);
12131221
server_assets.extend(loadable_manifest_output.await?.iter().copied());
12141222

12151223
PageEndpointOutput::Edge {
12161224
files,
1217-
server_assets: Vc::cell(server_assets),
1225+
server_assets: ResolvedVc::cell(server_assets),
12181226
client_assets,
12191227
}
12201228
}
@@ -1359,13 +1367,13 @@ impl Endpoint for PageEndpoint {
13591367
enum PageEndpointOutput {
13601368
NodeJs {
13611369
entry_chunk: ResolvedVc<Box<dyn OutputAsset>>,
1362-
server_assets: Vc<OutputAssets>,
1363-
client_assets: Vc<OutputAssets>,
1370+
server_assets: ResolvedVc<OutputAssets>,
1371+
client_assets: ResolvedVc<OutputAssets>,
13641372
},
13651373
Edge {
1366-
files: Vc<OutputAssets>,
1367-
server_assets: Vc<OutputAssets>,
1368-
client_assets: Vc<OutputAssets>,
1374+
files: ResolvedVc<OutputAssets>,
1375+
server_assets: ResolvedVc<OutputAssets>,
1376+
client_assets: ResolvedVc<OutputAssets>,
13691377
},
13701378
}
13711379

@@ -1388,15 +1396,15 @@ impl PageEndpointOutput {
13881396
pub fn server_assets(&self) -> Vc<OutputAssets> {
13891397
match *self {
13901398
PageEndpointOutput::NodeJs { server_assets, .. }
1391-
| PageEndpointOutput::Edge { server_assets, .. } => server_assets,
1399+
| PageEndpointOutput::Edge { server_assets, .. } => *server_assets,
13921400
}
13931401
}
13941402

13951403
#[turbo_tasks::function]
13961404
pub fn client_assets(&self) -> Vc<OutputAssets> {
13971405
match *self {
13981406
PageEndpointOutput::NodeJs { client_assets, .. }
1399-
| PageEndpointOutput::Edge { client_assets, .. } => client_assets,
1407+
| PageEndpointOutput::Edge { client_assets, .. } => *client_assets,
14001408
}
14011409
}
14021410
}
@@ -1405,11 +1413,11 @@ impl PageEndpointOutput {
14051413
pub enum SsrChunk {
14061414
NodeJs {
14071415
entry: ResolvedVc<Box<dyn OutputAsset>>,
1408-
dynamic_import_entries: Vc<DynamicImportedChunks>,
1416+
dynamic_import_entries: ResolvedVc<DynamicImportedChunks>,
14091417
server_asset_trace_file: ResolvedVc<OptionOutputAsset>,
14101418
},
14111419
Edge {
1412-
files: Vc<OutputAssets>,
1413-
dynamic_import_entries: Vc<DynamicImportedChunks>,
1420+
files: ResolvedVc<OutputAssets>,
1421+
dynamic_import_entries: ResolvedVc<DynamicImportedChunks>,
14141422
},
14151423
}

crates/next-api/src/project.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,21 +197,25 @@ pub struct Instrumentation {
197197
pub struct ProjectContainer {
198198
name: RcStr,
199199
options_state: State<Option<ProjectOptions>>,
200-
versioned_content_map: Option<Vc<VersionedContentMap>>,
200+
versioned_content_map: Option<ResolvedVc<VersionedContentMap>>,
201201
}
202202

203203
#[turbo_tasks::value_impl]
204204
impl ProjectContainer {
205205
#[turbo_tasks::function]
206-
pub fn new(name: RcStr, dev: bool) -> Vc<Self> {
207-
ProjectContainer {
206+
pub async fn new(name: RcStr, dev: bool) -> Result<Vc<Self>> {
207+
Ok(ProjectContainer {
208208
name,
209209
// we only need to enable versioning in dev mode, since build
210210
// is assumed to be operating over a static snapshot
211-
versioned_content_map: dev.then(VersionedContentMap::new),
211+
versioned_content_map: if dev {
212+
Some(VersionedContentMap::new().to_resolved().await?)
213+
} else {
214+
None
215+
},
212216
options_state: State::new(None),
213217
}
214-
.cell()
218+
.cell())
215219
}
216220
}
217221

@@ -384,7 +388,7 @@ impl ProjectContainer {
384388
} else {
385389
NextMode::Build.cell()
386390
},
387-
versioned_content_map: self.versioned_content_map,
391+
versioned_content_map: self.versioned_content_map.map(|v| *v),
388392
build_id,
389393
encryption_key,
390394
preview_props,

0 commit comments

Comments
 (0)