Hono

Ultraschnelles Web-Framework auf Web Standards - laeuft auf Cloudflare Workers, Deno, Bun, Node.js und AWS Lambda

TL;DR

Einzeiler: Hono ist ein ultraschnelles Web-Framework basierend auf Web Standards - läuft überall von Cloudflare Workers bis Node.js.

Kernstärken:

  • Ultraschnell - RegExpRouter mit nahezu null Allokationen
  • Multi-Runtime - Cloudflare, Deno, Bun, Node, AWS Lambda
  • Winzige Größe - hono/tiny Preset unter 12kB, keine Abhängigkeiten
  • TypeScript-first - vollständige Typinferenz für Routen

Core Concepts

Concept 1: Context Object

Jeder Handler erhält einen Context mit Request/Response-Utilities:

app.get('/users/:id', (c) => {
  const id = c.req.param('id')        // Pfad-Parameter
  const name = c.req.query('name')    // Query-String
  const token = c.req.header('Authorization')

  return c.json({ id, name })  // JSON-Antwort
})

Concept 2: Middleware Stack

Middleware läuft vor/nach Handlern:

import { logger } from 'hono/logger'
import { cors } from 'hono/cors'
import { jwt } from 'hono/jwt'

app.use('*', logger())
app.use('/api/*', cors())
app.use('/api/*', jwt({ secret: process.env.JWT_SECRET }))

// Benutzerdefinierte Middleware
app.use('*', async (c, next) => {
  const start = Date.now()
  await next()
  console.log(`${c.req.method} ${c.req.path} - ${Date.now() - start}ms`)
})

Concept 3: Type-Safe Routing

Vollständige TypeScript-Inferenz von Routen bis zum Client:

const routes = app
  .get('/users', (c) => c.json([{ id: 1, name: 'John' }]))
  .post('/users', async (c) => {
    const body = await c.req.json()
    return c.json(body, 201)
  })

// Typsicherer Client
import { hc } from 'hono/client'
const client = hc<typeof routes>('http://localhost:3000')
const res = await client.users.$get()  // Vollständig typisiert!

Quick Start

Create Project

npm create hono@latest my-app
cd my-app

Create index.ts

import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.json({ message: 'Hello Hono!' }))

export default app

Run

npm run dev
# Öffnen Sie http://localhost:3000

Gotchas

Route groups and composition

const api = new Hono()
api.get('/users', (c) => c.json([]))
api.post('/users', (c) => c.json({}))

const admin = new Hono()
admin.use('*', authMiddleware)
admin.get('/stats', (c) => c.json({}))

app.route('/api', api)
app.route('/admin', admin)

Validation with Zod

import { zValidator } from '@hono/zod-validator'
import { z } from 'zod'

const schema = z.object({
  name: z.string().min(1),
  email: z.string().email(),
})

app.post('/users',
  zValidator('json', schema),
  (c) => {
    const data = c.req.valid('json')  // Typisiert!
    return c.json(data, 201)
  }
)

Different response types

// JSON
c.json({ key: 'value' })

// Text
c.text('Hello')

// HTML
c.html('<h1>Hello</h1>')

// Mit Status
c.json({ error: 'Not found' }, 404)

// Weiterleitung
c.redirect('/new-location')

Deploy to different runtimes

// Cloudflare Workers
export default app

// Node.js
import { serve } from '@hono/node-server'
serve(app)

// Bun
export default app  // Funktioniert nativ

// Deno
Deno.serve(app.fetch)

When to Use

Ideal für:

  • Edge/Serverless-APIs
  • Cloudflare Workers-Projekte
  • Multi-Runtime-Anwendungen
  • Teams, die Express-ähnliche DX mit moderner Performance wollen

Nicht ideal für:

  • Full-Stack-Apps mit SSR (verwenden Sie Next.js/Nuxt)
  • Projekte, die schwere ORM-Integration benötigen
  • Teams ohne TypeScript-Erfahrung

Vergleich:

FeatureHonoExpressFastify
Größe~12kB~200kB~2MB
Edge-SupportNativNeinBegrenzt
TypeScriptErstklassigAdd-onGut
PerformanceUltraschnellMittelSchnell

Next Steps

Cheatsheet

MusterCode
GET-Routeapp.get('/path', handler)
POST-Routeapp.post('/path', handler)
Pfad-Parameterc.req.param('id')
Query-Parameterc.req.query('name')
JSON-Bodyawait c.req.json()
JSON-Antwortc.json({ data })
Routengruppeapp.route('/api', apiRoutes)
Middlewareapp.use('*', middleware)
ValidierungzValidator('json', schema)