Fresh 2.3: Zero JS Standard, View Transitions und WebSocket-Support

Fresh 2.3: Zero JS Standard, View Transitions und WebSocket-Support

lschvn

„Zero JavaScript by default" ist seit dem ersten Tag das Versprechen von Fresh. Das ehrliche Kleingedruckte: Selbst eine Seite ohne Islands und ohne Partials lieferte einen kleinen Client-Entry aus, je nach Projekt zwischen 14 und 22 KB gzipped. Kein Skandal, aber eben auch nicht null. Fresh 2.3, angekündigt im Deno-Blog, schließt diese Lücke endgültig.

Diesmal wirklich null

Es gibt nichts zu konfigurieren. Nach dem Upgrade prüft Fresh beim Rendern, ob eine Seite tatsächlich Islands oder Partials verwendet. Nutzt sie keines von beidem, enthält die Antwort keine Script-Tags, keine Module-Preload-Header und kein Client-Bundle. Eine Marketing-Seite, ein Blogpost, eine Docs-Seite: reines HTML über die Leitung.

Wer es selbst sehen will: Upgrade einspielen und auf einer statischen Route den Netzwerk-Tab öffnen. Der Unterschied lässt sich leicht messen, wo 2.2 auf jeder Seite den Client-Entry lud, lädt 2.3 nichts, bis die erste Island auftaucht.

View Transitions mit einem Attribut

Client-seitige Navigation gab es in Fresh schon über das Partials-System (f-client-nav). Version 2.3 verdrahtet damit die View-Transitions-API des Browsers. Aktiviert wird per Attribut, direkt neben dem, das man ohnehin schon hat:

<body f-client-nav f-view-transition>

Partielle Navigationen werden jetzt in document.startViewTransition() verpackt, die Animation steuert man in purem CSS:

::view-transition-old(root) {
  animation: fade-out 150ms ease-out;
}
::view-transition-new(root) {
  animation: fade-in 150ms ease-in;
}

Chrome 111+, Edge 111+ und Safari 18+ animieren nativ. Firefox noch nicht, dort fällt Fresh einfach auf ein normales Partial-Update zurück. Früh einzusteigen kostet also nichts.

WebSockets ohne Beiboot-Server

Bisher bedeutete Echtzeit in einer Fresh-App entweder handverdrahtetes Deno.upgradeWebSocket oder einen separaten Server. Fresh 2.3 macht WebSockets zum festen Bestandteil. Die schnellste Variante lebt auf der App-Instanz:

app.ws("/ws", {
  open(ctx) {
    console.log("Client verbunden");
  },
  message(ctx, event) {
    ctx.send(`Echo: ${event.data}`);
  },
  close(ctx) {
    console.log("Client weg");
  },
});

Dateibasierte Routen bekommen dieselbe Fähigkeit über ctx.upgrade() in einem GET-Handler. Und wer Verbindungen selbst verwalten will, etwa ein Chatraum, der ein Set von Sockets hält, ruft ctx.upgrade() ohne Handler-Objekt auf und bekommt das rohe WebSocket-Objekt samt Lebenszyklus in die eigene Hand.

Der Rest des Releases

Drei kleinere Neuerungen sind wissenswert:

  • CSP-Nonces. Fresh kann jetzt pro Request einen Nonce in die ausgelieferten Scripts und Styles injizieren, damit wird eine strikte Content-Security-Policy praktikabel, ohne Hashes von Hand zu pflegen.
  • Temporal in Islands. Alle acht Temporal-Typen lassen sich als Island-Props übergeben und korrekt über die Server/Client-Grenze serialisieren, nützlich, jetzt wo Temporal sich über die Runtimes hinweg stabilisiert.
  • Prerendering. Eine Route mit prerender: true markieren, und Fresh rendert sie beim Build zu statischem HTML; dynamische Routen können ihre Pfade aufzählen. Zusammen mit Zero-JS-Seiten wird Fresh nebenbei ein fähiger Static-Site-Generator.

Fresh 2.3 ist ein deno update entfernt, neue Projekte entstehen mit Deno 2.7+ über deno create. Für ein Framework, dessen ganze Identität Zurückhaltung ist, ist das der Release, in dem die Zurückhaltung aufhört, ungefähr zu sein.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Deno bringt `deno desktop` mit: WEF-basierter Unterbefehl für eigenständige Desktop-Apps mit Deno.BrowserWindow, vereinten DevTools und Cross-Compile für macOS, Windows und Linux
runtimes

Deno bringt `deno desktop` mit: WEF-basierter Unterbefehl für eigenständige Desktop-Apps mit Deno.BrowserWindow, vereinten DevTools und Cross-Compile für macOS, Windows und Linux

Deno hat `deno desktop` am 16. Juni 2026 zusammengeführt (PR #33441), einen neuen Unterbefehl, der ein Deno-Projekt in eine eigenständige Desktop-Anwendung verwandelt. Das Feature liefert das WEF-Backend (standardmäßig CEF, plus WebView und rohem winit), die Deno.BrowserWindow-API für Fenster-Lebenszyklus und native Events, Framework-Auto-Erkennung für Next, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start und Vite SSR, einen CDP-Multiplexer, der beide V8-Isolate in einer einzigen DevTools-Session anzeigt, einen Auto-Updater mit bsdiff-Patches und cross-kompilierte .app/.dmg/.exe/.AppImage-Outputs. Drei kleinere Deno-PRs landeten am selben Morgen: `deno link`/`unlink`, `deno test --shard` und ein fetch `request_builder_hook` für `x-deno-fetch-token`/`cdn-loop`-Header.
Nitro v3.0.260603-beta: Custom Framework Commands und defaultPreset-Config
runtimes

Nitro v3.0.260603-beta: Custom Framework Commands und defaultPreset-Config

Der neueste Nitro-Beta fügt Support für benutzerdefinierte Framework-Preview- und Deploy-Befehle hinzu, führt die defaultPreset-Config-Option ein und behebt einen Edge-Case beim Type-Stripping.
Nuxt 4.4: Vue Router v5, Typisierte Layout-Props und 28x Schnelleres Dev-Routing
css

Nuxt 4.4: Vue Router v5, Typisierte Layout-Props und 28x Schnelleres Dev-Routing

Das neueste Nuxt-Release bringt große Verbesserungen unter der Haube: Vue Router v5, eine Custom-useFetch-Factory-API, ein Accessibility-Announcer-Composable und eine Routing-System-Migration, die Hot-Module-Replacement drastisch beschleunigt.

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.