Architecture Overview β
Diagram dan penjelasan cara kerja aplikasi secara menyeluruh.
ποΈ High-Level Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLOUDFLARE EDGE β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ β
β β Tokyo Edge β β London Edge β β SΓ£o Paulo Edge β β
β β βββββββββββββ β β βββββββββββββ β β βββββββββββββ β β
β β β Worker β β β β Worker β β β β Worker β β β
β β β (SSR) β β β β (SSR) β β β β (SSR) β β β
β β βββββββ¬ββββββ β β βββββββ¬ββββββ β β βββββββ¬ββββββ β β
β β β β β β β β β β β
β β βββββββ΄ββββββ β β βββββββ΄ββββββ β β βββββββ΄ββββββ β β
β β β D1 β β β β D1 β β β β D1 β β β
β β β (SQLite) β β β β (SQLite) β β β β (SQLite) β β β
β β β Replica β β β β Replica β β β β Replica β β β
β β βββββββββββββ β β βββββββββββββ β β βββββββββββββ β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β HTTPS
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER BROWSER β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SvelteKit App β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββββββββββ β β
β β β Pages β β Forms β β API β β Client State β β β
β β β(Routes) β β(Actions) β β (Loads) β β (Stores) β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββπ Request Flow Diagram β
1. Page Load (Server-Side Rendering) β
User Request (e.g., /dashboard)
β
βΌ
βββββββββββββββββββ
β Cloudflare Edge β
β Worker β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β SvelteKit β
β hooks.server.ts β
β - Inject DB β
β - Validate Auth β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β +page.server.ts β
β - load() β
β - Query D1 β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β SvelteKit β
β Render HTML β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Send to Browser β
β (Complete HTML) β
βββββββββββββββββββ2. Form Submission (Form Actions) β
User Submit Form
β
βΌ
βββββββββββββββββββ
β POST /action β
β (No JS needed) β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Cloudflare Edge β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β +page.server.ts β
β - actions {} β
β - Validate β
β - Insert D1 β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Redirect/Result β
β (Full page or β
β JSON response) β
βββββββββββββββββββ3. Client-Side API Call β
JS Fetch API
β
βΌ
βββββββββββββββββββ
β +server.ts β
β (API Endpoint) β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Process Request β
β - Auth check β
β - DB query β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β JSON Response β
βββββββββββββββββββπ Authentication Flow β
Registration Flow β
User Frontend Backend D1
β β β β
β Fill form β β β
βββββββββββββββββββββββββ>β β β
β β POST /auth/register β β
β βββββββββββββββββββββββββ>β β
β β β Validate input β
β β β Hash password β
β β β Insert user β
β β βββββββββββββββββββββββ>β
β β β β
β β β<βββββββββββββββββββββββ
β β β Create session β
β β β Set cookie β
β β<βββββββββββββββββββββββββ β
β β Set cookie β β
β Redirect to dashboard β β β
β<βββββββββββββββββββββββββ β β
β β β βLogin Flow β
User Frontend Backend D1
β β β β
β Credentials β β β
βββββββββββββββββββββββββ>β β β
β β POST /auth/login β β
β βββββββββββββββββββββββββ>β β
β β β Find user by email β
β β βββββββββββββββββββββββ>β
β β β<βββββββββββββββββββββββ
β β β Verify password β
β β β Create session β
β β β Set cookie β
β β<βββββββββββββββββββββββββ β
β β Set cookie β β
β Redirect to dashboard β β β
β<βββββββββββββββββββββββββ β β
β β β βGoogle OAuth Flow β
User Frontend Backend Google
β β β β
β Click "Login with β β β
β Google" β β β
βββββββββββββββββββββββββ>β β β
β β GET /auth/google β β
β βββββββββββββββββββββββββ>β β
β β β Generate state β
β β β Redirect to Google β
β β<βββββββββββββββββββββββββ β
β β 302 Redirect β β
β<βββββββββββββββββββββββββ β β
β Login to Google β β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ>β
β β β β
β β β<βββββββββββββββββββββββββ
β β β Callback with code β
β β GET /auth/google/ β β
β β callback β β
β βββββββββββββββββββββββββ>β β
β β β Exchange code β
β β β Get user info β
β β β Create/update user β
β β β Create session β
β β<βββββββββββββββββββββββββ β
β Redirect to dashboard β β β
β<βββββββββββββββββββββββββ β β
β β β βπΎ Data Flow Patterns β
Pattern 1: Server Load (Recommended) β
typescript
// +page.server.ts
export const load = async ({ locals }) => {
// β
Query di server, data di-embed di HTML
const users = await locals.db.query.users.findMany();
return { users };
};
// +page.svelte
<script>
export let data; // Data sudah ada, no loading state!
</script>
{#each data.users as user}
<UserCard {user} />
{/each}Flow:
Request β Server Query β Render HTML β Browser (data langsung ada)Pattern 2: Form Actions (Recommended) β
typescript
// +page.server.ts
export const actions = {
createPost: async ({ request, locals }) => {
const form = await request.formData();
// β
Works tanpa JavaScript!
await locals.db.insert(posts).values({ ... });
return { success: true };
}
};
// +page.svelte
<form method="POST" action="?/createPost">
<input name="title" />
<button type="submit">Create</button>
</form>Flow:
Form Submit β Server Action β DB Insert β Redirect/ResultPattern 3: Client Fetch (Use Sparingly) β
typescript
// +page.svelte
<script>
import { onMount } from 'svelte';
let users = [];
onMount(async () => {
// β οΈ Extra API call, loading state needed
const res = await fetch('/api/users');
users = await res.json();
});
</script>
{#if users.length}
{#each users as user}
<UserCard {user} />
{/each}
{:else}
<LoadingSpinner />
{/if}Flow:
Page Load β HTML Render β JS Fetch β Loading State β Display Dataπ Deployment Architecture β
Development Production
β β
βΌ βΌ
ββββββββββββββββ ββββββββββββββββββββ
β Local D1 β β Cloudflare D1 β
β (SQLite file)β β (Edge replicas) β
ββββββββ¬ββββββββ ββββββββββ¬ββββββββββ
β β
βΌ βΌ
ββββββββββββββββ ββββββββββββββββββββ
β npm run dev β β Cloudflare Pages β
β Vite dev β βββββββββΆβ + Edge Functions β
β server β Deploy β (SvelteKit SSR) β
ββββββββββββββββ ββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββ
β Global CDN β
β (300+ edges) β
ββββββββββββββββββββπ Performance Characteristics β
| Aspect | Local Dev | Production | Notes |
|---|---|---|---|
| Latency | ~10-50ms | ~50-200ms | Depends on user location |
| Cold Start | Instant | <50ms | Edge functions warm |
| Database | SQLite file | Replicated SQLite | Read: fast, Write: eventual |
| SSR Time | ~10ms | ~5-20ms | Edge compute is fast |
| Bundle Size | N/A (dev) | ~50-100KB | Code-split per route |
π― Scalability Limits β
| Resource | Free Tier | Paid Tier | When to Scale |
|---|---|---|---|
| D1 Storage | 500MB | $0.75/GB-month | > 400MB data |
| D1 Reads | 5M/day | Unlimited | > 4M queries/day |
| D1 Writes | 100K/day | Unlimited | > 80K writes/day |
| Workers | 100K/day | $0.50/M | > 90K requests/day |
| Build Time | - | - | > 100 pages β ISR |
When to Consider Migration:
- Database > 5GB β PostgreSQL (Neon, Supabase)
- Complex queries β Add caching layer
- Real-time needs β WebSockets + Durable Objects
π Next Steps β
- Setup Guide - Start building
- Data Patterns - Learn best practices
- Performance - Optimize your app
- Security - Harden production