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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
izumin5210
December 14, 2023
Technology
210
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
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
2k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
2
1k
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
8
3k
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
2.3k
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
6
1.8k
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
3.5k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.8k
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
1.3k
Other Decks in Technology
See All in Technology
Apache Icebergインフラストラクチャ:ストレージ・カタログ・エンジンの選択肢とClouderaプラットフォームでの実装
tsugiyama
0
120
Goでデータパイプラインを作ろう
sansantech
PRO
1
510
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
470
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
7.6k
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
150
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
230
TypeScript入門 2026
recruitengineers
PRO
3
690
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
3
25k
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
220
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
270
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
800
The Invisible Side of Design
smashingmag
301
52k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
490
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
470
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
780
Believing is Seeing
oripsolob
1
190
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
Building an army of robots
kneath
306
46k
Statistics for Hackers
jakevdp
799
230k
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 公開まってます!