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
雑なコード生成のすすめ #nihonbashijs 8 / zatsu-code-genera...
Search
izumin5210
December 14, 2023
Technology
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
雑なコード生成のすすめ #nihonbashijs 8 / zatsu-code-generation
https://nihonbashi-js.connpass.com/event/301794/
izumin5210
December 14, 2023
More Decks by izumin5210
See All by izumin5210
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.7k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
2
870
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
8
2.8k
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
2.2k
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
6
1.8k
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
3.4k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.7k
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
1.2k
TypeScript を活かしてデザインシステム MCP を作る / #tskaigi_after_night
izumin5210
5
930
Other Decks in Technology
See All in Technology
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
140
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
6
2.4k
AIはどのように 組織のアジリティを変えるのか?
junki
3
890
Bedrock AgentCore RuntimeでAuth0 Changelog調査AIをアップグレードした話
t5u8a5a
1
160
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
200
Claude Codeとのおしゃべりでセマンティックモデルの定義からダッシュボード作成まで完成させる
nic_sugiyama
0
110
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
200
非エンジニアがClaudeと挑んだ「1ヶ月間プロダクト30本ノック」
askokc
0
540
攻撃者視点で考えるDetection Engineering
cryptopeg
3
1.8k
なぜ Platform Engineering の土台に Kubernetes を選ぶのか
r4ynode
2
640
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
3
2.1k
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1.1k
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Balancing Empowerment & Direction
lara
6
1.2k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
The untapped power of vector embeddings
frankvandijk
2
1.8k
Typedesign – Prime Four
hannesfritz
42
3.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
A better future with KSS
kneath
240
18k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
230
GitHub's CSS Performance
jonrohan
1033
470k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
310
Transcript
© 2023 LayerX Inc. 今日からできる!雑なコード生成のすすめ 2023-12-14 Nihonbashi.js #8 @izumin5210
© 2023 LayerX Inc. 2 ▸ Wantedly, Inc. (2018-04 -
2022-08) ▸ LayerX (2022-09-) ‐ バクラク事業部 Enabling Team ‐ Backend と Web Frontend 中心にやってます ▸ 最近のお気に入りパッケージは @bufbuild/protoplugin, @floating-ui/react 画像を入れてね whoami @izumin5210
© 2023 LayerX Inc. 3 コード生成とは はじめに - 雑なコード生成のすすめ
© 2023 LayerX Inc. 4 はじめに - 雑なコード生成のすすめ .proto .graphql
pages/**/*.tsx *_pb.ts, *_connect.ts @bufbuild/protoc-gen-es @connectrpc/protoc-gen-connet-es *.ts $path.ts graphql-codegen など pathpida など APIスキーマをもとに クライアントが自動で作られる! 型もあって安心! ファイルパスをもとに URLビルダーが自動で作られる! 型もあって安心!
© 2023 LayerX Inc. 5 はじめに - 雑なコード生成のすすめ .proto .graphql
pages/**/*.tsx *_pb.ts, *_connect.ts @bufbuild/protoc-gen-es @connectrpc/protoc-gen-connet-es *.ts $path.ts graphql-codegen など pathpida など APIスキーマをもとに クライアントが自動で作られる! 型もあって安心! ファイルパスをもとに URLビルダーが自動で作られる! 型もあって安心! 他で宣言されているルール(APIスキーマ, ファイル・ディレクトリ構成, etc.)に従って コードを書いている場合、それは自動で生成できる可能性がある TypeScript は型の表現力が高いので、 うまくコードを生成できれば高い生産性を得られる
© 2023 LayerX Inc. 6 コード生成は便利! …が、世の中にちょうどいいパッケージが存在しないことがある はじめに - 雑なコード生成のすすめ
© 2023 LayerX Inc. 7 コード生成は便利! …が、世の中にちょうどいいパッケージが存在しないことがある ↓ 雑でもいいので、痒いところを掻くためのコード生成を自作しよう! はじめに
- 雑なコード生成のすすめ
目次 Agenda ▸ はじめに ▸ How to 雑コード生成 ▸ How
to 何かをもとにコード生成 ‐ Protobuf ‐ GraphQL ‐ TypeScript
© 2023 LayerX Inc. 9 雑なコード生成の例 例: public/ 以下のファイル一覧を型に ▸
モチベーション ‐ Next.js 標準の typedRoutes だと未対応 ▸ じつは40行くらいで作れる。めっちゃ簡単。 ‐ 再帰的にディレクトリを見て、ファイル一覧を作る ‐ ファイル一覧の配列を | で join して union にする
© 2023 LayerX Inc. 10 雑なコード生成の例 雑ポイント①: コードは雑に文字列で組み立ててOK 専用のライブラリの使い方を覚える必要はない (ただし,変数名の衝突が気になるサイズのコードをつくるときは
ts-poet 等に頼ると楽)
© 2023 LayerX Inc. 11 雑なコード生成の例 雑ポイント②: コードは雑に stdout or
fs.writeFile でOK fs.writeFile してもいいけど shellscript でリダイレクトするほうが楽(かも)
© 2023 LayerX Inc. 12 雑なコード生成の例 雑ポイント③: ts-node 等で雑に直接実行してOK ビルドなどややこしいことは考えたくないが、TypeScriptで書きたい
(上の例は package.json に記述している。shebang を書くパターンもナシではない。)
© 2023 LayerX Inc. 13 雑なコード生成の例 雑ポイント④: いきなり完璧を目指さない 1つのリポジトリや社内での利用に限れば、困ってからでもなんとかなる! 完璧にエッジケース対応したり汎用化したりはもっと後でいい
© 2023 LayerX Inc. 14 他のなんらかの宣言・定義(APIスキーマ, コード, etc.)をもとに コード生成したいケースは? 雑なコード生成のすすめ
© 2023 LayerX Inc. 15 何らかの宣言から TypeScript を生成する GraphQL をもとに
TypeScript を吐く graphql パッケージで構造化されたスキーマを取得できるので、そこから必要な情報を集める (上のコードは InputObject から zod の Object schema を作ろうとしている)
© 2023 LayerX Inc. 16 何らかの宣言から TypeScript を生成する Protobuf をもとに
TypeScript を吐く @bufbuild/protoplugin を使えば 構造化されたスキーマを元にコード生成ができる (左のコードは Protobuf の message から zod の Object schema を生成しようとしている)
© 2023 LayerX Inc. 17 何らかの宣言から TypeScript を生成する TypeScript をもとに
TypeScript を吐く typescript や ts-morph でコードを AST に変換できる あとは目的のコードを見つけて処理するだけ (目的のコードの AST 上での表現は AST Explorer で調べる)
© 2023 LayerX Inc. 18 他のなんらかの宣言・定義(APIスキーマ, コード, etc.)をもとに コード生成したいケースは? ↓
何らかの方法で Tree or リストが得られるので、 それを辿るだけ! はじめに - 雑なコード生成のすすめ
© 2023 LayerX Inc. 19 ▸ コード生成は、こだわりすぎなければ難しくないし手間もかからない ‐ 「雑に文字列 join
して stdout に出すスクリプト」を「雑に ts-node で動かす」でもそんなに困らない ‐ スキーマやASTを読むのも、限られたユースケースなら複雑なフレームワークに乗る必要もない。 for … of でなんとかなる。 まとめ ▸ ほどよいライブラリが世の中にないときは、 さっと手を動かして雑な(ちょうどいい)コード生成をしてみませんか? ‐ その雑なツールがいつか public になればみんなハッピーかも ‐ 面白いネタがあったら教えてください or 公開まってます!