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
200
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
79
talk-with-local-llm-with-web-streams-api
kbaba1001
0
540
Lume: Static Site Generator
kbaba1001
0
720
React_2023
kbaba1001
0
210
Word Penne
kbaba1001
0
250
I live by using a minor language
kbaba1001
1
220
fast optical line
kbaba1001
0
420
ArtPosePro and Procreate
kbaba1001
1
260
How did Clojure change my life
kbaba1001
3
2k
Other Decks in Programming
See All in Programming
継続モナドとリアクティブプログラミング
yukikurage
3
700
Cloudflare is Agents
chimame
0
150
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
霧の中の代数的エフェクト
funnyycat
1
490
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
460
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
React本体のコードリーディング
high_g_engineer
1
140
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
450
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.4k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
480
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
400
Featured
See All Featured
How to make the Groovebox
asonas
2
2.3k
Visualization
eitanlees
152
17k
Being A Developer After 40
akosma
91
590k
Designing for Performance
lara
611
70k
Bash Introduction
62gerente
615
220k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
570
Building the Perfect Custom Keyboard
takai
2
830
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The SEO identity crisis: Don't let AI make you average
varn
0
530
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
630
Deep Space Network (abreviated)
tonyrice
0
250
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 どんどん使ってね!☆