diff --git a/packages/cli/src/serve/mod.rs b/packages/cli/src/serve/mod.rs index f6820f3e3..503ee1821 100644 --- a/packages/cli/src/serve/mod.rs +++ b/packages/cli/src/serve/mod.rs @@ -1,6 +1,6 @@ use crate::{ styles::{GLOW_STYLE, LINK_STYLE}, - AppBuilder, BuildId, BuildMode, BuilderUpdate, Result, ServeArgs, TraceController, + AppBuilder, BuildId, BuildMode, BuilderUpdate, Platform, Result, ServeArgs, TraceController, }; mod ansi_buffer; @@ -140,7 +140,13 @@ pub(crate) async fn serve_all(args: ServeArgs, tracer: &mut TraceController) -> let elapsed = bundle.time_end.duration_since(bundle.time_start).unwrap(); match builder.hotpatch(&bundle, id, cache).await { - Ok(jumptable) => devserver.send_patch(jumptable, elapsed, id).await, + Ok(jumptable) => { + let pid = match id { + BuildId::CLIENT => builder.client.pid, + _ => builder.server.as_ref().and_then(|s| s.pid), + }; + devserver.send_patch(jumptable, elapsed, id, pid).await + } Err(err) => { tracing::error!("Failed to hot-patch app: {err}"); @@ -189,11 +195,21 @@ pub(crate) async fn serve_all(args: ServeArgs, tracer: &mut TraceController) -> screen.push_log(log); } - ServeUpdate::OpenApp => { - if let Err(err) = builder.open_all(&devserver, true).await { - tracing::error!("Failed to open app: {err}") + ServeUpdate::OpenApp => match builder.use_hotpatch_engine { + true if !matches!(builder.client.build.platform, Platform::Web) => { + tracing::warn!( + "Opening a native app with hotpatching enabled requires a full rebuild..." + ); + builder.full_rebuild().await; + devserver.send_reload_start().await; + devserver.start_build().await; } - } + _ => { + if let Err(err) = builder.open_all(&devserver, true).await { + tracing::error!("Failed to open app: {err}") + } + } + }, ServeUpdate::Redraw => { // simply returning will cause a redraw diff --git a/packages/cli/src/serve/runner.rs b/packages/cli/src/serve/runner.rs index 02883ecf6..7b22b8bb8 100644 --- a/packages/cli/src/serve/runner.rs +++ b/packages/cli/src/serve/runner.rs @@ -433,6 +433,7 @@ impl AppServer { ms_elapsed: 0, jump_table: Default::default(), for_build_id: None, + for_pid: None, }; self.add_hot_reload_message(&msg); diff --git a/packages/cli/src/serve/server.rs b/packages/cli/src/serve/server.rs index 63482916a..ad29cb4fc 100644 --- a/packages/cli/src/serve/server.rs +++ b/packages/cli/src/serve/server.rs @@ -304,12 +304,14 @@ impl WebServer { jump_table: JumpTable, time_taken: Duration, build: BuildId, + for_pid: Option, ) { let msg = DevserverMsg::HotReload(HotReloadMsg { jump_table: Some(jump_table), ms_elapsed: time_taken.as_millis() as u64, templates: vec![], assets: vec![], + for_pid, for_build_id: Some(build.0 as _), }); self.send_devserver_message_to_all(msg).await; diff --git a/packages/devtools-types/src/lib.rs b/packages/devtools-types/src/lib.rs index bc50f6d46..8a454c088 100644 --- a/packages/devtools-types/src/lib.rs +++ b/packages/devtools-types/src/lib.rs @@ -46,6 +46,7 @@ pub struct HotReloadMsg { pub ms_elapsed: u64, pub jump_table: Option, pub for_build_id: Option, + pub for_pid: Option, } impl HotReloadMsg { diff --git a/packages/devtools/src/lib.rs b/packages/devtools/src/lib.rs index 2545253be..daf26bdf2 100644 --- a/packages/devtools/src/lib.rs +++ b/packages/devtools/src/lib.rs @@ -36,9 +36,17 @@ pub fn try_apply_changes(dom: &VirtualDom, msg: &HotReloadMsg) -> Result<(), Pat // 2. Attempt to hotpatch if let Some(jump_table) = msg.jump_table.as_ref().cloned() { if msg.for_build_id == Some(dioxus_cli_config::build_id()) { - unsafe { subsecond::apply_patch(jump_table) }?; - dioxus_core::prelude::force_all_dirty(); - ctx.clear::>>(); + let our_pid = if cfg!(target_family = "wasm") { + None + } else { + Some(std::process::id()) + }; + + if msg.for_pid == our_pid { + unsafe { subsecond::apply_patch(jump_table) }?; + dioxus_core::prelude::force_all_dirty(); + ctx.clear::>>(); + } } } @@ -69,7 +77,9 @@ pub fn connect_subsecond() { connect(|msg| { if let DevserverMsg::HotReload(hot_reload_msg) = msg { if let Some(jumptable) = hot_reload_msg.jump_table { - unsafe { subsecond::apply_patch(jumptable).unwrap() }; + if hot_reload_msg.for_pid == Some(std::process::id()) { + unsafe { subsecond::apply_patch(jumptable).unwrap() }; + } } } });