Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WorkersでCMSを作ってみないか / Wanna build a CMS with W...

WorkersでCMSを作ってみないか / Wanna build a CMS with Workers?

Cloudflare Workers Tech Talks in Hokkaido #1 での発表資料

Avatar for Taiyu Yoshizawa

Taiyu Yoshizawa

September 04, 2025

More Decks by Taiyu Yoshizawa

Other Decks in Technology

Transcript

  1. Who are you? ɴᴇᴋᴏʏᴀsᴀɴ Software Engineer @MIERUNE Inc. Co-founder &

    Software Engineer @ ReMotive GitHub: @NEKOYASAN Web: nekoyasan.me ←最近更新忘れて、メッチャ焦りました
  2. Cloudflare Developer platform AI Gateway Analytics Engine Assets Browser Rendering

    D1 Durable Objects Hyperdrive Images KV Queues R2 Service Bindings Vectorize Workers for Platforms Workers AI Cache API
  3. Cloudflare Developer platform AI Gateway Analytics Engine Assets Browser Rendering

    D1 Durable Objects Hyperdrive Images KV Queues R2 Service Bindings Vectorize Workers for Platforms Workers AI Workflows こんだけあれば Workersでなんとかなるんじゃね
  4. Cloudflare Developer platform AI Gateway Analytics Engine Assets Browser Rendering

    D1 Durable Objects Hyperdrive Images KV Queues R2 Service Bindings Vectorize Workers for Platforms Workers AI Cache API
  5. Cloudflare Developer platform AI Gateway Analytics Engine Assets Browser Rendering

    D1 Durable Objects Hyperdrive Images KV Queues R2 Service Bindings Vectorize Workers for Platforms Workers AI Cache API
  6. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 15 16 17 18 19 app.get("/*", async (c) => { const object = await c.env.TEST_BUCKET.get(key); if (object === null || !("body" in object)) { return c.text("Object Not Found", 404); } const format = c.req.query("format") || "image/avif"; const width = c.req.query("w") ? Number(c.req.query("w")) : undefined; const response = ( await c.env.IMAGES.input(object.body) .transform({ width: width, }) .output({ format: format as any }) ).response(); return response; })
  7. なぜ使い分けるか? D1 は filter / sortに強いが若干遅い (KV比) KV は 早いが

    filter / sort に弱い なので 初回取得時はD1から取得し、条件等と共にTTLをつけてKV に保管する 2回目以降はKVから取得する 書き換えが発生した場合はKV⁨の⁩ 中身をclearする 管理画面からはD1をみれるAPIを使う
  8. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 15 16 17 18 import { DurableObject } from "cloudflare:workers"; export class AlarmExample extends DurableObject { constructor(ctx, env) { this.ctx = ctx; this.storage = ctx.storage; } async fetch(request) { const { seconds } = JSON.parse(request.body) let currentAlarm = await this.storage.getAlarm(); if (currentAlarm == null) { this.storage.setAlarm(Date.now() + 10 * SECONDS); } } async alarm() { // Alerm } }
  9. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 15 16 17 18 export default { async fetch(request, env, ctx) { env.ANALYTICS.writeDataPoint({ 'blobs': [ request.headers["CF-Connection-IP"] ], 'doubles': [ 1, 2, 4 ], 'indexes': [ userId, ] }); return new Response("Stored!"); }, };