Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

route/middleware/instrumentation use server assets instead of client assets #62134

Merged
merged 7 commits into from
Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 79 additions & 15 deletions packages/next-swc/crates/next-api/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ impl AppProject {
}
}

fn route_ty(self: Vc<Self>) -> ServerContextType {
ServerContextType::AppRoute {
app_dir: self.app_dir(),
}
}

fn ssr_ty(self: Vc<Self>) -> ServerContextType {
ServerContextType::AppSSR {
app_dir: self.app_dir(),
Expand Down Expand Up @@ -174,6 +180,17 @@ impl AppProject {
))
}

#[turbo_tasks::function]
async fn route_module_options_context(self: Vc<Self>) -> Result<Vc<ModuleOptionsContext>> {
Ok(get_server_module_options_context(
self.project().project_path(),
self.project().execution_context(),
Value::new(self.route_ty()),
self.project().next_mode(),
self.project().next_config(),
))
}

#[turbo_tasks::function]
async fn rsc_resolve_options_context(self: Vc<Self>) -> Result<Vc<ResolveOptionsContext>> {
Ok(get_server_resolve_options_context(
Expand All @@ -196,6 +213,30 @@ impl AppProject {
))
}

#[turbo_tasks::function]
async fn route_resolve_options_context(self: Vc<Self>) -> Result<Vc<ResolveOptionsContext>> {
Ok(get_server_resolve_options_context(
self.project().project_path(),
Value::new(self.route_ty()),
self.project().next_mode(),
self.project().next_config(),
self.project().execution_context(),
))
}

#[turbo_tasks::function]
async fn edge_route_resolve_options_context(
self: Vc<Self>,
) -> Result<Vc<ResolveOptionsContext>> {
Ok(get_edge_resolve_options_context(
self.project().project_path(),
Value::new(self.route_ty()),
self.project().next_mode(),
self.project().next_config(),
self.project().execution_context(),
))
}

#[turbo_tasks::function]
fn rsc_module_context(self: Vc<Self>) -> Vc<ModuleAssetContext> {
let transitions = [
Expand Down Expand Up @@ -257,6 +298,28 @@ impl AppProject {
)
}

#[turbo_tasks::function]
fn route_module_context(self: Vc<Self>) -> Vc<ModuleAssetContext> {
ModuleAssetContext::new(
Default::default(),
self.project().server_compile_time_info(),
self.route_module_options_context(),
self.route_resolve_options_context(),
Vc::cell("app-route".to_string()),
)
}

#[turbo_tasks::function]
fn edge_route_module_context(self: Vc<Self>) -> Vc<ModuleAssetContext> {
ModuleAssetContext::new(
Default::default(),
self.project().edge_compile_time_info(),
self.route_module_options_context(),
self.edge_route_resolve_options_context(),
Vc::cell("app-edge-route".to_string()),
)
}

#[turbo_tasks::function]
fn client_module_context(self: Vc<Self>) -> Vc<ModuleAssetContext> {
ModuleAssetContext::new(
Expand Down Expand Up @@ -490,8 +553,8 @@ impl AppEndpoint {
#[turbo_tasks::function]
fn app_route_entry(&self, path: Vc<FileSystemPath>) -> Vc<AppEntry> {
get_app_route_entry(
self.app_project.rsc_module_context(),
self.app_project.edge_rsc_module_context(),
self.app_project.route_module_context(),
self.app_project.edge_route_module_context(),
Vc::upcast(FileSource::new(path)),
self.page.clone(),
self.app_project.project().project_path(),
Expand Down Expand Up @@ -520,19 +583,18 @@ impl AppEndpoint {
async fn output(self: Vc<Self>) -> Result<Vc<AppEndpointOutput>> {
let this = self.await?;

let (app_entry, process_client, process_ssr, has_client_side_assets) = match this.ty {
let (app_entry, process_client, process_ssr) = match this.ty {
AppEndpointType::Page { ty, loader_tree } => (
self.app_page_entry(loader_tree),
true,
matches!(ty, AppPageEndpointType::Html),
true,
),
// NOTE(alexkirsz) For routes, technically, a lot of the following code is not needed,
// as we know we won't have any client references. However, for now, for simplicity's
// sake, we just do the same thing as for pages.
AppEndpointType::Route { path } => (self.app_route_entry(path), false, false, false),
AppEndpointType::Route { path } => (self.app_route_entry(path), false, false),
AppEndpointType::Metadata { metadata } => {
(self.app_metadata_entry(metadata), false, false, false)
(self.app_metadata_entry(metadata), false, false)
}
};

Expand Down Expand Up @@ -613,12 +675,12 @@ impl AppEndpoint {
let ssr_chunking_context = if process_ssr {
Some(match runtime {
NextRuntime::NodeJs => {
Vc::upcast(this.app_project.project().server_chunking_context())
Vc::upcast(this.app_project.project().server_chunking_context(true))
}
NextRuntime::Edge => this
.app_project
.project()
.edge_chunking_context(has_client_side_assets),
.edge_chunking_context(process_client),
})
} else {
None
Expand Down Expand Up @@ -845,7 +907,7 @@ impl AppEndpoint {
let chunking_context = this
.app_project
.project()
.edge_chunking_context(has_client_side_assets);
.edge_chunking_context(process_client);
let mut evaluatable_assets = this
.app_project
.edge_rsc_runtime_entries()
Expand Down Expand Up @@ -985,6 +1047,11 @@ impl AppEndpoint {
let mut evaluatable_assets =
this.app_project.rsc_runtime_entries().await?.clone_value();

let chunking_context = this
.app_project
.project()
.server_chunking_context(process_client);

if let Some(app_server_reference_modules) = app_server_reference_modules {
let (loader, manifest) = create_server_actions_manifest(
Vc::upcast(app_entry.rsc_entry),
Expand All @@ -994,7 +1061,7 @@ impl AppEndpoint {
&app_entry.original_name,
NextRuntime::NodeJs,
Vc::upcast(this.app_project.rsc_module_context()),
Vc::upcast(this.app_project.project().server_chunking_context()),
Vc::upcast(chunking_context),
)
.await?;
server_assets.push(manifest);
Expand All @@ -1003,10 +1070,7 @@ impl AppEndpoint {

let EntryChunkGroupResult {
asset: rsc_chunk, ..
} = *this
.app_project
.project()
.server_chunking_context()
} = *chunking_context
.entry_chunk_group(
server_path.join(format!(
"app{original_name}.js",
Expand Down Expand Up @@ -1035,7 +1099,7 @@ impl AppEndpoint {
let dynamic_import_modules =
collect_next_dynamic_imports(app_entry.rsc_entry).await?;
let dynamic_import_entries = collect_chunk_group(
this.app_project.project().server_chunking_context(),
chunking_context,
dynamic_import_modules,
availability_info,
)
Expand Down
2 changes: 1 addition & 1 deletion packages/next-swc/crates/next-api/src/instrumentation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ impl InstrumentationEndpoint {

#[turbo_tasks::function]
async fn node_chunk(&self) -> Result<Vc<Box<dyn OutputAsset>>> {
let chunking_context = self.project.server_chunking_context();
let chunking_context = self.project.server_chunking_context(false);

let userland_module = self
.context
Expand Down
6 changes: 3 additions & 3 deletions packages/next-swc/crates/next-api/src/pages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -794,7 +794,7 @@ impl PageEndpoint {
this.pages_project.project().project_path(),
this.pages_project.ssr_module_context(),
this.pages_project.edge_ssr_module_context(),
this.pages_project.project().server_chunking_context(),
this.pages_project.project().server_chunking_context(true),
this.pages_project.project().edge_chunking_context(true),
this.pages_project.ssr_runtime_entries(),
this.pages_project.edge_ssr_runtime_entries(),
Expand All @@ -814,7 +814,7 @@ impl PageEndpoint {
this.pages_project.project().project_path(),
this.pages_project.ssr_data_module_context(),
this.pages_project.edge_ssr_data_module_context(),
this.pages_project.project().server_chunking_context(),
this.pages_project.project().server_chunking_context(true),
this.pages_project.project().edge_chunking_context(true),
this.pages_project.ssr_data_runtime_entries(),
this.pages_project.edge_ssr_data_runtime_entries(),
Expand All @@ -834,7 +834,7 @@ impl PageEndpoint {
this.pages_project.project().project_path(),
this.pages_project.api_module_context(),
this.pages_project.edge_api_module_context(),
this.pages_project.project().server_chunking_context(),
this.pages_project.project().server_chunking_context(false),
this.pages_project.project().edge_chunking_context(false),
this.pages_project.ssr_runtime_entries(),
this.pages_project.edge_ssr_runtime_entries(),
Expand Down
41 changes: 26 additions & 15 deletions packages/next-swc/crates/next-api/src/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ use next_core::{
next_client::{get_client_chunking_context, get_client_compile_time_info},
next_config::{JsConfig, NextConfig},
next_server::{
get_server_chunking_context, get_server_compile_time_info,
get_server_module_options_context, get_server_resolve_options_context, ServerContextType,
get_server_chunking_context, get_server_chunking_context_with_client_assets,
get_server_compile_time_info, get_server_module_options_context,
get_server_resolve_options_context, ServerContextType,
},
next_telemetry::NextFeatureTelemetry,
};
Expand Down Expand Up @@ -557,25 +558,35 @@ impl Project {
}

#[turbo_tasks::function]
pub(super) async fn server_chunking_context(
pub(super) fn server_chunking_context(
self: Vc<Self>,
) -> Result<Vc<NodeJsChunkingContext>> {
Ok(get_server_chunking_context(
self.next_mode(),
self.project_path(),
self.node_root(),
self.client_relative_path(),
self.next_config().computed_asset_prefix(),
self.server_compile_time_info().environment(),
))
client_assets: bool,
) -> Vc<NodeJsChunkingContext> {
if client_assets {
get_server_chunking_context_with_client_assets(
self.next_mode(),
self.project_path(),
self.node_root(),
self.client_relative_path(),
self.next_config().computed_asset_prefix(),
self.server_compile_time_info().environment(),
)
} else {
get_server_chunking_context(
self.next_mode(),
self.project_path(),
self.node_root(),
self.server_compile_time_info().environment(),
)
}
}

#[turbo_tasks::function]
pub(super) fn edge_chunking_context(
self: Vc<Self>,
client_assets: bool,
) -> Result<Vc<Box<dyn EcmascriptChunkingContext>>> {
Ok(if client_assets {
) -> Vc<Box<dyn EcmascriptChunkingContext>> {
if client_assets {
get_edge_chunking_context_with_client_assets(
self.next_mode(),
self.project_path(),
Expand All @@ -591,7 +602,7 @@ impl Project {
self.node_root(),
self.edge_compile_time_info().environment(),
)
})
}
}

/// Emit a telemetry event corresponding to [webpack configuration telemetry](https://github.com/vercel/next.js/blob/9da305fe320b89ee2f8c3cfb7ecbf48856368913/packages/next/src/build/webpack-config.ts#L2516)
Expand Down
3 changes: 2 additions & 1 deletion packages/next-swc/crates/next-core/src/next_edge/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ pub async fn get_edge_chunking_context_with_client_assets(
project_path,
output_root,
client_root,
output_root.join("chunks".to_string()),
output_root.join("chunks/ssr".to_string()),
client_root.join("static/media".to_string()),
environment,
next_mode.runtime_type(),
Expand Down Expand Up @@ -200,6 +200,7 @@ pub async fn get_edge_chunking_context(
// asset from the output directory.
.asset_base_path(Vc::cell(Some("blob:server/edge/".to_string())))
.reference_chunk_source_maps(should_debug("edge"))
.minify_type(next_mode.minify_type())
.build(),
))
}
54 changes: 28 additions & 26 deletions packages/next-swc/crates/next-core/src/next_import_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -675,32 +675,34 @@ async fn rsc_aliases(
};

if runtime == NextRuntime::NodeJs {
if let ServerContextType::AppSSR { .. } = ty {
alias.extend(indexmap! {
"react/jsx-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-runtime"),
"react/jsx-dev-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime"),
"react" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react"),
"react-dom" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-dom"),
"react-server-dom-webpack/client.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client-edge"),
"react-server-dom-turbopack/client.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client-edge"),
})
}

if let ServerContextType::AppRSC { .. } = ty {
alias.extend(indexmap! {
"react/jsx-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-jsx-runtime"),
"react/jsx-dev-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime"),
"react" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react"),
"react-dom" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-dom"),
"react-server-dom-webpack/server.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-edge"),
"react-server-dom-webpack/server.node" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-node"),
"react-server-dom-turbopack/server.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-edge"),
"react-server-dom-turbopack/server.node" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-node"),
"next/navigation" => format!("next/dist/api/navigation.react-server"),

// Needed to make `react-dom/server` work.
"next/dist/compiled/react" => format!("next/dist/compiled/react/index.js"),
})
match ty {
ServerContextType::AppSSR { .. } => {
alias.extend(indexmap! {
"react/jsx-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-runtime"),
"react/jsx-dev-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime"),
"react" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react"),
"react-dom" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-dom"),
"react-server-dom-webpack/client.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client-edge"),
"react-server-dom-turbopack/client.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client-edge"),
})
}
ServerContextType::AppRSC { .. } | ServerContextType::AppRoute { .. } => {
alias.extend(indexmap! {
"react/jsx-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-jsx-runtime"),
"react/jsx-dev-runtime" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime"),
"react" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react"),
"react-dom" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-dom"),
"react-server-dom-webpack/server.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-edge"),
"react-server-dom-webpack/server.node" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-node"),
"react-server-dom-turbopack/server.edge" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-edge"),
"react-server-dom-turbopack/server.node" => format!("next/dist/server/future/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server-node"),
"next/navigation" => format!("next/dist/api/navigation.react-server"),

// Needed to make `react-dom/server` work.
"next/dist/compiled/react" => format!("next/dist/compiled/react/index.js"),
})
}
_ => {}
}
}

Expand Down
Loading