You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: documentation/docs/06-runtime/05-hydratable.md
+13-55Lines changed: 13 additions & 55 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
title: Hydratable data
3
3
---
4
4
5
-
In Svelte, when you want to render asynchonous content data on the server, you can simply `await` it. This is great! However, it comes with a major pitall: when hydrating that content on the client, Svelte has to redo the asynchronous work, which blocks hydration for however long it takes:
5
+
In Svelte, when you want to render asynchonous content data on the server, you can simply `await` it. This is great! However, it comes with a pitall: when hydrating that content on the client, Svelte has to redo the asynchronous work, which blocks hydration for however long it takes:
6
6
7
7
```svelte
8
8
<script>
@@ -17,7 +17,7 @@ In Svelte, when you want to render asynchonous content data on the server, you c
17
17
<h1>{user.name}</h1>
18
18
```
19
19
20
-
That's silly, though. If we've already done the hard work of getting the data on the server, we don't want to get it again during hydration on the client. `hydratable` is a low-level API build to solve this problem. You probably won't need this very often -- it will probably be used behind the scenes by whatever datafetching library you use. For example, it powers [remote functions in SvelteKit](/docs/kit/remote-functions).
20
+
That's silly, though. If we've already done the hard work of getting the data on the server, we don't want to get it again during hydration on the client. `hydratable` is a low-level API built to solve this problem. You probably won't need this very often -- it will be used behind the scenes by whatever datafetching library you use. For example, it powers [remote functions in SvelteKit](/docs/kit/remote-functions).
21
21
22
22
To fix the example above:
23
23
@@ -30,7 +30,7 @@ To fix the example above:
30
30
// it with the provided key and baking it into the `head` content. During hydration, it will
31
31
// look for the serialized version, returning it instead of running `getUser`. After hydration
32
32
// is done, if it's called again, it'll simply invoke `getUser`.
If you're a library author, be sure to prefix the keys of your `hydratable` values with the name of your library so that your keys don't conflict with other libraries.
47
47
48
-
## Imperative API
48
+
## Serialization
49
49
50
-
If you're writing a library with separate server and client exports, it may be more convenient to use the imperative API:
51
-
52
-
```ts
53
-
import { hydratable } from'svelte';
54
-
55
-
const value =hydratable.get('foo'); // only works on the client
56
-
const hasValue =hydratable.has('foo');
57
-
hydratable.set('foo', 'whatever value you want'); // only works on the server
58
-
```
59
-
60
-
## Custom serialization
61
-
62
-
By default, Svelte uses [`devalue`](https://npmjs.com/package/devalue) to serialize your data on the server so that decoding it on the client requires no dependencies. If you need to serialize additional things not covered by `devalue`, you can provide your own transport mechanisms by writing custom `encode` and `decode` methods.
63
-
64
-
### `encode`
65
-
66
-
Encode receives a value and outputs _the JavaScript code necessary to create that value on the client_. For example, Svelte's built-in encoder looks like this:
`decode` accepts whatever the JavaScript that `encode` outputs resolves to, and returns whatever the final value from `hydratable` should be.
84
-
85
-
### Usage
86
-
87
-
When using the isomorphic API, you must provide either `encode` or `decode`, depending on the environment. This enables your bundler to treeshake the unneeded code during your build:
50
+
All data returned from a `hydratable` function must be serializable. Not to fear, though -- this doesn't mean you're limited to JSON! Svelte uses [`devalue`](https://npmjs.com/package/devalue) for serialization, which means it can serialize all sorts of things, including `Map`, `Set`, `URL`, and `BigInt`. Check the documentation page for a full list. In addition to these, thanks to some Svelte magic, you can also fearlessly use promises:
0 commit comments