Rebuild router on every hot reload message (#4537)
This commit is contained in:
1 parent
80731da25a
commit
627386c5fd
1 file changed
+50
-51
@@ -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 => {}
|
||||
|
||||
Reference in new issue
Block a user