Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor coord resolution for performance #35

Merged
merged 1 commit into from
Feb 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Respo: A virtual DOM library in ClojureScript
[![Respo](https://img.shields.io/clojars/v/respo/respo.svg)](https://clojars.org/respo/respo)

```clojure
[respo "0.13.5"]
[respo "0.13.6"]
```

* Home http://respo-mvc.org
Expand Down
1,769 changes: 837 additions & 932 deletions calcit.cirru

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion macros/respo/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
(assert (coll? params) "2nd argument should be a collection")
(assert (some? (last body)) "defcomp should return a component")
`(defn ~comp-name [~@params]
(respo.core/extract-effects-list
(merge respo.schema/component
{:name ~(keyword comp-name),
:tree (do ~@body)})))
:tree (do ~@body)}))))

(def support-elements '[a body br button canvas code div footer
h1 h2 head header html hr i img input li link video audio
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "respo",
"version": "0.13.5",
"version": "0.13.6",
"description": "Virtual DOM library",
"main": "index.js",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion release.edn
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{:version "0.13.5",
{:version "0.13.6",
:group-id "respo",
:artifact-id "respo",
:skip-tag true,
Expand Down
1 change: 1 addition & 0 deletions shadow-cljs.edn
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
:modules {
:main {:init-fn respo.main/main!}
}
:devtools {:loader-mode :script}
:release {:output-dir "dist/"}
}
:test {:target :node-script, :output-to "target/test.js", :main respo.test.main/main!}
Expand Down
2 changes: 1 addition & 1 deletion src/respo/app/comp/todolist.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@
(div
{:spell-check true, :style style-toolbar}
(div
{:style widget/button, :on-click (if (:locked? state) (fn [e d!] (d! :clear nil)))}
{:style widget/button, :on-click (if (:locked? state) nil (fn [e d!] (d! :clear)))}
(<> "Clear2"))
(=< 8 nil)
(div
Expand Down
2 changes: 1 addition & 1 deletion src/respo/controller/client.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
(defn activate-instance! [entire-dom mount-point deliver-event]
(let [listener-builder (fn [event-name] (build-listener event-name deliver-event))]
(set! (.-innerHTML mount-point) "")
(.appendChild mount-point (make-element entire-dom listener-builder))))
(.appendChild mount-point (make-element entire-dom listener-builder []))))

(defn patch-instance! [changes mount-point deliver-event]
(let [listener-builder (fn [event-name] (build-listener event-name deliver-event))]
Expand Down
51 changes: 29 additions & 22 deletions src/respo/core.cljs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@

(ns respo.core
(:require [respo.render.expand :refer [render-app]]
[respo.controller.resolve :refer [build-deliver-event]]
(:require [respo.controller.resolve :refer [build-deliver-event]]
[respo.render.diff :refer [find-element-diffs]]
[respo.render.effect :refer [collect-mounting]]
[respo.util.format :refer [purify-element mute-element]]
[respo.controller.client :refer [activate-instance! patch-instance!]]
[respo.util.list :refer [pick-attrs pick-event val-exists? detect-func-in-map?]]
[respo.util.detect :refer [component? element?]]
[respo.util.list
:refer
[pick-attrs pick-event val-exists? detect-func-in-map? filter-first]]
[respo.util.detect :refer [component? element? effect?]]
[respo.util.dom :refer [compare-to-dom!]]
[respo.schema :as schema]
[respo.util.comparator :refer [compare-xy]]
Expand Down Expand Up @@ -65,50 +66,56 @@

(def element-type (if (exists? js/Element) js/Element js/Error))

(defn render-element [markup] (render-app markup))
(defn extract-effects-list [m]
(let [tree (:tree m)]
(if (vector? tree)
(let [node-tree (filter-first
(fn [x] (and (map? x) (or (component? x) (element? x))))
tree)
effects-list (filter effect? tree)]
(merge m {:tree node-tree, :effects effects-list}))
m)))

(defn mount-app! [target markup dispatch!]
(defn mount-app! [target element dispatch!]
(assert (instance? element-type target) "1st argument should be an element")
(assert (component? markup) "2nd argument should be a component")
(let [element (render-element markup)
(assert (component? element) "2nd argument should be a component")
(let [element element
deliver-event (build-deliver-event *global-element dispatch!)
*changes (atom [])
collect! (fn [x]
(assert (= 3 (count x)) "change op should has length 3")
(assert (= 4 (count x)) "change op should has length 3")
(swap! *changes conj x))]
(comment println "mount app")
(activate-instance! (purify-element element) target deliver-event)
(collect-mounting collect! [] element true)
(activate-instance! element target deliver-event)
(collect-mounting collect! [] [] element true)
(patch-instance! @*changes target deliver-event)
(reset! *global-element element)))

(defn realize-ssr! [target markup dispatch!]
(defn realize-ssr! [target element dispatch!]
(assert (instance? element-type target) "1st argument should be an element")
(assert (component? markup) "2nd argument should be a component")
(let [element (render-element markup)
app-element (.-firstElementChild target)
(assert (component? element) "2nd argument should be a component")
(let [app-element (.-firstElementChild target)
*changes (atom [])
collect! (fn [x]
(assert (= 3 (count x)) "change op should has length 3")
(assert (= 4 (count x)) "change op should has length 3")
(swap! *changes conj x))
deliver-event (build-deliver-event *global-element dispatch!)]
(if (nil? app-element) (throw (js/Error. "Detected no element from SSR!")))
(compare-to-dom! (purify-element element) app-element)
(collect-mounting collect! [] element true)
(collect-mounting collect! [] [] element true)
(patch-instance! @*changes target deliver-event)
(reset! *global-element (mute-element element))))

(defn rerender-app! [target markup dispatch!]
(defn rerender-app! [target element dispatch!]
(tick-calling-loop!)
(let [element (render-element markup)
deliver-event (build-deliver-event *global-element dispatch!)
(let [deliver-event (build-deliver-event *global-element dispatch!)
*changes (atom [])
collect! (fn [x]
(assert (= 3 (count x)) "change op should has length 3")
(assert (= 4 (count x)) "change op should has length 3")
(swap! *changes conj x))]
(comment println @*global-element)
(comment println "Changes:" (pr-str (mapv (partial take 2) @*changes)))
(find-element-diffs collect! [] @*global-element element)
(find-element-diffs collect! [] [] @*global-element element)
(let [logger @*changes-logger]
(if (some? logger) (logger @*global-element element @*changes)))
(patch-instance! @*changes target deliver-event)
Expand Down
Loading