Thursday, December 30, 2021

使用 Luminus 的心得

最近做新專案,需要做一個 POC (proof of concept) 讓使用者可以 read/write database ,於是,我快速地用 Luminus 弄了一個 POC 出來,弄出來之後,就立刻 demo 了。這邊整理一下成果與心得。

常用的 Luminus command 
* 生成專案
 lein new luminus [project-name] +postgres +reagent +shadow-cljs +swagger
* migrate
   lein run migrate


成果部分
 (1) 完成了一個不需要登入,但是可以簡易查資料、寫入資料的 POC。只論功能的話嘛,比 todoMVC 還更少吧?
   (2) 開發時間 16 hours 。
   (3) 50% 時間用於

         - 查 document 研究這個東西怎麼用

         - 撞到一些 bug 然後在 debug 。

         30% 時間用於

     - 理解用戶的問題

         - 判斷與取捨、try and error

    20% 時間才是真正開發的時間

technical stack 的選擇與速度頗有關:

  (a) database 用 postgres 。因為我有與新手合作, Datomic 要整個重教,太麻煩了。

  (b) frontend 選用 reagent 。之前用 re-frame 的經驗,讓我覺得,還是只用 reagent 會快得多。此外,我還用了 lambdaisland fetch 。

ClojureScript 的 REPL-driven development issue
Luminus 如果有搭配使用 ClojureScript 的話,它會啟動兩個 nREPL 。一個是給 Clojure 的,一個是給 ClojureScript 用的。要啟動 ClojureScript 的 repl-driven development 時,要注意要選正確的 nREPL port 

Friday, December 10, 2021

開發 ClojureScript 時,檢查 Promise 裡的值

通常,在開發 ClojureScript 時,如果需要檢查 Promise 裡的值,我會寫成如下的程式碼:
;; Using lambdaisland fetch, kitchen-async (p/let [resp (fetch/get "temp-url")] (def resp resp)) ;; Then, I evaluate resp to know the value.

使用 def 來取得 promise 值。

為什麼會這樣子寫呢?因為 prn 會把值輸出到 browser 的 console log 去,而 browser 的 console log 已經有太多東西了。

其實還有另一個方案,使用 tap>。於是,程式寫成這樣子:
(p/let [resp (fetch/get "temp-url")] (tap> {:response resp}))

使用 tap> 的好處是,我只要把 browser 指向 port 9630 ,就可以很容易地看到 tap> 輸出的值了。