From 627386c5fd02cbfca17d3924b5b7c1d61b8d8d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastijan=20Kelneri=C4=8D?= Date: Thu, 4 Sep 2025 00:03:48 +0200 Subject: [PATCH] Rebuild router on every hot reload message (#4537) --- packages/server/src/launch.rs | 101 +++++++++++++++++----------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/packages/server/src/launch.rs b/packages/server/src/launch.rs index 72f3f5a2a..aa89d2621 100644 --- a/packages/server/src/launch.rs +++ b/packages/server/src/launch.rs @@ -148,59 +148,58 @@ async fn serve_server( if hot_reload_msg.for_build_id == Some(dioxus_cli_config::build_id()) { if let Some(table) = hot_reload_msg.jump_table { unsafe { dioxus_devtools::subsecond::apply_patch(table).unwrap() }; - - let mut new_router = axum::Router::new().serve_static_assets(); - let new_cfg = ServeConfig::new().unwrap(); - - let server_fn_iter = collect_raw_server_fns(); - - // de-duplicate iteratively by preferring the most recent (first, since it's linked) - let mut server_fn_map: HashMap<_, _> = HashMap::new(); - for f in server_fn_iter.into_iter().rev() { - server_fn_map.insert(f.path(), f); - } - - for (_, fn_) in server_fn_map { - tracing::trace!( - "Registering server function: {:?} {:?}", - fn_.path(), - fn_.method() - ); - new_router = crate::register_server_fn_on_router( - fn_, - new_router, - new_cfg.context_providers.clone(), - ); - } - - let hot_root = subsecond::HotFn::current(original_root); - let new_root_addr = hot_root.ptr_address().0 as usize as *const (); - let new_root = unsafe { - std::mem::transmute::<*const (), fn() -> Element>(new_root_addr) - }; - - crate::document::reset_renderer(); - - let state = RenderHandleState::new(new_cfg.clone(), new_root) - .with_ssr_state(SSRState::new(&new_cfg)); - - let fallback_handler = - axum::routing::get(render_handler).with_state(state); - - make_service = apply_base_path( - new_router.fallback(fallback_handler), - new_root, - new_cfg.clone(), - base_path().map(|s| s.to_string()), - ) - .into_make_service(); - - shutdown_tx.send_modify(|i| { - *i += 1; - hr_idx += 1; - }); } } + + let mut new_router = axum::Router::new().serve_static_assets(); + let new_cfg = ServeConfig::new().unwrap(); + + let server_fn_iter = collect_raw_server_fns(); + + // de-duplicate iteratively by preferring the most recent (first, since it's linked) + let mut server_fn_map: HashMap<_, _> = HashMap::new(); + for f in server_fn_iter.into_iter().rev() { + server_fn_map.insert(f.path(), f); + } + + for (_, fn_) in server_fn_map { + tracing::trace!( + "Registering server function: {:?} {:?}", + fn_.path(), + fn_.method() + ); + new_router = crate::register_server_fn_on_router( + fn_, + new_router, + new_cfg.context_providers.clone(), + ); + } + + let hot_root = subsecond::HotFn::current(original_root); + let new_root_addr = hot_root.ptr_address().0 as usize as *const (); + let new_root = unsafe { + std::mem::transmute::<*const (), fn() -> Element>(new_root_addr) + }; + + crate::document::reset_renderer(); + + let state = RenderHandleState::new(new_cfg.clone(), new_root) + .with_ssr_state(SSRState::new(&new_cfg)); + + let fallback_handler = axum::routing::get(render_handler).with_state(state); + + make_service = apply_base_path( + new_router.fallback(fallback_handler), + new_root, + new_cfg.clone(), + base_path().map(|s| s.to_string()), + ) + .into_make_service(); + + shutdown_tx.send_modify(|i| { + *i += 1; + hr_idx += 1; + }); } DevserverMsg::FullReloadStart => {} DevserverMsg::FullReloadFailed => {}