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
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
340
最近”作らせてる” ローカルAIアプリの話
akit37
0
420
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
160
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.6k
contenteditable と日本語入力に向き合う
colorful12
0
180
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
AIに “答え“を書かせるのを やめてみた
___akari11
0
110
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
360
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
140
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
190
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Featured
See All Featured
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
780
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to Ace a Technical Interview
jacobian
280
24k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
A Tale of Four Properties
chriscoyier
163
24k
Ethics towards AI in product and experience design
skipperchong
2
420
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
We Are The Robots
honzajavorek
0
390
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
The Curious Case for Waylosing
cassininazir
1
560
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
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 どんどん使ってね!☆