Rendering & Architecture Hydration & Serialisation
15. Hydration Engines & Data Serialisation
Examine the client hydration lifecycle, partial/island hydration models, streaming SSR, and safe complex data serialisation with devalue.
hydration-serialization.ts
typescript
// Complex Data Serialisation across the Network Boundaryimport { stringify, parse } from 'devalue';// Objects containing Dates, Sets, Maps, BigInts, and Circular Referencesconst complexPayload = { sessionId: 9007199254740993n, // BigInt timestamp: new Date('2026-09-10T10:00:00Z'), activeTags: new Set(['web-standards', 'nitro', 'bun']), metricCache: new Map([['us-east', 14.2], ['eu-central', 8.6]])};// devalue encodes complex JS types safely without data lossconst serialised = stringify(complexPayload);const reconstructed = parse(serialised);console.log(reconstructed.sessionId === 9007199254740993n); // trueconsole.log(reconstructed.activeTags instanceof Set); // trueHydration Engines & Data Serialisation
Passing state across the server-to-client boundary requires specialised serialisers like devalue or SuperJSON that preserve complex JavaScript data structures.
- Standard JSON Limitations:
JSON.stringifyconvertsDateobjects to strings, losesSet/Mapprototypes, and throws onBigInt. devalueEngine: Powers SvelteKit and Nuxt payload transfers by serialising 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 Serialisation Protocol Comparison devalue vs JSON
Serialised 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 serialisation)