Skip to content

Commit

Permalink
Introduce NextMode
Browse files Browse the repository at this point in the history
  • Loading branch information
alexkirsz committed May 16, 2023
1 parent 05a9e0a commit 1c09a8d
Show file tree
Hide file tree
Showing 18 changed files with 263 additions and 98 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import './shims'
import 'next/dist/client/next'
11 changes: 11 additions & 0 deletions packages/next-swc/crates/next-core/js/src/build/client/shims.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import '../shims'

// Next uses __webpack_require__ extensively.
globalThis.__webpack_require__ = (name) => {
console.error(
`__webpack_require__ is not implemented (when requiring ${name})`
)
}

// initialize() needs `__webpack_public_path__` to be defined.
globalThis.__webpack_public_path__ = undefined
3 changes: 3 additions & 0 deletions packages/next-swc/crates/next-core/js/src/build/shims.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// This ensures Next.js uses React 18's APIs (hydrateRoot) instead of React 17's
// (hydrate).
process.env.__NEXT_REACT_ROOT = "true";
43 changes: 33 additions & 10 deletions packages/next-swc/crates/next-core/src/app_source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ use crate::{
embed_js::{next_asset, next_js_file, next_js_file_path},
env::env_for_js,
fallback::get_fallback_page,
mode::NextMode,
next_client::{
context::{
get_client_assets_path, get_client_chunking_context, get_client_compile_time_info,
Expand Down Expand Up @@ -139,6 +140,7 @@ async fn next_client_transition(
next_config: NextConfigVc,
) -> Result<TransitionVc> {
let ty = Value::new(ClientContextType::App { app_dir });
let mode = NextMode::Development;
let client_chunking_context = get_client_chunking_context(
project_path,
server_root,
Expand All @@ -150,12 +152,13 @@ async fn next_client_transition(
execution_context,
client_compile_time_info.environment(),
ty,
mode,
next_config,
);
let client_runtime_entries =
get_client_runtime_entries(project_path, env, ty, next_config, execution_context);
get_client_runtime_entries(project_path, env, ty, mode, next_config, execution_context);
let client_resolve_options_context =
get_client_resolve_options_context(project_path, ty, next_config, execution_context);
get_client_resolve_options_context(project_path, ty, mode, next_config, execution_context);

Ok(NextClientTransition {
is_app: true,
Expand All @@ -179,20 +182,23 @@ fn next_ssr_client_module_transition(
server_addr: ServerAddrVc,
) -> TransitionVc {
let ty = Value::new(ServerContextType::AppSSR { app_dir });
let mode = NextMode::Development;
NextSSRClientModuleTransition {
ssr_module_options_context: get_server_module_options_context(
project_path,
execution_context,
ty,
mode,
next_config,
),
ssr_resolve_options_context: get_server_resolve_options_context(
project_path,
ty,
mode,
next_config,
execution_context,
),
ssr_environment: get_server_compile_time_info(ty, process_env, server_addr),
ssr_environment: get_server_compile_time_info(ty, mode, process_env, server_addr),
}
.cell()
.into()
Expand All @@ -209,11 +215,12 @@ fn next_layout_entry_transition(
server_addr: ServerAddrVc,
) -> TransitionVc {
let ty = Value::new(ServerContextType::AppRSC { app_dir });
let rsc_compile_time_info = get_server_compile_time_info(ty, process_env, server_addr);
let mode = NextMode::Development;
let rsc_compile_time_info = get_server_compile_time_info(ty, mode, process_env, server_addr);
let rsc_resolve_options_context =
get_server_resolve_options_context(project_path, ty, next_config, execution_context);
get_server_resolve_options_context(project_path, ty, mode, next_config, execution_context);
let rsc_module_options_context =
get_server_module_options_context(project_path, execution_context, ty, next_config);
get_server_module_options_context(project_path, execution_context, ty, mode, next_config);

NextServerComponentTransition {
rsc_compile_time_info,
Expand Down Expand Up @@ -284,6 +291,7 @@ fn app_context(
output_path: FileSystemPathVc,
) -> AssetContextVc {
let next_server_to_client_transition = NextServerToClientTransition { ssr }.cell().into();
let mode = NextMode::Development;

let mut transitions = HashMap::new();
transitions.insert(
Expand Down Expand Up @@ -333,6 +341,7 @@ fn app_context(
project_path,
execution_context,
client_ty,
mode,
server_root,
client_compile_time_info,
next_config,
Expand All @@ -354,9 +363,21 @@ fn app_context(
let ssr_ty = Value::new(ServerContextType::AppSSR { app_dir });
ModuleAssetContextVc::new(
TransitionsByNameVc::cell(transitions),
get_server_compile_time_info(ssr_ty, env, server_addr),
get_server_module_options_context(project_path, execution_context, ssr_ty, next_config),
get_server_resolve_options_context(project_path, ssr_ty, next_config, execution_context),
get_server_compile_time_info(ssr_ty, mode, env, server_addr),
get_server_module_options_context(
project_path,
execution_context,
ssr_ty,
mode,
next_config,
),
get_server_resolve_options_context(
project_path,
ssr_ty,
mode,
next_config,
execution_context,
),
)
.into()
}
Expand All @@ -381,7 +402,8 @@ pub async fn create_app_source(
let entrypoints = get_entrypoints(app_dir, next_config.page_extensions());
let metadata = get_global_metadata(app_dir, next_config.page_extensions());

let client_compile_time_info = get_client_compile_time_info(browserslist_query);
let client_compile_time_info =
get_client_compile_time_info(NextMode::Development, browserslist_query);

let context_ssr = app_context(
project_path,
Expand Down Expand Up @@ -1017,6 +1039,7 @@ import {}, {{ chunks as {} }} from "COMPONENT_{}";
Value::new(EcmascriptModuleAssetType::Typescript),
EcmascriptInputTransformsVc::cell(vec![
EcmascriptInputTransform::React {
development: true,
refresh: false,
import_source: OptionStringVc::cell(None),
runtime: OptionStringVc::cell(None),
Expand Down
8 changes: 6 additions & 2 deletions packages/next-swc/crates/next-core/src/fallback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ use turbopack_binding::{
};

use crate::{
mode::NextMode,
next_client::context::{
get_client_chunking_context, get_client_module_options_context,
get_client_resolve_options_context, get_client_runtime_entries, ClientContextType,
Expand All @@ -39,13 +40,15 @@ pub async fn get_fallback_page(
next_config: NextConfigVc,
) -> Result<DevHtmlAssetVc> {
let ty = Value::new(ClientContextType::Fallback);
let mode = NextMode::Development;
let resolve_options_context =
get_client_resolve_options_context(project_path, ty, next_config, execution_context);
get_client_resolve_options_context(project_path, ty, mode, next_config, execution_context);
let module_options_context = get_client_module_options_context(
project_path,
execution_context,
client_compile_time_info.environment(),
ty,
mode,
next_config,
);
let chunking_context = get_client_chunking_context(
Expand All @@ -54,7 +57,8 @@ pub async fn get_fallback_page(
client_compile_time_info.environment(),
ty,
);
let entries = get_client_runtime_entries(project_path, env, ty, next_config, execution_context);
let entries =
get_client_runtime_entries(project_path, env, ty, mode, next_config, execution_context);

let mut import_map = ImportMap::empty();
insert_next_shared_aliases(
Expand Down
1 change: 1 addition & 0 deletions packages/next-swc/crates/next-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ mod embed_js;
pub mod env;
mod fallback;
pub mod manifest;
pub mod mode;
mod next_build;
pub mod next_client;
mod next_client_chunks;
Expand Down
28 changes: 28 additions & 0 deletions packages/next-swc/crates/next-core/src/mode.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use turbo_tasks::TaskInput;

/// The mode in which Next.js is running.
#[derive(Debug, Copy, Clone, TaskInput)]
pub enum NextMode {
/// `next dev`
Development,
/// `next build`
Build,
}

impl NextMode {
/// Returns the NODE_ENV value for the current mode.
pub fn node_env(&self) -> &'static str {
match self {
NextMode::Development => "development",
NextMode::Build => "production",
}
}

/// Returns true if the development React runtime should be used.
pub fn is_react_development(&self) -> bool {
match self {
NextMode::Development => true,
NextMode::Build => false,
}
}
}

0 comments on commit 1c09a8d

Please sign in to comment.