Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Build React system with ClojureScript (Squint)
Search
kbaba1001
June 15, 2025
Programming
210
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
84
talk-with-local-llm-with-web-streams-api
kbaba1001
0
570
Lume: Static Site Generator
kbaba1001
0
750
React_2023
kbaba1001
0
220
Word Penne
kbaba1001
0
260
I live by using a minor language
kbaba1001
1
230
fast optical line
kbaba1001
0
430
ArtPosePro and Procreate
kbaba1001
1
270
How did Clojure change my life
kbaba1001
3
2k
Other Decks in Programming
See All in Programming
phperだってパンチカードでコーディングしたい
o0h
PRO
0
230
Kubernetes祭り #2 OP/ED
bells17
0
100
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
830
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
120
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.8k
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
160
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
450
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
270
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
720
Are APIs Still Relevant in the AI Era?
soyuka
0
430
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
530
Designing Experiences People Love
moore
143
24k
Scaling GitHub
holman
464
140k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
540
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
Into the Great Unknown - MozCon
thekraken
41
2.8k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
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 どんどん使ってね!☆