Skip to content

Commit 39fd917

Browse files
authored
Split into dev server and next.rs api mode (#53220)
### What? * split into two dev modes * split app-index into webpack and turbopack * add two different entrypoints ### Why? ### How?
1 parent a1adaf8 commit 39fd917

21 files changed

Lines changed: 180 additions & 108 deletions

File tree

packages/next-swc/crates/next-core/js/src/build/client/app-bootstrap.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,10 @@
33
*/
44

55
import '../shims'
6-
import 'next/dist/client/app-next'
6+
import { appBootstrap } from 'next/dist/client/app-bootstrap'
7+
8+
appBootstrap(() => {
9+
require('./app-turbopack')
10+
const { hydrate } = require('./app-index')
11+
hydrate()
12+
})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @ts-expect-error
2+
process.env.__NEXT_NEW_LINK_BEHAVIOR = true
3+
4+
// eslint-disable-next-line no-undef
5+
self.__next_require__ = __turbopack_require__
6+
7+
// @ts-ignore
8+
// eslint-disable-next-line no-undef
9+
;(self as any).__next_chunk_load__ = __turbopack_load__

packages/next-swc/crates/next-core/src/app_source.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ async fn next_client_transition(
133133
next_config: Vc<NextConfig>,
134134
) -> Result<Vc<Box<dyn Transition>>> {
135135
let ty: Value<ClientContextType> = Value::new(ClientContextType::App { app_dir });
136-
let mode = NextMode::Development;
136+
let mode = NextMode::DevServer;
137137
let client_module_options_context = get_client_module_options_context(
138138
project_path,
139139
execution_context,
@@ -170,7 +170,7 @@ fn next_ssr_client_module_transition(
170170
server_addr: Vc<ServerAddr>,
171171
) -> Vc<Box<dyn Transition>> {
172172
let ty = Value::new(ServerContextType::AppSSR { app_dir });
173-
let mode = NextMode::Development;
173+
let mode = NextMode::DevServer;
174174
Vc::upcast(
175175
NextSSRClientModuleTransition {
176176
ssr_module_options_context: get_server_module_options_context(
@@ -202,7 +202,7 @@ fn next_edge_ssr_client_module_transition(
202202
server_addr: Vc<ServerAddr>,
203203
) -> Vc<Box<dyn Transition>> {
204204
let ty = Value::new(ServerContextType::AppSSR { app_dir });
205-
let mode = NextMode::Development;
205+
let mode = NextMode::DevServer;
206206
Vc::upcast(
207207
NextSSRClientModuleTransition {
208208
ssr_module_options_context: get_server_module_options_context(
@@ -306,7 +306,7 @@ fn next_edge_route_transition(
306306
output_path: Vc<FileSystemPath>,
307307
execution_context: Vc<ExecutionContext>,
308308
) -> Vc<Box<dyn Transition>> {
309-
let mode = NextMode::Development;
309+
let mode = NextMode::DevServer;
310310
let server_ty = Value::new(ServerContextType::AppRoute { app_dir });
311311

312312
let edge_compile_time_info = get_edge_compile_time_info(project_path, server_addr);
@@ -570,7 +570,7 @@ pub async fn create_app_source(
570570
client_chunking_context,
571571
client_compile_time_info,
572572
true,
573-
NextMode::Development,
573+
NextMode::DevServer,
574574
next_config,
575575
server_addr,
576576
output_path,
@@ -584,7 +584,7 @@ pub async fn create_app_source(
584584
client_chunking_context,
585585
client_compile_time_info,
586586
false,
587-
NextMode::Development,
587+
NextMode::DevServer,
588588
next_config,
589589
server_addr,
590590
output_path,
@@ -905,7 +905,7 @@ impl AppRenderer {
905905
loader_tree,
906906
context,
907907
ServerComponentTransition::TransitionName(rsc_transition.to_string()),
908-
NextMode::Development,
908+
NextMode::DevServer,
909909
)
910910
.await?;
911911

packages/next-swc/crates/next-core/src/fallback.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub async fn get_fallback_page(
3737
next_config: Vc<NextConfig>,
3838
) -> Result<Vc<DevHtmlAsset>> {
3939
let ty = Value::new(ClientContextType::Fallback);
40-
let mode = NextMode::Development;
40+
let mode = NextMode::DevServer;
4141
let resolve_options_context =
4242
get_client_resolve_options_context(project_path, ty, mode, next_config, execution_context);
4343
let module_options_context = get_client_module_options_context(

packages/next-swc/crates/next-core/src/loader_tree.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl LoaderTreeBuilder {
107107
let identifier = magic_identifier::mangle(&format!("{name} #{i}"));
108108

109109
match self.mode {
110-
NextMode::Development => {
110+
NextMode::Development | NextMode::DevServer => {
111111
let chunks_identifier =
112112
magic_identifier::mangle(&format!("chunks of {name} #{i}"));
113113
writeln!(

packages/next-swc/crates/next-core/src/mode.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ use turbo_tasks::{debug::ValueDebugFormat, trace::TraceRawVcs, TaskInput};
1818
ValueDebugFormat,
1919
)]
2020
pub enum NextMode {
21-
/// `next dev`
21+
/// `next dev --turbo`
22+
DevServer,
23+
/// `next dev --experimental-turbo`
2224
Development,
2325
/// `next build`
2426
Build,
@@ -28,15 +30,15 @@ impl NextMode {
2830
/// Returns the NODE_ENV value for the current mode.
2931
pub fn node_env(&self) -> &'static str {
3032
match self {
31-
NextMode::Development => "development",
33+
NextMode::Development | NextMode::DevServer => "development",
3234
NextMode::Build => "production",
3335
}
3436
}
3537

3638
/// Returns true if the development React runtime should be used.
3739
pub fn is_react_development(&self) -> bool {
3840
match self {
39-
NextMode::Development => true,
41+
NextMode::Development | NextMode::DevServer => true,
4042
NextMode::Build => false,
4143
}
4244
}

packages/next-swc/crates/next-core/src/next_client/context.rs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,10 @@ pub fn get_client_chunking_context(
291291
);
292292

293293
let builder = match mode {
294-
NextMode::Development => builder.hot_module_replacement(),
294+
NextMode::DevServer => builder.hot_module_replacement(),
295+
NextMode::Development => builder
296+
.hot_module_replacement()
297+
.chunk_base_path(Vc::cell(Some("_next/".to_string()))),
295298
NextMode::Build => builder.chunk_base_path(Vc::cell(Some("_next/".to_string()))),
296299
};
297300

@@ -328,6 +331,27 @@ pub async fn get_client_runtime_entries(
328331
}
329332

330333
match mode {
334+
NextMode::DevServer => {
335+
let resolve_options_context = get_client_resolve_options_context(
336+
project_root,
337+
ty,
338+
mode,
339+
next_config,
340+
execution_context,
341+
);
342+
let enable_react_refresh =
343+
assert_can_resolve_react_refresh(project_root, resolve_options_context)
344+
.await?
345+
.as_request();
346+
347+
// It's important that React Refresh come before the regular bootstrap file,
348+
// because the bootstrap contains JSX which requires Refresh's global
349+
// functions to be available.
350+
if let Some(request) = enable_react_refresh {
351+
runtime_entries
352+
.push(RuntimeEntry::Request(request, project_root.join("_".to_string())).cell())
353+
};
354+
}
331355
NextMode::Development => {
332356
let resolve_options_context = get_client_resolve_options_context(
333357
project_root,
@@ -348,6 +372,18 @@ pub async fn get_client_runtime_entries(
348372
runtime_entries
349373
.push(RuntimeEntry::Request(request, project_root.join("_".to_string())).cell())
350374
};
375+
376+
if matches!(*ty, ClientContextType::App { .. },) {
377+
runtime_entries.push(
378+
RuntimeEntry::Request(
379+
Request::parse(Value::new(Pattern::Constant(
380+
"next/dist/client/app-next-dev-turbopack.js".to_string(),
381+
))),
382+
project_root.join("_".to_string()),
383+
)
384+
.cell(),
385+
);
386+
}
351387
}
352388
NextMode::Build => match *ty {
353389
ClientContextType::App { .. } => {

packages/next-swc/crates/next-core/src/next_import_map.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ pub async fn insert_next_server_special_aliases(
391391
// In development, we *always* use the bundled version of React, even in
392392
// SSR, since we're bundling Next.js alongside it.
393393
(
394-
NextMode::Development,
394+
NextMode::DevServer,
395395
ServerContextType::AppSSR { app_dir }
396396
| ServerContextType::AppRSC { app_dir, .. }
397397
| ServerContextType::AppRoute { app_dir },
@@ -429,15 +429,15 @@ pub async fn insert_next_server_special_aliases(
429429
// NOTE(alexkirsz) This logic maps loosely to
430430
// `next.js/packages/next/src/build/webpack-config.ts`, where:
431431
//
432-
// ## RSC (Build)
432+
// ## RSC
433433
//
434434
// * always bundles
435435
// * maps react -> react/shared-subset (through the "react-server" exports condition)
436436
// * maps react-dom -> react-dom/server-rendering-stub
437437
// * passes through (react|react-dom|react-server-dom-webpack)/(.*) to
438438
// next/dist/compiled/$1/$2
439439
(
440-
NextMode::Build,
440+
NextMode::Build | NextMode::Development,
441441
ServerContextType::AppRSC { app_dir, .. } | ServerContextType::AppRoute { app_dir },
442442
) => {
443443
import_map.insert_exact_alias(
@@ -471,14 +471,14 @@ pub async fn insert_next_server_special_aliases(
471471
);
472472
}
473473
}
474-
// ## SSR (Build)
474+
// ## SSR
475475
//
476476
// * always uses externals, to ensure we're using the same React instance as the Next.js
477477
// runtime
478478
// * maps react-dom -> react-dom/server-rendering-stub
479479
// * passes through react and (react|react-dom|react-server-dom-webpack)/(.*) to
480480
// next/dist/compiled/react and next/dist/compiled/$1/$2 resp.
481-
(NextMode::Build, ServerContextType::AppSSR { .. }) => {
481+
(NextMode::Build | NextMode::Development, ServerContextType::AppSSR { .. }) => {
482482
import_map.insert_exact_alias(
483483
"react",
484484
external_request_to_import_mapping("next/dist/compiled/react"),

packages/next-swc/crates/next-core/src/next_server/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,7 @@ pub fn get_server_runtime_entries(
643643

644644
match mode {
645645
NextMode::Development => {}
646+
NextMode::DevServer => {}
646647
NextMode::Build => {
647648
if let ServerContextType::AppRSC { .. } = ty.into_value() {
648649
runtime_entries.push(

packages/next-swc/crates/next-core/src/next_shared/transforms/next_dynamic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@ impl CustomTransformer for NextJsDynamic {
6060
let p = std::mem::replace(program, Program::Module(Module::dummy()));
6161
*program = p.fold_with(&mut next_dynamic(
6262
match self.mode {
63-
NextMode::Development => true,
63+
NextMode::Development | NextMode::DevServer => true,
6464
NextMode::Build => false,
6565
},
6666
self.is_server,
6767
self.is_server_components,
6868
NextDynamicMode::Turbopack {
6969
dynamic_transition_name: match self.mode {
70-
NextMode::Development => "next-client-chunks".to_string(),
70+
NextMode::Development | NextMode::DevServer => "next-client-chunks".to_string(),
7171
NextMode::Build => "next-dynamic".to_string(),
7272
},
7373
},

0 commit comments

Comments
 (0)