svelte icon indicating copy to clipboard operation
svelte copied to clipboard

fix: thunkify deriveds on the server

Open paoloricciuti opened this issue 10 months ago • 7 comments

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:

  1. we re-execute possibly expensive deriveds on access
  2. 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:, or docs:.
  • [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 test and lint the project with pnpm lint

paoloricciuti avatar Jan 10 '25 20:01 paoloricciuti

🦋 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

changeset-bot[bot] avatar Jan 10 '25 20:01 changeset-bot[bot]

preview: https://svelte-dev-git-preview-svelte-14977-svelte.vercel.app/

this is an automated message

Rich-Harris avatar Jan 10 '25 20:01 Rich-Harris

Playground

pnpm add https://pkg.pr.new/svelte@14977

github-actions[bot] avatar Jan 10 '25 20:01 github-actions[bot]

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.

Rich-Harris avatar Apr 17 '25 20:04 Rich-Harris

Preview: https://svelte-dev-git-preview-svelte-14977-svelte.vercel.app/

svelte-docs-bot[bot] avatar Apr 17 '25 20:04 svelte-docs-bot[bot]

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.

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.

paoloricciuti avatar Apr 17 '25 20:04 paoloricciuti

any news regarding this @paoloricciuti ? (was cool to meet you in JSNation 😄)

quentinderoubaix avatar Jun 16 '25 09:06 quentinderoubaix