Rebuild router on every hot reload message (#4537)

This commit is contained in:
Sebastijan Kelnerič authored and GitHub committed 2025-09-03 15:03:48 -07:00
1 parent 80731da25a
commit 627386c5fd
1 file changed
+50 -51
+50 -51
View File
@@ -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 => {}