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
Post Zod - Valibotの紹介
Search
kazizi
October 27, 2023
Programming
0
1.5k
Post Zod - Valibotの紹介
【GENDA x ゼスト x バイセル】フロントエンド勉強会
https://buysell-technologies.connpass.com/event/274923/
kazizi
October 27, 2023
Tweet
Share
More Decks by kazizi
See All by kazizi
「実体」で築く共通認識: 開発現場のコミュニケーション最適化 / Let's Get on the Same Page with Concrete Artifacts: Optimization of Communication in dev teams
kazizi55
0
240
Other Decks in Programming
See All in Programming
Server Side Kotlin Meetup vol.16: 内部動作を理解して ハイパフォーマンスなサーバサイド Kotlin アプリケーションを書こう
ternbusty
3
220
Things You Thought You Didn’t Need To Care About That Have a Big Impact On Your Job
hollycummins
0
230
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
410
Claude Agent SDK を使ってみよう
hyshu
0
1.2k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
480
技術的負債の正体を知って向き合う
irof
0
190
株式会社 Sun terras カンパニーデック
sunterras
0
360
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
260
Cursorハンズオン実践!
eltociear
2
1.1k
『毎日の移動』を支えるGoバックエンド内製開発
yutautsugi
2
250
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
6
3.1k
理論と実務のギャップを超える
eycjur
0
140
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Making Projects Easy
brettharned
120
6.4k
The Cult of Friendly URLs
andyhume
79
6.6k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
How to Think Like a Performance Engineer
csswizardry
27
2.1k
Building an army of robots
kneath
306
46k
Why Our Code Smells
bkeepers
PRO
340
57k
Bash Introduction
62gerente
615
210k
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Transcript
Post Zod - Valibotの紹介 BuySell Dev Study #4【GENDA x ゼスト
x バイセル】フロントエンド勉強会 2023.10.25
飯島和弥 (@kazizi55) • 2021年BuySell Technologies新卒入社 • 在庫管理SaaSチーム FEエンジニア • 最近はValibotにOSSコミットしてます
• 今回が初めての外部登壇なので緊張し てるかも、、! 01
Zodって便利だけど、bundle size大きくないですか? 06
現在自分が携わっているプロダクトではFEでのバリデーションを実現する ためにZodを導入しています。 そんな中、なぜValibotを選ぼうとしているのかをbundle size観点でお話 しできればと思います。 はじめに 05
伝えたいこと: 「ValibotはZodの書き心地を保ったままbundle sizeを小さ くしたものなので、ぜひ使ってみてね」 06
今回のトークの要約 01 Zodってめちゃ便利ですよね 02 ただし弊プロダクトチーム的にはnot for usだった 03 代わりにValibotを使ってもいいかも (将来的には)
07
Zodとは • class basedのJavaScriptバリデーションライブラリ • GitHub Star: 26K (2023/10/18現在) •
parse, don’t validateの考えに基づいている 参照: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/ 08
• class basedなのでmethod chainingで記述していける • Zodとは 09
Zodのエコシステム (FE, BE) • React Hook Form • zodious (=
axios + zod) • tRPC • etc… 10
Zodは既存のバリデーションライブラリと比べても多機能 joi Yup io-ts Zod schemaから 型が生成できる ❌ ◯ ◯
◯ union, intersection型に 対応 ❌ ❌ ◯ ◯ promiseの schemaがある ❌ ❌ ❌ ◯ functionの schemaがある ❌ ❌ ❌ ◯ 参照: https://zod.dev/?id=comparison 11
ただZodは弊プロダクトチームの使い方的には not for usだと思っています 12
not for usと判断した理由 • bundle sizeが12kbもある • 弊プロダクトではZodの一部の機能しか使っていない 13
そもそもなぜbundle sizeは大きくなるのでしょう? 14
そもそもなぜbundle sizeが大きくなるか? • 1個1個のモジュールが大きい場合にbundle sizeが大きくなる • 小さくするためのアプローチはいくつか存在する ◦ code splitting,
compression, tree shaking, etc… 15
tree shakingとは • bundle時に使われていないコードを削ぎ落とす • functionでのみtree shakingできる • import /
exportだけの依存関係に終始しないclassはtree shakingできない 参照: https://webpack.js.org/guides/tree-shaking/ 16
bundle sizeが12kbもある理由 • class basedでtree shakingできない • method chainingでバリデーションを表現できるように各classにclass methodがたくさん定義されている
参照: Zodのsource code 17
在庫管理SaaSではZodの一部の機能しか使っていない • ほぼschemaの定義とsafeParseしか用いてない => 使わないコードはbundleの時点でtree shakingして削ぎ落としたい 18
tree shakingできるZodがあればいいのに、、 19
そこでValibotの出番です! 20
Valibot知っている方いらっしゃいますか? 21
Valibotとは • function basedのJavaScriptバリデーションライブラリ • GitHub Star: 3.8K (2023/10/18現在) •
Zodでできることはほぼできる • function basedなのでtree shakingできる • 個人的に最近issueを立てたりPR送ったりしてコミットしてます 参照: https://github.com/fabian-hiller/valibot https://valibot.dev/thesis.pdf 22
Valibotのエコシステム • Zod同様、FEからBEまでいろんなライブラリに組み込みが可能 ◦ ただし今はZodios的なものはない • 今後はQwikやSolidJS周りのエコシステムにも導入されていく 参照: https://www.builder.io/blog/introducing-valibot#more-integrations 23
function basedなのでtree shakingできる 参照: https://www.builder.io/blog/introducing-valibot#comparison-with-zod 24 Zod Valibot
参照: https://www.builder.io/blog/introducing-valibot#comparison-with-zod 25 Zod Valibot Valibotのbundle sizeはZodの約1/16にまで小さくなる! 0.7kb 11.51kb
どうやってfunction basedでZodと同じ機能を提供してい るか? Zodがclass methodのchainingを用いて実現していた以下を 関数のネストとTypeScriptの型を活用して実現している • schema間の状態の共有 • schema・メソッドの互換性チェック
26
schema間の状態の共有 • Zod 27
schema間の状態の共有 • Valibot 28
schema間の状態の共有 • Valibot ◦ 実際は以下のように関数がネスト & カリー化されて実行される 29
schema・メソッドの互換性チェック • Zod ◦ 素のJSでも互換性が担保される 30
schema・メソッドの互換性チェック • Valibot ◦ TypeScriptであれば互換性がないと型エラーが起こる ◦ 素のJSだと互換性は担保されない (実行までわからない) 31
Valibotの今後の展望 • Deno, BunなどTypeScriptファーストのランタイムのサポートを強め ていく • edge runtimeで使用されることを想定している 参照: https://www.builder.io/blog/introducing-valibot
https://github.com/BuilderIO/qwik/pull/4998 https://github.com/fabian-hiller/modular-forms Cloudflare Workers - worker size 32
ただしValibotは未だ不完全 • 未だv0.19.0 (2023/10/25現在) ◦ 趣味で使ってみてはいかがでしょう • documentが作成途中 • 一旦メジャーリリースまで持っていきたい
33
• Zodはめちゃ便利ですよね • ただし弊プロダクトチーム的にはnot for usだった • 代わりにValibotを使ってもいいかも まとめ 34
伝えたいこと (再掲): 「ValibotはZodの書き心地を保ったままbundle sizeを小さ くしたものなので、ぜひ使ってみてね」 35
|事業内容 • 買取・販売の循環を実現する総合リユースビジネスを展開 • 各種買取・販売チャネルで、誰かの不要なものを、誰かの必要なものへ 36
Cosmos 37
Cosmos 38
THANK YOU
Appendix
• エディタだけだと補完が効かない => GitHub Copilotを使えば補完は効くし、補完用のVSCodeの拡張機 能も開発される予定なので、時間の問題かも Valibotの改善点 39 参照: https://valibot.dev/thesis.pdf
• instance / class methodsがどこで参照されているかを静的解析で特定す るのが難しいから ◦ instanceはmutableなobjectなのでいくらでも変更できてしまう ◦ 色んな呼び方ができてしまう
◦ 呼ばれなくてもmethodのkeyだけ参照される場合もある なぜclass basedだとtree shakingできないか? 参照: https://github.com/rollup/rollup/issues/349#issuecomment-348406169 40
instanceはmutableなobjectなのでいくらでも変更できて しまう • 別のinstance methodで上書きする ◦ const a = new
Foo() ◦ const b = new Bar() ◦ a.foo = b.bar • 全く別のinstanceに作り替える ◦ a.foo = b.bar ◦ a.baz = c.qux ◦ a.quux = d.corge • etc… 41
色んな呼び方ができてしまう • instance.foo()というmethod chainingでの呼び出しの他にも色んな呼び 方ができる ◦ instance['fo' + 'o]() ◦
instance[getFoo()]() ◦ instance[0]() ◦ etc... 42
呼ばれなくてもmethodのkeyだけ参照される場合もある • 以下を使ったりすればclass / instance methodのkeyだけを参照して処理 を書くことができてしまう ◦ Object.getOwnPropertyNames(SomeClass.prototype) ◦
Object.getOwnPropertyNames(Object.getPrototypeOf(instan ce)) 43
• Google Closure CompilerのADVANCED_OPTIMIZATIONSオプショ ンを使えばtree shakingできるが、かなり制限が多い ◦ 全てグローバル変数になるので名前空間問わず命名被りが許されな い ◦
文字列でobject propertyを参照できない ▪ x['key']とかは使えない ◦ etc… ちなみにclass basedでもtree shakingできるcompilerは ある 参照: Understanding the Restrictions Imposed by the Closure Compiler 44