Use Cases

Cloudflare Workers avec Claude Code

Découvrez Cloudflare Workers avec Claude Code. Conseils pratiques et exemples de code inclus.

Accélérer le développement Cloudflare Workers avec Claude Code

Cloudflare Workers est une plateforme serverless qui permet d’exécuter du JavaScript/TypeScript sur le réseau mondial de Cloudflare. Basé sur le moteur V8, il offre des réponses rapides sans cold start. En utilisant Claude Code, vous pouvez gérer efficacement les API et les bindings spécifiques aux Workers.

Lancement du projet

> Crée un projet Cloudflare Workers.
> Avec le framework Hono et une base de données D1.
npm create cloudflare@latest my-worker -- --template=hello-world
cd my-worker
npm install hono
# wrangler.toml
name = "my-api"
main = "src/index.ts"
compatibility_date = "2024-12-01"

[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

[[kv_namespaces]]
binding = "CACHE"
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

[[r2_buckets]]
binding = "STORAGE"
bucket_name = "my-bucket"

Implémentation d’API avec Hono

> Crée une API CRUD avec le framework Hono.
> Implémente aussi l'intégration avec la base de données D1.
// src/index.ts
import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { jwt } from 'hono/jwt';

type Bindings = {
  DB: D1Database;
  CACHE: KVNamespace;
  STORAGE: R2Bucket;
  JWT_SECRET: string;
};

const app = new Hono<{ Bindings: Bindings }>();

app.use('/api/*', cors());

// Liste des articles
app.get('/api/posts', async (c) => {
  const { results } = await c.env.DB.prepare(
    'SELECT * FROM posts ORDER BY created_at DESC LIMIT 20'
  ).all();

  return c.json({ posts: results });
});

// Création d'article
app.post('/api/posts', async (c) => {
  const { title, content } = await c.req.json();

  const result = await c.env.DB.prepare(
    'INSERT INTO posts (title, content, created_at) VALUES (?, ?, datetime())'
  )
    .bind(title, content)
    .run();

  // Invalidation du cache
  await c.env.CACHE.delete('posts:latest');

  return c.json({ id: result.meta.last_row_id }, 201);
});

// Upload d'image (R2)
app.post('/api/upload', async (c) => {
  const formData = await c.req.formData();
  const file = formData.get('file') as File;

  if (!file) {
    return c.json({ error: 'File required' }, 400);
  }

  const key = `uploads/${Date.now()}-${file.name}`;
  await c.env.STORAGE.put(key, file.stream(), {
    httpMetadata: { contentType: file.type },
  });

  return c.json({ key, url: `/api/files/${key}` });
});

export default app;

Migration de la base de données D1

-- migrations/0001_create_tables.sql
CREATE TABLE IF NOT EXISTS posts (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title TEXT NOT NULL,
  content TEXT NOT NULL,
  slug TEXT UNIQUE,
  published BOOLEAN DEFAULT FALSE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_posts_slug ON posts(slug);
CREATE INDEX idx_posts_published ON posts(published, created_at);
# Exécution de la migration
npx wrangler d1 migrations apply my-database

# Développement local
npx wrangler d1 migrations apply my-database --local
npx wrangler dev

Utilisation du cache KV

// src/cache.ts
export async function getCachedData<T>(
  kv: KVNamespace,
  key: string,
  fetcher: () => Promise<T>,
  ttl = 3600
): Promise<T> {
  const cached = await kv.get(key, 'json');
  if (cached) return cached as T;

  const data = await fetcher();
  await kv.put(key, JSON.stringify(data), { expirationTtl: ttl });
  return data;
}

// Exemple d'utilisation
app.get('/api/stats', async (c) => {
  const stats = await getCachedData(
    c.env.CACHE,
    'stats:daily',
    async () => {
      const { results } = await c.env.DB.prepare(
        'SELECT COUNT(*) as count FROM posts WHERE published = TRUE'
      ).all();
      return results[0];
    },
    300 // cache de 5 minutes
  );

  return c.json(stats);
});

Déploiement et monitoring

# Déploiement
npx wrangler deploy

# Consultation des logs
npx wrangler tail

# Configuration des secrets
npx wrangler secret put JWT_SECRET

Résumé

En combinant les bindings riches de Cloudflare Workers avec Claude Code, vous pouvez construire efficacement des API full-stack fonctionnant en edge. Consultez aussi le guide des fonctions serverless et l’introduction au edge computing.

Pour plus de détails sur Cloudflare Workers, consultez la documentation officielle de Cloudflare Workers.

#Claude Code #Cloudflare Workers #edge computing #serverless #API