WIP: DOM-preserving hydration — SSR DOM stays, no visual flash
Adds hydration cursor to render pipeline: - boot.sx: *hydrating* flag, hydrate-start!/stop!, cursor stack helpers - adapter-dom.sx: render-dom-element uses existing SSR elements when *hydrating* is true. Text nodes reused. dom-append skipped. - hydrate-island: calls hydrate-start! before render-to-dom, no replaceChildren. SSR DOM stays in place. Status: screenshots identical (no visual flash), but event listeners not attaching — the cursor/set! interaction between CEK and VM needs debugging. The hydrate-start! set! on *hydrating* may not propagate to the bytecoded adapter-dom render path. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -55,6 +55,8 @@
|
|||||||
(dom-append-to-head el)))))
|
(dom-append-to-head el)))))
|
||||||
els))))
|
els))))
|
||||||
|
|
||||||
|
(define *hydrating* false)
|
||||||
|
|
||||||
(define
|
(define
|
||||||
sx-mount
|
sx-mount
|
||||||
:effects (mutation io)
|
:effects (mutation io)
|
||||||
@@ -329,9 +331,14 @@
|
|||||||
p
|
p
|
||||||
(if (dict-has? kwargs p) (dict-get kwargs p) nil)))
|
(if (dict-has? kwargs p) (dict-get kwargs p) nil)))
|
||||||
(component-params comp))
|
(component-params comp))
|
||||||
(let
|
(do
|
||||||
((body-dom (cek-try (fn () (with-island-scope (fn (disposable) (append! disposers disposable)) (fn () (render-to-dom (component-body comp) local nil)))) (fn (err) (log-warn (str "hydrate-island FAILED: " comp-name " — " err)) (let ((error-el (dom-create-element "div" nil))) (dom-set-attr error-el "class" "sx-island-error") (dom-set-attr error-el "style" "padding:8px;margin:4px 0;border:1px solid #ef4444;border-radius:4px;background:#fef2f2;color:#b91c1c;font-family:monospace;font-size:12px;white-space:pre-wrap") (dom-set-text-content error-el (str "Island error: " comp-name "\n" err)) error-el)))))
|
(hydrate-start! el)
|
||||||
(host-call el "replaceChildren" body-dom)
|
(log-info " hydrate-start done")
|
||||||
|
(with-island-scope
|
||||||
|
(fn (disposable) (append! disposers disposable))
|
||||||
|
(fn () (render-to-dom (component-body comp) local nil)))
|
||||||
|
(log-info " render-to-dom done")
|
||||||
|
(hydrate-stop!)
|
||||||
(dom-set-data el "sx-disposers" disposers)
|
(dom-set-data el "sx-disposers" disposers)
|
||||||
(set-timeout (fn () (process-elements el)) 0)
|
(set-timeout (fn () (process-elements el)) 0)
|
||||||
(log-info
|
(log-info
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
2585
web/adapter-dom.sx
2585
web/adapter-dom.sx
File diff suppressed because it is too large
Load Diff
13
web/boot.sx
13
web/boot.sx
@@ -55,6 +55,8 @@
|
|||||||
(dom-append-to-head el)))))
|
(dom-append-to-head el)))))
|
||||||
els))))
|
els))))
|
||||||
|
|
||||||
|
(define *hydrating* false)
|
||||||
|
|
||||||
(define
|
(define
|
||||||
sx-mount
|
sx-mount
|
||||||
:effects (mutation io)
|
:effects (mutation io)
|
||||||
@@ -329,9 +331,14 @@
|
|||||||
p
|
p
|
||||||
(if (dict-has? kwargs p) (dict-get kwargs p) nil)))
|
(if (dict-has? kwargs p) (dict-get kwargs p) nil)))
|
||||||
(component-params comp))
|
(component-params comp))
|
||||||
(let
|
(do
|
||||||
((body-dom (cek-try (fn () (with-island-scope (fn (disposable) (append! disposers disposable)) (fn () (render-to-dom (component-body comp) local nil)))) (fn (err) (log-warn (str "hydrate-island FAILED: " comp-name " — " err)) (let ((error-el (dom-create-element "div" nil))) (dom-set-attr error-el "class" "sx-island-error") (dom-set-attr error-el "style" "padding:8px;margin:4px 0;border:1px solid #ef4444;border-radius:4px;background:#fef2f2;color:#b91c1c;font-family:monospace;font-size:12px;white-space:pre-wrap") (dom-set-text-content error-el (str "Island error: " comp-name "\n" err)) error-el)))))
|
(hydrate-start! el)
|
||||||
(host-call el "replaceChildren" body-dom)
|
(log-info " hydrate-start done")
|
||||||
|
(with-island-scope
|
||||||
|
(fn (disposable) (append! disposers disposable))
|
||||||
|
(fn () (render-to-dom (component-body comp) local nil)))
|
||||||
|
(log-info " render-to-dom done")
|
||||||
|
(hydrate-stop!)
|
||||||
(dom-set-data el "sx-disposers" disposers)
|
(dom-set-data el "sx-disposers" disposers)
|
||||||
(set-timeout (fn () (process-elements el)) 0)
|
(set-timeout (fn () (process-elements el)) 0)
|
||||||
(log-info
|
(log-info
|
||||||
|
|||||||
Reference in New Issue
Block a user