Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Build React system with ClojureScript (Squint)
Search
kbaba1001
June 15, 2025
Programming
190
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Build React system with ClojureScript (Squint)
kbaba1001
June 15, 2025
More Decks by kbaba1001
See All by kbaba1001
How to build a video conferencing system that no one has ever told you about
kbaba1001
0
73
talk-with-local-llm-with-web-streams-api
kbaba1001
0
520
Lume: Static Site Generator
kbaba1001
0
710
React_2023
kbaba1001
0
200
Word Penne
kbaba1001
0
240
I live by using a minor language
kbaba1001
1
210
fast optical line
kbaba1001
0
420
ArtPosePro and Procreate
kbaba1001
1
250
How did Clojure change my life
kbaba1001
3
2k
Other Decks in Programming
See All in Programming
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
300
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
120
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
570
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
170
Performance Engineering for Everyone
elenatanasoiu
0
210
AI 輔助遺留系統現代化的經驗分享
jame2408
1
980
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
160
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
390
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
How to build a perfect <img>
jonoalderson
1
5.7k
How to Ace a Technical Interview
jacobian
281
24k
Between Models and Reality
mayunak
4
350
For a Future-Friendly Web
brad_frost
183
10k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Exploring anti-patterns in Rails
aemeredith
3
430
Facilitating Awesome Meetings
lara
57
7k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Abbi's Birthday
coloredviolet
3
8.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
ClojureScript (Squint) で React フロントエンド開発 2025 年版 2025年6月15日 馬場 一樹
自己紹介
馬場 一樹(kbaba1001) • フルスタックエンジニア約10年 • Clojureを仕事でも使っています • Clojure歴 6 年くらい
今日の話
Squint:次世代ClojureScript • そもそもClojure(Script) とは • ClojureScript のビルドの歴史 • Squint とは
• Squint 活用
Clojure(Script) とは
Clojureとは • JVM上で動くLISP • CommonLisp や Scheme などに比べてカッ コの種類が多い ◦
() だけでなく {} や [] も使う • Immutable • 関数型プログラミング • 並列処理も得意 (core.async 等) • 動的型付け言語 • clojure.spec による動的なvalidation
JVMで動くLISP? • Clojure (Java) • ClojureScript (JavaScript) • ClojureCLR (C#)
• Babashka (GraalVM) • Jank (LLVM + JITコンパイラ) • ClojureDart (Dart) • ClojureL (Erlang) • など 様々な環境で動く LISP
よく使われている Clojure • Clojure (Java) • ClojureScript (JavaScript) これらと ClojureCLR
(C#) は開発元が同じ
ClojureScript • ビルドすると JavaScript になる Clojure ◦ いわゆる Alt JS
• React (JSX) が使える • 逆に言えば Vue や Svelte 等は厳しい •
ClojureScript のビルドの歴史
ClojureScript のビルド • ClojureScript が npm で使えるようになったのは最近の話 • それまでどうしていたの?
そもそもClojureのビルドシステム • Maven / Gradle … Javaの仕組みに乗っかる • Leiningen /
Boot … Clojure 独自のビルドシステム • Clojure CLI / deps.edn … Clojure 公式のビルドシステム パッケージの管理、タスクの実行、ビルドの手順の定義など
Clojars Clojure のライブラリを頒布して いるサイト
初期のClojureScript • Clojure のビルドシステムで ClojureScript をビルドする • clojars に cljsjs
という名前空間がある • cljsjs に JS のライブラリを登録する
Cljsjs • Cljsjs は、当初 Clojure を使っている人からすると手軽で良かった • 当たり前だけど npm 文化が成熟してくると、
cljsjs は不便になっていった • Hot reload ができず、 Clojure の REPL でリロードする必要があった
Figwheel の時代 • Hot Reload 問題を解決したビルドシステム • Cljsjs を使う •
頑張れば npm パッケージも使える?
Shadow-cljs 時代 • Figwheel の次に流行ったビルドシステム • npm からインストールできるようになった! ◦ Java
もインストールしておく必要がある • npm ライブラリも使えるし、 Clojars のライブラリも使える • Hot Reload なども対応済み • webpack, vite みたいなノリで使える
Shadow-cljs のデメリット • 最初の起動がちょっと遅い ◦ というかJSのライブラリが速すぎる。。。 • CSSのビルドができない • 独自文化な感じが否めず、UserGuide
をしっかり読む必要がある Shadow-cljs は現状の ClojureScript ビルドの最善手!
Squint とは
Squint • ClojureScript のビルドの新星 • 既存の ClojureScript との互換性を捨てて、JSとの親和性を高めたClojureScript 方言 •
既存の ClojureScript に対してビルド後のファイルサイズが小さい • Clojure の Maps や Vectors などが JS の普通の objects や Arrays に変換され る • JSX, HTML サポート • Async/Await が使える • vite などと組み合わせて今までよりも気楽にCLJSが使える
ClojureScript に対する不満 • Maps や Vectors は JS の Objects
や Arrays ではないので、時々変換が必要 • Async/Await をサポートしておらず Promise 周りでたまに困る ◦ core.async を使うとほぼ同じことができるが、 これは Promise を返すわけではないので JS と CLJS を組み合わせたいときにうまく動かせない事がある • ClojureScript は Clojure との親和性が高いが、JSとの親和性を高めたほうが便利 では?という背景で出てきたのが Squint TypeScript と同程度の気楽さで ClojureScript を書きたい!
Squint • まだ仕様が固まりきっておらず本番環境での使用は注意が必要 • 細かい不具合はまだ多い • 作者の borkdude さんは化け物レベルの開発力を持っているので、 不具合はすぐ
に報告しよう!
Squint 活用
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
Squint のデメリットとその対策
Squintのデメリット • 既存のClojureScriptの資産を使えない どうしても使いたい ClojureScriptの資産とは何か? 私としては Malli
Malli • Clojure(Script) における動的な型チェック ◦ clojure spec より使いやすい • この手法はあまり他言語にはないやり方
• スキーマを定義して関数の入出力値をチェックしたり、Formの Validationなども出 来る • スキーマをもとに Formatter と連携することも出来る
Malli のサンプル
Malli の代替を JS で探す • 懐かしの prop-types • さすがにあまりメンテナンスされてなさそう •
型チェック系のライブラリは全てTypeScriptになってしまった 発想を変えよう!
Validationライブラリを Malliのように使う • Zod や Valibot のような Validation のためのライブラリを、関数の入力値の動的 な型チェックに使う
• Clojure では pre/post による関数の事前条件/事後条件の設定が出来る ◦ 契約による設計 (『オブジェクト指向入門』バートランド・メイヤー著、参照 ) • NODE_ENV=development のときだけ関数の入力値の動的な型チェックを行う
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 を実行する
Development環境で型チェックに失敗した時 (display-age 500)
Development環境で型チェックに成功した時 または、Development以外の環境 (display-age 35)
まとめ
まとめ • Clojure、ClojureScript のビルド環境の歴史 • ClojureScript を安定して使いたいなら Shadow-cljs • ClojureScript
の新星 Squint について紹介 • Squint のサンプルコード • Squint で Malli っぽいことをやる方法 Squint どんどん使ってね!☆