🐛 Fix crashing happening on hot reloads (#12005)

This commit is contained in:
Alonso Torres 2026-10-01 09:21:05 +02:00 committed by GitHub
parent d67a00c1d5
commit d851f82678
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 5 deletions

View File

@ -54,8 +54,12 @@
(let [el (dom/get-element "app")]
(mf/create-root el)))
;; Root component of the last render; a hot reload of `app.main.ui` replaces it
(defonce ^:private rendered-app (atom nil))
(defn init-ui
[]
(reset! rendered-app ui/app)
(mf/render! app-root (mf/element ui/app)))
(defn- initialize-rasterizer
@ -146,7 +150,10 @@
(init-ui)))
(defn ^:dev/after-load after-load
"Rerender the UI after a hot reload. When the reload replaced the root
component, unmount the whole tree first so its cleanups run before
the new tree mounts."
[]
(reinit))
(reinit (not (identical? @rendered-app ui/app))))
(set! (.-stackTraceLimit js/Error) 50)

View File

@ -2492,6 +2492,13 @@
:cause cause)
nil)))))
;; Stable listener identities, so `removeEventListener` matches across hot reloads
(defonce ^:private webgl-context-lost-listener
(fn [event] (on-webgl-context-lost event)))
(defonce ^:private webgl-context-restored-listener
(fn [event] (on-webgl-context-restored event)))
(defn init-canvas-context
[canvas]
(if-not (wasm/module-ready?)
@ -2536,8 +2543,8 @@
;; Add event listeners for WebGL context lost
(set! wasm/canvas canvas)
(when can-listen?
(.addEventListener canvas "webglcontextlost" on-webgl-context-lost)
(.addEventListener canvas "webglcontextrestored" on-webgl-context-restored))
(.addEventListener canvas "webglcontextlost" webgl-context-lost-listener)
(.addEventListener canvas "webglcontextrestored" webgl-context-restored-listener))
(start-canvas-snapshot-listener!)
(reset! wasm/context-lost? false)
(set! wasm/context-initialized? true)
@ -2571,8 +2578,8 @@
;; Remove listener before losing/deleting context.
(when wasm/canvas
(.removeEventListener wasm/canvas "webglcontextlost" on-webgl-context-lost)
(.removeEventListener wasm/canvas "webglcontextrestored" on-webgl-context-restored))
(.removeEventListener wasm/canvas "webglcontextlost" webgl-context-lost-listener)
(.removeEventListener wasm/canvas "webglcontextrestored" webgl-context-restored-listener))
(stop-canvas-snapshot-listener!)
(when (wasm/module-ready?)