Skip to content

Commit 2b33638

Browse files
committedMay 22, 2023
Improve render performance by only evaluating each render-fn once
1 parent 4b959df commit 2b33638

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed
 

‎src/nextjournal/clerk/render.cljs

+4-1
Original file line numberDiff line numberDiff line change
@@ -698,12 +698,15 @@
698698
(let [re-eval (fn [{:keys [form]}] (viewer/->viewer-fn form))]
699699
(w/postwalk (fn [x] (cond-> x (viewer/viewer-fn? x) re-eval)) doc)))
700700

701+
(defn replace-viewer-fns [doc]
702+
(w/postwalk-replace (:hash->viewer doc) (dissoc doc :hash->viewer)))
703+
701704
(defn ^:export set-state! [{:as state :keys [doc]}]
702705
(when (contains? state :doc)
703706
(when (exists? js/window)
704707
;; TODO: can we restore the scroll position when navigating back?
705708
(.scrollTo js/window #js {:top 0}))
706-
(reset! !doc doc))
709+
(reset! !doc (replace-viewer-fns doc)))
707710
;; (when (and error (contains? @!doc :status))
708711
;; (swap! !doc dissoc :status))
709712
(when (remount? doc)

‎src/nextjournal/clerk/view.clj

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
(ns nextjournal.clerk.view
2-
(:require [nextjournal.clerk.viewer :as v]
3-
[hiccup.page :as hiccup]
2+
(:require [clojure.java.io :as io]
3+
[clojure.set :as set]
44
[clojure.string :as str]
5-
[clojure.java.io :as io])
5+
[clojure.walk :as walk]
6+
[hiccup.page :as hiccup]
7+
[nextjournal.clerk.viewer :as v])
68
(:import (java.net URI)))
79

10+
(defn ^:private extract-hash->viewer [presentation]
11+
(into {}
12+
(map (juxt :hash identity))
13+
(keep :nextjournal/viewer (tree-seq (some-fn map? vector?) #(cond-> % (map? %) vals) presentation))))
14+
815
(defn doc->viewer
916
([doc] (doc->viewer {} doc))
1017
([opts {:as doc :keys [ns file]}]
1118
(binding [*ns* ns]
12-
(-> (merge doc opts) v/notebook v/present))))
19+
(let [presentation (-> (merge doc opts) v/notebook v/present)
20+
hash->viewer (extract-hash->viewer presentation)]
21+
(assoc (walk/postwalk-replace (set/map-invert hash->viewer) presentation)
22+
:hash->viewer hash->viewer)))))
1323

1424
#_(doc->viewer (nextjournal.clerk/eval-file "notebooks/hello.clj"))
1525
#_(nextjournal.clerk/show! "notebooks/test.clj")

0 commit comments

Comments
 (0)
Please sign in to comment.