Slide 1

Slide 1 text

Yusuke Wada / 2025 — 02-15 Honoのおもしろいミドルウェア をみてみよう 湘.なんか #2

Slide 2

Slide 2 text

Honoのおもしろいミドルウェアをみてみよう • その名の通りHonoのおもしろいミドルウェアをピックアップしてみます • おもしろいは個 人 的主観です

Slide 3

Slide 3 text

Honoのミドルウェア • Custom Middleware - 自 分で定義する • Built-in Middleware - `hono`パッケージに同封されている • 外部のライブラリに依存しない • 3rd-party Middleware - `hono`パッケージには 入 っていない • 外部のライブラリに依存していい • `@hono`ネームスペース(例:`@hono/hello`)に置かれる場合がある

Slide 4

Slide 4 text

Built-in Middleware 23個ある 1.Basic Authentication 2.Bearer Authentication 3.Body Limit 4.Cache 5.Combine 6.Compress 7.Context Storage 8.CORS 9.CSRF Protection 10.ETag 11.IP Restriction 12.JSX Renderer 13.JWK 14.JWT 15.Logger 16.Language 17.Method Override 18.Pretty JSON 19.Request ID 20.Secure Headers 21.Timeout 22.Timing 23.Trailing Slash

Slide 5

Slide 5 text

3rd-party Middleware Webサイトに掲載されているものだけで34個ある

Slide 6

Slide 6 text

ミドルウェアの使い 方

Slide 7

Slide 7 text

ではいってみよう

Slide 8

Slide 8 text

Standard Scheme Validator Middleware

Slide 9

Slide 9 text

Standard Scheme Validator Middleware • 3rd-party Middleware • Standard Schema Specに準拠したバリデータ • Standard Schema? • TypeScript/JavaScriptのいくつかあるバリデータの標準インター フェースをつくるプロジェクト • Zod / Valibot / ArkType などが対応している • これまであったZod Validator / Valibot Validator / ArkType Validatorの代わりになり、ひとつのミドルウェアで全バリデータに対応で きる

Slide 10

Slide 10 text

使い 方 Zodの場合

Slide 11

Slide 11 text

使い 方 全部使ってみる ぜんぶsValidatorでいい!

Slide 12

Slide 12 text

JSX Renderer Middleware

Slide 13

Slide 13 text

JSX Renderer Middleware • 個 人 的に好きなミドルウェア • JSXを扱う時に`c.render`の挙動を簡単に定義できる

Slide 14

Slide 14 text

c.render / c.setRenderer 「コンテンツを受け取ってResponseを返す」を定義する c.renderでコンテンツを渡す Responseなんで直接返せる

Slide 15

Slide 15 text

JSX Renderer MiddlewareはJSXをコンテンツとして扱うのに便利

Slide 16

Slide 16 text

`children`以外にも渡せる

Slide 17

Slide 17 text

Context Storage Middleware

Slide 18

Slide 18 text

Context Storage Middleware • `Context`オブジェクトにグローバルでアクセスすることができるようになる • `AsyncLocalStorage`ってのを使っている • `Context`へはハンドラかミドルウェア内じゃないアクセスできなかった • グローバルに定義するのは基本的にしない • Request => Handler => Responseの中で`Context`を扱うのが基本 • AsyncLocalStorageはそこで使えるストレージを提供する

Slide 19

Slide 19 text

`Context`へのアクセス

Slide 20

Slide 20 text

`Context`にグローバルでアクセスできる

Slide 21

Slide 21 text

Server-Timing Middleware

Slide 22

Slide 22 text

Server-Timing Middleware • パフォーマンスをServer-Timingレスポンスヘッダに書き出す

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

ChromeのDevToolsで 見 れるの便利

Slide 25

Slide 25 text

esbuild Transpiler Middleware

Slide 26

Slide 26 text

esbuild Transpiler Middleware • 3rd-party • TypeScript/TSXなどをアクセスが来たらビルドして返却する • バンドルしなくて済む! • 毎回ビルドしなくてはいけないがうまくキャッシュさせることもできそう • wasmのesbuildを使っている

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

以上!

Slide 29

Slide 29 text

おもしろいミドルウェアでした • Standard Schema Validator Middleware • JSX Renderer Middleware • Context Storage Middleware • Server-Timing Middleware • esbuild Transpiler Middleware

Slide 30

Slide 30 text

おしまい