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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
72
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
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
710
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
180
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.4k
Lessons from Spec-Driven Development
simas
PRO
0
210
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
110
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
190
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.4k
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
150
Oxcを導入して開発体験が向上した話
yug1224
4
320
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.2k
さぁV100、メモリをお食べ・・・
nilpe
0
140
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
RailsConf 2023
tenderlove
30
1.5k
Typedesign – Prime Four
hannesfritz
42
3.1k
The Invisible Side of Design
smashingmag
302
52k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
170
Embracing the Ebb and Flow
colly
88
5.1k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Tell your own story through comics
letsgokoyo
1
960
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Become a Pro
speakerdeck
PRO
31
6k
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 どんどん使ってね!☆