Skip to content

fix: compute the service worker's immutable manifest list like the client's - #16531

Merged
Rich-Harris merged 5 commits into
sveltejs:version-3from
Nic-Polumeyv:fix-sw-manifest-immutable
Jul 29, 2026
Merged

fix: compute the service worker's immutable manifest list like the client's#16531
Rich-Harris merged 5 commits into
sveltejs:version-3from
Nic-Polumeyv:fix-sw-manifest-immutable

Conversation

@Nic-Polumeyv

@Nic-Polumeyv Nic-Polumeyv commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

#16372 added the _app/immutable filter when computing $app/manifest's immutable, but the serviceWorker environment kept the unfiltered file set it inherited from $service-worker's build. That copy includes _app/manifest.js, whose filename never changes, so a service worker that caches immutable per the docs serves the previous deployment's manifest after a redeploy. Both lists are now computed by one helper; the bundleStrategy: 'inline' special case is subsumed by its existence check.

The truthiness checks on css/assets make the helper robust to the full range of Vite's optional css?: string[] field, so a hypothetical css: null entry is skipped cleanly instead of crashing the build.

The client-side list was also computed before the bundleStrategy: 'inline' deletions it was supposed to reflect, so the page's immutable included the deleted bundle and stylesheet while the service worker's, computed after them, did not. The inlined files are now tracked directly and excluded everywhere, instead of checking the filesystem after the fact.

_app/manifest.js is no longer precached, so an offline-first app that imports $app/manifest in client code only has it cached once a page has fetched it. The precached copy was guaranteed stale after the next deploy anyway; moving the chunk to assets, as floated in #16372, would give such apps a correct offline copy.

@pkg-svelte-dev

pkg-svelte-dev Bot commented Jul 26, 2026

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from 61fc26f:

pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/61fc26fa61d9384f206e32264f0f239788779401

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/kit/pr/16531

Note

This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed.

@changeset-bot

changeset-bot Bot commented Jul 26, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 61fc26f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit 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

@Nic-Polumeyv

Nic-Polumeyv commented Jul 26, 2026

Copy link
Copy Markdown
Contributor Author

The imperative shape of collect_immutable is deliberate. Plain loops over the manifest avoid the intermediate arrays an Object.values/flatMap/filter chain allocates per entry, and deduplicating candidates before the filesystem pass stats each shared file once. Measured against the chain version on the basics app's build output this comes out about 17% faster (1.25ms vs 1.5ms per call, nothing dramatic in absolute terms).

I spent a little too long with testing and ai making sure it was the most performant structure. It's not unnecessary boilerplate.

@Nic-Polumeyv Nic-Polumeyv changed the title fix: only include _app/immutable files in the service worker's $app/manifest fix: compute the service worker's immutable manifest list like the client's Jul 26, 2026
Nic-Polumeyv and others added 2 commits July 26, 2026 01:36
The inline deletions are tracked directly instead of checked through the
filesystem, so the helper no longer touches the disk at all.
@Rich-Harris

Copy link
Copy Markdown
Member

/autofix

@Rich-Harris Rich-Harris left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you

@Rich-Harris
Rich-Harris merged commit e6591a0 into sveltejs:version-3 Jul 29, 2026
17 of 18 checks passed
Rich-Harris pushed a commit that referenced this pull request Jul 29, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/adapter-vercel@7.0.0-next.4

### Major Changes

