カケハシのスタッフとしてTSKaigi Kansaiに参加して楽しんできた。
スポンサーのランチLTでカケハシのメンバーも喋るからブースを抜け出して見に行ってたら、newmoの大貫さんのLTで「DuckDB Wasmを使ってクライアントだけで処理したよ!」って発表があって、面白いなーと思ったのだった。
ので、遊んだ
DuckDBは初めて知ったし、Wasmには興味があるので、遊んでみた。GitHub Pagesにアップロードしておいた。11/18の日本各地の最高気温が分かるよ!
https://bufferings.github.io/vite-react-duckdb-wasm/
やってるのは
- DuckDB Wasmをクライアントで取得して
- e-Govデータポータルの11/18の最高気温のCSVをDuckDBに入れて
- そのDBの内容をテーブルに表示
- テキストボックスの内容が変更されたら、SQLを実行してその値で結果をフィルタリングして表示
最高気温のデータは、こちらからダウンロードしておいた。
CSVで何か適当なデータがほしいなと思ってe-Govからこれを見つけてきたのだ。Shift_JISだったのでUTF-8に変換して、静的コンテンツとしてダウンロードして使っている。
面白かった。クライアントで処理するから速いよね。ふむふむ。
ソースコード
https://github.com/bufferings/vite-react-duckdb-wasm/
どんなふうに動くのかなーって適当に試しただけなので、本番運用で使えるレベルのものでは全くない。
使ってみたもの
DuckDB Wasmだけ使えたら満足なつもりで始めたのに、せっかく遊ぶんなら!ってちょこちょこ手をだして楽しんでた。
- Vite (+ React + TS) https://ja.vite.dev/
- 素のHTMLでも楽しめそうだったけど、せっかくならReactとTSを使っておこうと思ってViteで作った
- Biome https://biomejs.dev/
- TSKaigi KansaiでもBiomeの話をよく耳にしたなぁ。と思って、Viteの用意してくれたESLintを全部消して、BiomeでLintとFormatをするようにしてみた
- WebStormにもプラグインがあってOn Saveで動いてくれるので便利
- ESLintやPrettierと違う部分もあるけど、慣れだけの問題かなって思った
- duckdb-wasm-kit - npm
- DuckDB WasmをReactで簡単に使えるようにしてくれてるやつないかなぁ?って思って、この duckdb-wasm-kit と、@duckdb/react-duckdb - npm を比べてみて、なんとなく duckdb-wasm-kit の方が便利な感じがしたのでこっちでやってみた。
- React Hooksがあるので、それでDuckDBが取得できる。便利!
- React Spinners
- DuckDBのダウンロードに少し時間がかかるからSpinnerでも表示しようかなと思って、これを見つけたので適当に選んで置いといた
- もう少しSpinnerを眺めていられると思ってたら、想像してたよりずっとあっさりDuckDB Wasmのダウンロードが終わってしまう
- useAsync
- duckdb-wasm-kit のコードを眺めてたら、非同期処理の部分で useAsync というフックを使っていて「あー確かにこういうの便利だなー」って思って https://github.com/streamich/react-use/blob/master/docs/useAsync.md を使うことにした。
- duckdb-wasm-kit では react-async-hook - npm を使っているのだけど、なんとなく react-use を使うことにした
- useDebounce
- テキストボックスの入力は、入力が止まってからクエリを投げたいなと思って、https://github.com/streamich/react-use/blob/master/docs/useDebounce.md を使うことにした。これも react-use のもの
- Material UI: React components that implement Material Design
- テキストボックスとテーブルにはMUIを使った
- データ量が多くても大丈夫なように、テーブルはVirtualizedTableにしておくかーと思って https://mui.com/material-ui/react-table/#virtualized-table を使った。ので https://virtuoso.dev/ も合わせて入れておいた
- Apache Arrow https://arrow.apache.org/
- DuckDBも知らなかったけど、これも全然知らなかったやつ。DuckDB Wasmの結果はこのArrowのTable形式で返ってくる。
こんなところかな。いろんなライブラリに触れられて楽しかった!