Slide 1

Slide 1 text

2026/08/22 Kyoto.なんか #8 自分の Web サイトを作る: 高速化編 k586

Slide 2

Slide 2 text

自己紹介 名前: k586 (かづき こはる) Twitter: @k586 GitHub: k586jp https://k586.jp 長いことパソコンなんでも屋 (ヘルプデスク) をしてました 一応 IT 職の人間ではあるが……

Slide 3

Slide 3 text

宣言通り、会のレベルを下げにきました! https://x.com/k586/status/1959215902064509131 はてなさん、いつも会場ありがとうございます!

Slide 4

Slide 4 text

ふりかえり 2024 年 失業、無職 なにかするぞ!と思い、

Slide 5

Slide 5 text

ふりかえり 2024 年 失業、無職 なにかするぞ! --> ドメイン購入 さくらレンタルサーバ契約 Cloudflare アカウント作成 さくらに HTML を置いて Cloudflare DNS でドメイン設定 プロキシ化もする

Slide 6

Slide 6 text

ふりかえり 2025 年 Cloudflare Workers というものがあるらしい TypeScript でサーバーサイドの処理が書けるらしい しかしそもそも、クライアントサイドの経験もほぼ無い ↓ まずはクライアントサイド中心で日記の処理を実装してみる

Slide 7

Slide 7 text

2025 年 イメージ図 Worker (ルーター) クライアント クライアント (Markdown 処理) さくら API (DB 接続) さくら SQLite

Slide 8

Slide 8 text

ここで問題が……

Slide 9

Slide 9 text

ここで問題が…… 遅い! カクつく! (表示まで 1 秒以上)

Slide 10

Slide 10 text

ここで問題が…… Worker (ルーター) さくら API (DB 接続) さくら SQLite クライアント クライアント (Markdown 処理) DB 更新したいけど 認証どうするの?

Slide 11

Slide 11 text

2026 年 自分の Web サイトを作る: 高速化編 ~ CSR から SSR へ ~

Slide 12

Slide 12 text

2025 年 イメージ図 (旧) Worker (ルーター) クライアント クライアント (Markdown 処理) さくら API (DB 接続) さくら SQLite

Slide 13

Slide 13 text

2026 年 イメージ図 (新) Worker (ルーター) Woker (DB 接続) Woker (Markdown 処理) クライアント D1 SQLite

Slide 14

Slide 14 text

2026 年 イメージ図 (新) Worker (ルーター) Woker (DB 接続) D1 SQLite Woker (Markdown 処理) クライアント 全部 Cloudflare に集約して高速化 外部からアクセスできるのはルーターのみ

Slide 15

Slide 15 text

高速化 (1) さくらに置いている DB からデータを取得するのに、 0.7 秒前後かかっている。 DB を Cloudflare D1 にし、 Cloudflare Worker から呼び出すことで、 取得時間が短縮できるはず。(多分)

Slide 16

Slide 16 text

高速化 (2) クライアントサイドでは、 以下の JS を動かしていた。 これを Mermaid.js だけ にする。 • Marked.js • Prism.js • Mermaid.js • DOMPurify

Slide 17

Slide 17 text

高速化 (2) クライアントサイドでは、 以下の JS を動かしていた。 これを Mermaid.js だけ にする。 Cloudflare Workers で、 以下を動かす。 出力した HTML は、 Cloudflare D1 に保存。 • Marked.js • Prism.js • Mermaid.js • DOMPurify --> Marked.js --> refractor --> エスケープ処理

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

実際の URL 2026 年版: https://k586.jp 2025 年版: https://workers-20260812-k586jp.k586.workers.dev

Slide 20

Slide 20 text

高速化まとめ 速くなった!

Slide 21

Slide 21 text

認証 Worker (ルーター) Woker (DB 接続) D1 SQLite Woker (Markdown 処理) クライアント クライアントから DB を更新する機能を つけたい

Slide 22

Slide 22 text

認証: 結論 Cloudflare Access を 設定して、 記事編集ページに ログイン認証を追加した。 自力で Google 認証等 を実装すべきかと考えていたが、 今回の用途なら Cloudflare の管理画面をポチポチするだけで 済んだ。

Slide 23

Slide 23 text

(余談) 謎の JS エラーが出る…… Executing inline script violates the following Content Security Policy directive 'script-src 'self' *.cloudflare.com *.cloudflareinsights.com *.jsdelivr.net'. Either the 'unsafeinline' keyword, a hash ('sha256XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX='), or a nonce ('nonce-...') is required to enable inline execution. The action has been blocked.

Slide 24

Slide 24 text

(余談) 謎の JS エラーが出る…… Executing inline script violates the following Content Security Policy directive 'script-src 'self' *.cloudflare.com *.cloudflareinsights.com *.jsdelivr.net'. Either the 'unsafeinline' keyword, a hash ('sha256XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX='), or a nonce ('nonce-...') is required to enable inline execution. The action has been blocked. Cloudflare が自動で挿入する JS がブロックされているので、 ヘッダーで nonce を設定して許可してね、とのこと。

Slide 25

Slide 25 text

Hono で nonce の設定 function useSecureHeaders(context: Context, next: Next) { return secureHeaders({ (中略) contentSecurityPolicy: { scriptSrc: [ NONCE, "'self'", "'strict-dynamic'", 'https://*.cloudflare.com', 'https://*.cloudflareinsights.com' ], styleSrc: [ (中略) ], (中略) } })(context, next); }

Slide 26

Slide 26 text

Hono で nonce の設定 nonce はランダムな文字列っぽい。 nonce の文字列が一致した JS だけ許可されるっぽい。 あまり nonce について理解しないまま、 簡単に Hono で設定できてしまった……。 (また勉強したほうがよさそう)

Slide 27

Slide 27 text

おわりに (感想) ここ数年で、15 年ぶりくらいに JS 系の言語を触った。 Hono (& TS) を触ると、モダンな言語の思想みたいなものを 感じる気がする。 自分でサーバーを建てなくても、 Routing や Middleware のようなことができるのか。 さくらレンタルサーバもメール等で使い続ける予定。 ちなみにさくらは Cloudflare Origin CA 証明書が設定できる。 たぶんレンタルサーバーだとめずらしいはず。

Slide 28

Slide 28 text

おわりに (感想) 最後にこちらの本! とても参考になりました。 D1 関連とか Service bindings とか、 なんとなく存在くらいしか 知らなかったので、 いろんな機能を知れてよかったです。 https://gihyo.jp/book/2026/978-4-297-15438-7