Hydration & Serialization

24. Hydration Engines & Data Serialization

Examine the client hydration lifecycle, partial/island hydration models, streaming SSR, and safe complex data serialization with devalue.

hydration-serialization.ts
// Complex Data Serialization across the Network Boundary
import { stringify, parse } from 'devalue';

// Objects containing Dates, Sets, Maps, BigInts, and Circular References
const complexPayload = {
  sessionId: 9007199254740993n, // BigInt
  timestamp: new Date('2026-09-10T10:00:00Z'),
  activeTags: new Set(['svelte5', 'nitro', 'bun']),
  metricCache: new Map([['us-east', 14.2], ['eu-central', 8.6]])
};

// devalue encodes complex JS types safely without data loss
const serialized = stringify(complexPayload);
const reconstructed = parse(serialized);

console.log(reconstructed.sessionId === 9007199254740993n); // true
console.log(reconstructed.activeTags instanceof Set);       // true

Hydration Engines & Data Serialization

Passing state across the server-to-client boundary requires specialized serializers like devalue or SuperJSON that preserve complex JavaScript data structures.

  • Standard JSON Limitations: JSON.stringify converts Date objects to strings, loses Set / Map prototypes, and throws on BigInt.
  • devalue Engine: Powers SvelteKit and Nuxt payload transfers by serializing circular references, custom prototypes, and native ECMAScript data structures safely.
  • Hydration Mismatch Prevention: Guarantees identical client state recreation on the initial load without re-triggering network fetches.
SSR Serialization Protocol Comparison devalue vs JSON
Serialized Wire Format:
[{"timestamp":1,"bigInt":2,"tags":3},new Date(1789034400000),9007199254740993n,new Set([4,5]),"svelte5","nitro"]
Type Retention Fidelity:

Zero loss: Exact JavaScript type fidelity preserved, handles circular references and undefined

Assessment:

High fidelity (Standard SvelteKit & Nuxt SSR serialization)