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
Tweet

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 どんどん使ってね!☆