- breaking: remove support for edge and Node 20 runtimes
([#16520](#16520))

### Patch Changes

- chore: bump `@vercel/nft` dependency
([#16522](#16522))
- Updated dependencies
[[`6942ddb`](6942ddb),
[`68137d4`](68137d4),
[`15dc603`](15dc603),
[`a4f1521`](a4f1521),
[`629b45d`](629b45d),
[`7a7833a`](7a7833a),
[`e6591a0`](e6591a0),
[`7a7833a`](7a7833a),
[`b196a39`](b196a39),
[`66bf343`](66bf343),
[`4bde76b`](4bde76b),
[`d9f05cb`](d9f05cb),
[`40efca1`](40efca1),
[`8ef5548`](8ef5548),
[`9efb8f2`](9efb8f2),
[`6a670dc`](6a670dc),
[`3416dcc`](3416dcc),
[`6850fa5`](6850fa5),
[`e6591a0`](e6591a0),
[`688bead`](688bead),
[`b596610`](b596610),
[`0f26c13`](0f26c13),
[`110a3db`](110a3db),
[`665d467`](665d467),
[`9c8c60c`](9c8c60c)]:
  - @sveltejs/kit@3.0.0-next.13
## @sveltejs/kit@3.0.0-next.13

### Major Changes

- breaking: replace the `noScroll` and `keepFocus` options of `goto`
with a single `reset` option, and the `data-sveltekit-noscroll` and
`data-sveltekit-keepfocus` attributes with `data-sveltekit-reset`
([#16558](#16558))

- breaking: deprecate `error(status, {...})` in favour of `error(status,
message, {...})` ([#16540](#16540))

### Minor Changes

- feat: add shallow routing to `goto` and deprecate `pushState` and
`replaceState` ([#16449](#16449))

- feat: preserve page state set through `goto(..., { state,
persistState: true })` across reloads
([#16449](#16449))

### Patch Changes

- chore: deduplicate repeated CSP directive handling
([#16498](#16498))

- fix: avoid Vite dev server reload on initial page request
([#16553](#16553))

- fix: don't set a `null` `accept-language` header on internal `fetch`
sub-requests when the incoming request has none
([#16527](#16527))

- fix: correctly detect prerendered paths in server `fetch` when
`paths.base` is set
([#16525](#16525))

- fix: don't duplicate remote modules in the generated manifest
([#16532](#16532))

- fix: exclude inlined files from the page's `$app/manifest` immutable
list ([#16531](#16531))

- perf: avoid quadratic remote form issue merging
([#16493](#16493))

- fix: don't attempt to serialize fetch responses when the request body
is not a string or TypedArray
([#16501](#16501))

- fix: read the error status of `App.Error` in the `prerender` and
`query.live` remote functions
([#16529](#16529))

- fix: propagate errors from prerendered remote responses instead of
re-running the function
([#16535](#16535))

- fix: respect the status returned from `handleError` on the fallback
error page served to error-page sub-requests
([#16528](#16528))

- fix: skip unnecessary `version.json` checks if `updated.current` is
already `true` ([#16518](#16518))

- fix: allow generation of $app/tsconfig without TypeScript installed
([#16534](#16534))

- perf: use a `Set` to check element ids when validating fragment links
during prerendering
([#16494](#16494))

- fix: only include `_app/immutable` files in `$app/manifest`'s
`immutable` in the service worker
([#16531](#16531))

- fix: log errors caught by the Vite dev server handler
([#16550](#16550))

- fix: resolve `root` per instance of the SvelteKit Vite plugin
([#16513](#16513))

- fix: ignore path casing differences when warning about overridden Vite
config on Windows ([#16545](#16545))

- fix: preserve the current URL search parameters when submitting a
remote form without JavaScript
([#16373](#16373))

- fix: treeshake prerendered remote functions in the right chunks
([#16533](#16533))

- fix: error during development if the adapter does not support
instrumentation and it exists
([#16548](#16548))
## @sveltejs/adapter-netlify@7.0.0-next.5

### Patch Changes

- chore: replace @netlify/functions with @netlify/types for the Context
type ([#16542](#16542))
- Updated dependencies
[[`6942ddb`](6942ddb),
[`68137d4`](68137d4),
[`15dc603`](15dc603),
[`a4f1521`](a4f1521),
[`629b45d`](629b45d),
[`7a7833a`](7a7833a),
[`e6591a0`](e6591a0),
[`7a7833a`](7a7833a),
[`b196a39`](b196a39),
[`66bf343`](66bf343),
[`4bde76b`](4bde76b),
[`d9f05cb`](d9f05cb),
[`40efca1`](40efca1),
[`8ef5548`](8ef5548),
[`9efb8f2`](9efb8f2),
[`6a670dc`](6a670dc),
[`3416dcc`](3416dcc),
[`6850fa5`](6850fa5),
[`e6591a0`](e6591a0),
[`688bead`](688bead),
[`b596610`](b596610),
[`0f26c13`](0f26c13),
[`110a3db`](110a3db),
[`665d467`](665d467),
[`9c8c60c`](9c8c60c)]:
  - @sveltejs/kit@3.0.0-next.13
## @sveltejs/adapter-static@4.0.0-next.2

### Patch Changes

- fix: match adapter-vercel's prerendered redirect handling when
deploying to Vercel
([#16497](#16497))
- Updated dependencies
[[`6942ddb`](6942ddb),
[`68137d4`](68137d4),
[`15dc603`](15dc603),
[`a4f1521`](a4f1521),
[`629b45d`](629b45d),
[`7a7833a`](7a7833a),
[`e6591a0`](e6591a0),
[`7a7833a`](7a7833a),
[`b196a39`](b196a39),
[`66bf343`](66bf343),
[`4bde76b`](4bde76b),
[`d9f05cb`](d9f05cb),
[`40efca1`](40efca1),
[`8ef5548`](8ef5548),
[`9efb8f2`](9efb8f2),
[`6a670dc`](6a670dc),
[`3416dcc`](3416dcc),
[`6850fa5`](6850fa5),
[`e6591a0`](e6591a0),
[`688bead`](688bead),
[`b596610`](b596610),
[`0f26c13`](0f26c13),
[`110a3db`](110a3db),
[`665d467`](665d467),
[`9c8c60c`](9c8c60c)]:
  - @sveltejs/kit@3.0.0-next.13

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@Nic-Polumeyv
Nic-Polumeyv deleted the fix-sw-manifest-immutable branch July 30, 2026 22:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants