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 hot_reload_msg.for_build_id == Some(dioxus_cli_config::build_id()) {
|
||||||
if let Some(table) = hot_reload_msg.jump_table {
|
if let Some(table) = hot_reload_msg.jump_table {
|
||||||
unsafe { dioxus_devtools::subsecond::apply_patch(table).unwrap() };
|
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::FullReloadStart => {}
|
||||||
DevserverMsg::FullReloadFailed => {}
|
DevserverMsg::FullReloadFailed => {}
|
||||||
|
|||||||
Reference in new issue
Block a user