Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Build React system with ClojureScript (Squint)

Build React system with ClojureScript (Squint)

Avatar for kbaba1001

kbaba1001

June 15, 2025

More Decks by kbaba1001

Other Decks in Programming

Transcript

  1. Clojureとは • JVM上で動くLISP • CommonLisp や Scheme などに比べてカッ コの種類が多い ◦

    () だけでなく {} や [] も使う • Immutable • 関数型プログラミング • 並列処理も得意 (core.async 等) • 動的型付け言語 • clojure.spec による動的なvalidation
  2. JVMで動くLISP? • Clojure (Java) • ClojureScript (JavaScript) • ClojureCLR (C#)

    • Babashka (GraalVM) • Jank (LLVM + JITコンパイラ) • ClojureDart (Dart) • ClojureL (Erlang) • など 様々な環境で動く LISP
  3. ClojureScript • ビルドすると JavaScript になる Clojure ◦ いわゆる Alt JS

    • React (JSX) が使える • 逆に言えば Vue や Svelte 等は厳しい •
  4. そもそもClojureのビルドシステム • Maven / Gradle … Javaの仕組みに乗っかる • Leiningen /

    Boot … Clojure 独自のビルドシステム • Clojure CLI / deps.edn … Clojure 公式のビルドシステム パッケージの管理、タスクの実行、ビルドの手順の定義など
  5. 初期のClojureScript • Clojure のビルドシステムで ClojureScript をビルドする • clojars に cljsjs

    という名前空間がある • cljsjs に JS のライブラリを登録する
  6. Cljsjs • Cljsjs は、当初 Clojure を使っている人からすると手軽で良かった • 当たり前だけど npm 文化が成熟してくると、

    cljsjs は不便になっていった • Hot reload ができず、 Clojure の REPL でリロードする必要があった
  7. Shadow-cljs 時代 • Figwheel の次に流行ったビルドシステム • npm からインストールできるようになった! ◦ Java

    もインストールしておく必要がある • npm ライブラリも使えるし、 Clojars のライブラリも使える • Hot Reload なども対応済み • webpack, vite みたいなノリで使える
  8. Squint • ClojureScript のビルドの新星 • 既存の ClojureScript との互換性を捨てて、JSとの親和性を高めたClojureScript 方言 •

    既存の ClojureScript に対してビルド後のファイルサイズが小さい • Clojure の Maps や Vectors などが JS の普通の objects や Arrays に変換され る • JSX, HTML サポート • Async/Await が使える • vite などと組み合わせて今までよりも気楽にCLJSが使える
  9. ClojureScript に対する不満 • Maps や Vectors は JS の Objects

    や Arrays ではないので、時々変換が必要 • Async/Await をサポートしておらず Promise 周りでたまに困る ◦ core.async を使うとほぼ同じことができるが、 これは Promise を返すわけではないので JS と CLJS を組み合わせたいときにうまく動かせない事がある • ClojureScript は Clojure との親和性が高いが、JSとの親和性を高めたほうが便利 では?という背景で出てきたのが Squint TypeScript と同程度の気楽さで ClojureScript を書きたい!
  10. Squint のサンプルコード • フロントエンド ◦ Vite + Squint + React

    ◦ https://github.com/neumann-tokyo/vite-squint-react-template • バックエンド ◦ Vite + Squint + Hono ◦ https://github.com/neumann-tokyo/vite-squint-hono-template
  11. Malli • Clojure(Script) における動的な型チェック ◦ clojure spec より使いやすい • この手法はあまり他言語にはないやり方

    • スキーマを定義して関数の入出力値をチェックしたり、Formの Validationなども出 来る • スキーマをもとに Formatter と連携することも出来る
  12. Malli の代替を JS で探す • 懐かしの prop-types • さすがにあまりメンテナンスされてなさそう •

    型チェック系のライブラリは全てTypeScriptになってしまった 発想を変えよう!
  13. Validationライブラリを Malliのように使う • Zod や Valibot のような Validation のためのライブラリを、関数の入力値の動的 な型チェックに使う

    • Clojure では pre/post による関数の事前条件/事後条件の設定が出来る ◦ 契約による設計 (『オブジェクト指向入門』バートランド・メイヤー著、参照 ) • NODE_ENV=development のときだけ関数の入力値の動的な型チェックを行う
  14. preで入力値をチェック (ns libs.age (:require ["valibot" :as v])) (def age-schema (.pipe

    v (.number v) (.minValue v 0) (.maxValue v 200))) (defn check-age [age] (if (-> import .-meta .-env .-DEV) (let [result (.safeParse v age-schema age)] (.-success result)) true)) (defn display-age [age] {:pre [(check-age age)]} (str age "歳")) valibot の schema を定義 import.meta.env.DEV が true のときだ け Validation を実行する。 false のときは true を返しておく。 :pre で check-age を実行する
  15. まとめ • Clojure、ClojureScript のビルド環境の歴史 • ClojureScript を安定して使いたいなら Shadow-cljs • ClojureScript

    の新星 Squint について紹介 • Squint のサンプルコード • Squint で Malli っぽいことをやる方法 Squint どんどん使ってね!☆