svelte
svelte copied to clipboard
fix: thunkify deriveds on the server
Closes #14954
I took a shot with the idea of thunkify every derived on the server to make them "work" in case of reassignment. As pointed out by @Rich-Harris this have some downside:
- we re-execute possibly expensive deriveds on access
- it's still more work than just accessing a variable
But I think regardless of the solution we will go with we will probably need functions in some way so this PR can be a good start.
I got 90% there in 10 minutes and then faced a big problem with destructured deriveds. Since we want every destructured identifier to be a function the only way i thought of is to do something like this.
let stuff = $state({ foo: true, bar: [1, 2, {baz: 'baz'}] });
let { foo, bar: [a, b, { baz }]} = $derived(stuff);
let stuff = {
foo: true,
bar: [1, 2, { baz: 'baz' }]
};
let {
foo: foo_1,
bar: [a_1, b_1, { baz: baz_1 }]
} = stuff,
foo = () => foo_1,
a = () => a_1,
b = () => b_1,
baz = () => baz_1;
it's a bit more generated code but it works fine.
Again, this is a proposal, don't know if this the actual direction we want to go but even if it's not it could be a good base.
Before submitting the PR, please make sure you do the following
- [x] It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
- [x] Prefix your PR title with
feat:,fix:,chore:, ordocs:. - [x] This message body should clearly illustrate what problems it solves.
- [x] Ideally, include a test that fails without this PR but passes with it.
- [x] If this PR changes code within
packages/svelte/src, add a changeset (npx changeset).
Tests and linting
- [x] Run the tests with
pnpm testand lint the project withpnpm lint
🦋 Changeset detected
Latest commit: b1a6b8cbdaa23314066dbc36480eecd9d85620b8
The changes in this PR will be included in the next version bump.
This PR includes changesets to release 1 package
| Name | Type |
|---|---|
| svelte | Patch |
Not sure what this means? Click here to learn what changesets are.
Click here if you're a maintainer who wants to add another changeset to this PR
preview: https://svelte-dev-git-preview-svelte-14977-svelte.vercel.app/
this is an automated message
Brought this up to speed with main but there's a problem: now that deriveds are writable, this transformation results in a syntax error (foo?.() = blah is invalid).
Not really sure how best to resolve that so for now I'm not going to try.
Preview: https://svelte-dev-git-preview-svelte-14977-svelte.vercel.app/
Brought this up to speed with
mainbut there's a problem: now that deriveds are writable, this transformation results in a syntax error (foo?.() = blahis invalid).Not really sure how best to resolve that so for now I'm not going to try.
Yeah i planned to get back to this after the writable deriveds PR but wanted to check if that's the road we want to go first. I can work on this if we want.
any news regarding this @paoloricciuti ? (was cool to meet you in JSNation 😄)