Repository navigation
fix(bundled-dev): stop hmr propagation at modules that are no longer imported - #23839
Conversation
…imported When an update makes a module lose its last importer, the module stays in the runtime. A later update that reached it found no HMR boundary and reloaded the page. This made `delete file should not break hmr` flaky when the watcher sent its two edits as two updates. The client now records such modules after each patch. Propagation stops at them, and they are removed from the module cache, so importing them again runs them fresh. The test now checks the exact text, so it waits for its own changes and does not leak them into the next test. Claude-Session: https://claude.ai/code/session_01DN7XjL6voKkohAagErPdR9
…ps only at orphans Claude-Session: https://claude.ai/code/session_01DN7XjL6voKkohAagErPdR9
| }, | ||
| ) | ||
|
|
||
| test('delete file should not break hmr', async () => { |
There was a problem hiding this comment.
Why the tests were flaky
delete file should not break hmr changes two files together:
// index.js
import { displayCount } from './re-export.js' // → from './display.js'
// display.js
export const displayCount = (count) => `count is ${count}` // → `count is ${count}!`The watcher does not always report the two changes together. Sometimes they arrive as one HMR update, sometimes as two. Rolldown's file debouncer sends each event on its own, and a poll scan can also run between the two writes.
- One update: the client walks the old graph,
display.js → re-export.js → index.js.index.jsaccepts itself, so the update is applied, and the test passes. - Two updates: update 1 makes
index.jsimportdisplay.jsdirectly. Nothing importsre-export.jsany more, but it is still listed as an importer ofdisplay.js. Update 2 (display.js) walks up to both importers:re-export.jshas no importer, so the client reportsno hmr boundary foundand reloads the page. The count goes back to 1, and the test fails.
Locally, every failing run had the two changes split into two updates, and every passing run had them in one.
import.meta.hot?.accept failed because of the test before it. The delete test checked its last steps with toMatch, which also matches the old text ('count is 3' matches 'count is 3!'). So the test could end before its last change was handled, and that change then reached the next test.
There was a problem hiding this comment.
- delete file should not break hmr: https://github.com/vitejs/vite/actions/runs/39244590997/job/118033392583
- import.meta.hot?.accept: https://github.com/vitejs/vite/actions/runs/39207790462/job/117914359589
| // remove unused file. Plain dev reloads the page, because the file is now | ||
| // an entry point in its module graph. Bundled dev keeps the page as is: the | ||
| // file is no longer in the bundle, so nothing changes. |
There was a problem hiding this comment.
I wrote this previously but it turned out to be a mistake. Previously, bundled-dev didn't keep the page as is and the reason it was kept is because of the one update bug I mentioned in the comment section above so it sometime passes the test case (i.e. keeping the page as-is).
| return { | ||
| type: 'full-reload', | ||
| reason: `no hmr boundary found for module \`${id}\``, | ||
| } |
There was a problem hiding this comment.
instead of using this.orphans, I wonder if we can change this to
if (isEntrypoint) { /* full-reload */ } else { /* no-op */ }
There was a problem hiding this comment.
Yes! That's what I wanted to do. But this would cause a breaking change to the current Vite user as it requires Rolldown to expose the new entry data in runtime. Once we expose the entry data in next minor, we can update this line above: this.orphans.has(id) && !this.hasExecutedImporter(id) and the line you suggested as well.
There was a problem hiding this comment.
Hmmm, maybe we can do this in the current Rolldown version, as exposing entry data is not a breaking change to the current Vite user and Vite user that uses the latest Vite which includes this PR can leverage the data from Rolldown.
There was a problem hiding this comment.
I will start implementing the fix in Rolldown right now. But I'm not sure if we're going to hold this flaky issue until Rolldown gets released and updated.
There was a problem hiding this comment.
Ah, right, we need a new Rolldown patch release. Let's merge this one first 👍
There was a problem hiding this comment.
I will get the Rolldown patch released before tomorrow's scheduled release so we can update the Vite implementation.
| datasource | package | from | to | | ---------- | ------- | ----- | ----- | | npm | vite | 8.3.0 | 8.3.5 | ## [v8.3.5](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-835-2026-10-21-small) ##### Bug Fixes - **build:** handle missing chunk import maps ([#23777](vitejs/vite#23777)) ([8d7623d](vitejs/vite@8d7623d)) - **build:** include preload dependencies to chunk import map hashing ([#23793](vitejs/vite#23793)) ([4d16e7c](vitejs/vite@4d16e7c)) - **bundled-dev:** apply `server.origin` to asset URLs ([#23683](vitejs/vite#23683)) ([52ba877](vitejs/vite@52ba877)) - **bundled-dev:** declare utf-8 charset in fallback page ([#23846](vitejs/vite#23846)) ([197daf6](vitejs/vite@197daf6)) - **bundled-dev:** ignore build.chunkImportMap ([#23685](vitejs/vite#23685)) ([cfe917d](vitejs/vite@cfe917d)) - **bundled-dev:** include user `import.meta.env.*` defines in the `import.meta.env` object ([#23713](vitejs/vite#23713)) ([6019aa7](vitejs/vite@6019aa7)) - **bundled-dev:** map forwarded error stacks through the bundle source maps ([#23741](vitejs/vite#23741)) ([11fe1e4](vitejs/vite@11fe1e4)) - **bundled-dev:** normalize served output files ([#23684](vitejs/vite#23684)) ([df4e02c](vitejs/vite@df4e02c)) - **bundled-dev:** stop hmr propagation at modules that are no longer imported ([#23839](vitejs/vite#23839)) ([7471e8c](vitejs/vite@7471e8c)) - **css:** don't fail on a literal `%` in `url()` ([#23676](vitejs/vite#23676)) ([50b382d](vitejs/vite@50b382d)) - **deps:** update all non-major dependencies ([#23731](vitejs/vite#23731)) ([cf80aa5](vitejs/vite@cf80aa5)) - **deps:** update all non-major dependencies ([#23826](vitejs/vite#23826)) ([77d8373](vitejs/vite@77d8373)) - **deps:** update rolldown-related dependencies ([#23733](vitejs/vite#23733)) ([43f0d05](vitejs/vite@43f0d05)) - **deps:** update rolldown-related dependencies ([#23827](vitejs/vite#23827)) ([c2e0418](vitejs/vite@c2e0418)) - **optimizer:** fall back to yarn.lock for lockfile hash ([#23667](vitejs/vite#23667)) ([f206096](vitejs/vite@f206096)) - **optimizer:** scan `oxc.jsxInject` imports ([#23758](vitejs/vite#23758)) ([38f3cb4](vitejs/vite@38f3cb4)) - **optimizer:** skip patches dir check for yarn.lock fallback ([#23725](vitejs/vite#23725)) ([8e890e1](vitejs/vite@8e890e1)) - **optimizer:** skip patches dir hash for nub lockfile ([#23761](vitejs/vite#23761)) ([a7d5696](vitejs/vite@a7d5696)) - **resolve:** support subpath imports with multiple `#` ([#23631](vitejs/vite#23631)) ([0d86b34](vitejs/vite@0d86b34)) - **resolve:** update resolve.exports to 2.0.4 ([#23739](vitejs/vite#23739)) ([4ea708a](vitejs/vite@4ea708a)) - **server:** handle socket errors on upgrade requests not taken by the HMR server ([#23728](vitejs/vite#23728)) ([c2c9ef4](vitejs/vite@c2c9ef4)) - **server:** only strip base when path matches a full segment ([#23641](vitejs/vite#23641)) ([3dfde87](vitejs/vite@3dfde87)) ##### Performance Improvements - **ssr:** extract inline source maps without a regexp ([#23775](vitejs/vite#23775)) ([6a02780](vitejs/vite@6a02780)) ##### Miscellaneous Chores - migrate to Oxlint ([#23746](vitejs/vite#23746)) ([5b73935](vitejs/vite@5b73935)) ##### Code Refactoring - **deps:** replace `@vercel/detect-agent` with `std-env` ([#23744](vitejs/vite#23744)) ([ce4293f](vitejs/vite@ce4293f)) - **dev:** consolidate moduleURL to file path utilities ([#23828](vitejs/vite#23828)) ([df7b40e](vitejs/vite@df7b40e)) - **dev:** separate import resolution from URL conversion ([#23791](vitejs/vite#23791)) ([6116689](vitejs/vite@6116689)) - **dev:** share ModuleURL and BrowserURL conversions ([#23790](vitejs/vite#23790)) ([446954c](vitejs/vite@446954c)) - **dev:** use ModuleURLs throughout HTML transforms ([#23815](vitejs/vite#23815)) ([a162990](vitejs/vite@a162990)) ## [v8.3.4](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-834-2026-10-08-small) ##### Features - **bundled-dev:** support `import.meta.hot.acceptExports` ([#23463](vitejs/vite#23463)) ([bc0f21c](vitejs/vite@bc0f21c)) ##### Bug Fixes - avoid mutating hmr defaults (fix [#23575](vitejs/vite#23575)) ([#23576](vitejs/vite#23576)) ([574d5e3](vitejs/vite@574d5e3)) - **build:** correct preloads when chunkImportMap is enabled with non-root base ([#23698](vitejs/vite#23698)) ([2a8c0f0](vitejs/vite@2a8c0f0)) - **build:** wait for in-flight stylesheets in preload helper (fix [#23652](vitejs/vite#23652)) ([#23662](vitejs/vite#23662)) ([036b745](vitejs/vite@036b745)) - **bundled-dev:** serve `/@vite/client` and stub `@vite/env` ([#23664](vitejs/vite#23664)) ([5afc5a8](vitejs/vite@5afc5a8)) - **client:** skip rewriting unchanged adopted styles ([#23697](vitejs/vite#23697)) ([fa71469](vitejs/vite@fa71469)) - **css:** resolve imported preprocessors from their file path with lightningcss ([#23688](vitejs/vite#23688)) ([cf52011](vitejs/vite@cf52011)) - **deps:** update all non-major dependencies ([#23648](vitejs/vite#23648)) ([8a4c19c](vitejs/vite@8a4c19c)) - **deps:** update rolldown-related dependencies ([#23649](vitejs/vite#23649)) ([794516d](vitejs/vite@794516d)) - **dev:** a restart requested during a restart used to be dropped (fix [#23392](vitejs/vite#23392)) ([#23484](vitejs/vite#23484)) ([70d56ea](vitejs/vite@70d56ea)) - don't treat modules ending with js-like query as js ([#23687](vitejs/vite#23687)) ([fcb6f12](vitejs/vite@fcb6f12)) - **html:** avoid adding filesystem root to watcher ([#23689](vitejs/vite#23689)) ([3a7f2ae](vitejs/vite@3a7f2ae)) - **html:** skip caching CSS of chunks in a cycle (fix [#23628](vitejs/vite#23628)) ([#23636](vitejs/vite#23636)) ([15d82f7](vitejs/vite@15d82f7)) - **optimizer:** scan deep imports with custom extensions ([#23678](vitejs/vite#23678)) ([8579189](vitejs/vite@8579189)) - remove input option unescaping for now ([#23694](vitejs/vite#23694)) ([facc2fb](vitejs/vite@facc2fb)) - **server:** match static aliases on path boundaries ([#23643](vitejs/vite#23643)) ([b28db28](vitejs/vite@b28db28)) - **watcher:** normalize file before root check in `ensureWatchedFile` ([#23673](vitejs/vite#23673)) ([12bb28c](vitejs/vite@12bb28c)) ##### Performance Improvements - **module-runner:** skip cloning call sites that have no source map ([#23646](vitejs/vite#23646)) ([3d67486](vitejs/vite@3d67486)) ##### Code Refactoring - **bundled-dev:** import CSS HMR helpers from `/@vite/client` ([#23674](vitejs/vite#23674)) ([182f5b2](vitejs/vite@182f5b2)) ## [v8.3.3](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-833-2026-10-06-small) ##### Bug Fixes - **deps:** update launch-editor to v2.14.2 ([#23654](vitejs/vite#23654)) ([22fd1d5](vitejs/vite@22fd1d5)) - **html:** filename passed to transformIndexHtml should not include queries ([#23653](vitejs/vite#23653)) ([7dafd8e](vitejs/vite@7dafd8e)) - **server:** check `fs.serve` for `?vite-wasm-instance` ([#23655](vitejs/vite#23655)) ([ba8b7ab](vitejs/vite@ba8b7ab)) - **server:** store ids to `safeModulePaths` rather than URLs ([#23656](vitejs/vite#23656)) ([c3e06f9](vitejs/vite@c3e06f9)) ## [v8.3.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-832-2026-10-01-small) ##### Bug Fixes - **build:** preload CSS correctly when `renderBuiltUrl` returns URLs with queries ([#23611](vitejs/vite#23611)) ([64e0a21](vitejs/vite@64e0a21)) - **bundled-dev:** serve lazy chunk sourcemaps ([#23026](vitejs/vite#23026)) ([eb7aa9a](vitejs/vite@eb7aa9a)) - **bundled-dev:** serve the rolldown runtime from the installed rolldown ([#23568](vitejs/vite#23568)) ([bc598a6](vitejs/vite@bc598a6)) - **deps:** update all non-major dependencies ([#23601](vitejs/vite#23601)) ([9944fa6](vitejs/vite@9944fa6)) - **deps:** update rolldown-related dependencies ([#23602](vitejs/vite#23602)) ([88c1741](vitejs/vite@88c1741)) - **html:** resolve percent-encoded srcset urls ([#23609](vitejs/vite#23609)) ([53f1ce7](vitejs/vite@53f1ce7)) - limit size of object and array printing via `forwardConsole` ([#23565](vitejs/vite#23565)) ([e64a587](vitejs/vite@e64a587)) - merge `build.rolldownOptions.output.minify` correctly ([#23536](vitejs/vite#23536)) ([bba3bb8](vitejs/vite@bba3bb8)) - **optimize-deps:** avoid "unsupported" warnings for browser:false mappings ([#23590](vitejs/vite#23590)) ([5e4b9ca](vitejs/vite@5e4b9ca)) - **optimizer:** preserve excluded optional peer require fallbacks ([#23600](vitejs/vite#23600)) ([a2bd6fa](vitejs/vite@a2bd6fa)) - pass queries to `renderBuiltUrl` ([#23586](vitejs/vite#23586)) ([744269e](vitejs/vite@744269e)) - **server:** handle file watcher errors without crashing ([#23503](vitejs/vite#23503)) ([6894f5c](vitejs/vite@6894f5c)) - **server:** release previous environments after initialization ([#23499](vitejs/vite#23499)) ([5a3a010](vitejs/vite@5a3a010)) - **ssr:** encode whitespace in module runner sourceURL ([#23513](vitejs/vite#23513)) ([bbc8812](vitejs/vite@bbc8812)) - **worker:** align worker urls in client and server when using terser ([#23614](vitejs/vite#23614)) ([24bd331](vitejs/vite@24bd331)) ##### Performance Improvements - avoid encoding intermediate source maps ([#23461](vitejs/vite#23461)) ([89574f6](vitejs/vite@89574f6)) - **build:** avoid quadratic link scan in the preload helper ([#23510](vitejs/vite#23510)) ([cf5c028](vitejs/vite@cf5c028)) - only register time middleware when debug logging is enabled ([#23621](vitejs/vite#23621)) ([94d0080](vitejs/vite@94d0080)) ##### Documentation - fix dead og-image PNG links in vite6/vite7 changelog entries ([#23594](vitejs/vite#23594)) ([1929b4c](vitejs/vite@1929b4c)) ##### Miscellaneous Chores - **deps:** update vitest monorepo to v5 ([#23604](vitejs/vite#23604)) ([24339f4](vitejs/vite@24339f4)) ##### Code Refactoring - use `tinyexec` instead of `cross-spawn` ([#23583](vitejs/vite#23583)) ([db915e5](vitejs/vite@db915e5)) ##### Tests - **bundled-dev:** accept a rolldown dev runtime with no helper imports ([#23606](vitejs/vite#23606)) ([634745d](vitejs/vite@634745d)) ## [v8.3.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-831-2026-09-24-small) ##### Bug Fixes - **deps:** update all non-major dependencies ([#23482](vitejs/vite#23482)) ([3c752c8](vitejs/vite@3c752c8)) - **deps:** update all non-major dependencies ([#23537](vitejs/vite#23537)) ([e8990c4](vitejs/vite@e8990c4)) - **deps:** update rolldown-related dependencies ([#23483](vitejs/vite#23483)) ([9aecbbf](vitejs/vite@9aecbbf)) - handle `server.ws: false` in mergeConfig ([#23511](vitejs/vite#23511)) ([f68c0d5](vitejs/vite@f68c0d5)) - merge `build.rolldownOptions.output.comments` correctly ([#23514](vitejs/vite#23514)) ([4aba8d8](vitejs/vite@4aba8d8)) - **optimizer:** don't skip imports whose binding starts with type ([#23540](vitejs/vite#23540)) ([39330f4](vitejs/vite@39330f4)) - **optimizer:** resolve pending discovered dep processing on close before init ([#23567](vitejs/vite#23567)) ([5f89433](vitejs/vite@5f89433)) - **server:** avoid reinitializing watcher when adding file after server close ([#23572](vitejs/vite#23572)) ([6f831f9](vitejs/vite@6f831f9)) - **sourcemap:** skip URL source roots when injecting sources content ([#23519](vitejs/vite#23519)) ([04fc30a](vitejs/vite@04fc30a)) ##### Miscellaneous Chores - merge prereleases in changelog ([#23466](vitejs/vite#23466)) ([99bd9d1](vitejs/vite@99bd9d1)) - **optimizer:** add debug log when waiting for dep before init ([#23566](vitejs/vite#23566)) ([63567c7](vitejs/vite@63567c7)) - update `optimizeDeps.include` comment ([#23489](vitejs/vite#23489)) ([6a84c72](vitejs/vite@6a84c72)) ##### Code Refactoring - assets regexp use non-capture ([#23491](vitejs/vite#23491)) ([f4b4431](vitejs/vite@f4b4431)) - remove duplicate configurations ([#23532](vitejs/vite#23532)) ([9abd99b](vitejs/vite@9abd99b)) - replace `find` with `some` ([#23554](vitejs/vite#23554)) ([af7cdf6](vitejs/vite@af7cdf6))
| datasource | package | from | to | | ---------- | ------- | ----- | ----- | | npm | vite | 8.3.0 | 8.3.5 | ## [v8.3.5](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-835-2026-10-21-small) ##### Bug Fixes - **build:** handle missing chunk import maps ([#23777](vitejs/vite#23777)) ([8d7623d](vitejs/vite@8d7623d)) - **build:** include preload dependencies to chunk import map hashing ([#23793](vitejs/vite#23793)) ([4d16e7c](vitejs/vite@4d16e7c)) - **bundled-dev:** apply `server.origin` to asset URLs ([#23683](vitejs/vite#23683)) ([52ba877](vitejs/vite@52ba877)) - **bundled-dev:** declare utf-8 charset in fallback page ([#23846](vitejs/vite#23846)) ([197daf6](vitejs/vite@197daf6)) - **bundled-dev:** ignore build.chunkImportMap ([#23685](vitejs/vite#23685)) ([cfe917d](vitejs/vite@cfe917d)) - **bundled-dev:** include user `import.meta.env.*` defines in the `import.meta.env` object ([#23713](vitejs/vite#23713)) ([6019aa7](vitejs/vite@6019aa7)) - **bundled-dev:** map forwarded error stacks through the bundle source maps ([#23741](vitejs/vite#23741)) ([11fe1e4](vitejs/vite@11fe1e4)) - **bundled-dev:** normalize served output files ([#23684](vitejs/vite#23684)) ([df4e02c](vitejs/vite@df4e02c)) - **bundled-dev:** stop hmr propagation at modules that are no longer imported ([#23839](vitejs/vite#23839)) ([7471e8c](vitejs/vite@7471e8c)) - **css:** don't fail on a literal `%` in `url()` ([#23676](vitejs/vite#23676)) ([50b382d](vitejs/vite@50b382d)) - **deps:** update all non-major dependencies ([#23731](vitejs/vite#23731)) ([cf80aa5](vitejs/vite@cf80aa5)) - **deps:** update all non-major dependencies ([#23826](vitejs/vite#23826)) ([77d8373](vitejs/vite@77d8373)) - **deps:** update rolldown-related dependencies ([#23733](vitejs/vite#23733)) ([43f0d05](vitejs/vite@43f0d05)) - **deps:** update rolldown-related dependencies ([#23827](vitejs/vite#23827)) ([c2e0418](vitejs/vite@c2e0418)) - **optimizer:** fall back to yarn.lock for lockfile hash ([#23667](vitejs/vite#23667)) ([f206096](vitejs/vite@f206096)) - **optimizer:** scan `oxc.jsxInject` imports ([#23758](vitejs/vite#23758)) ([38f3cb4](vitejs/vite@38f3cb4)) - **optimizer:** skip patches dir check for yarn.lock fallback ([#23725](vitejs/vite#23725)) ([8e890e1](vitejs/vite@8e890e1)) - **optimizer:** skip patches dir hash for nub lockfile ([#23761](vitejs/vite#23761)) ([a7d5696](vitejs/vite@a7d5696)) - **resolve:** support subpath imports with multiple `#` ([#23631](vitejs/vite#23631)) ([0d86b34](vitejs/vite@0d86b34)) - **resolve:** update resolve.exports to 2.0.4 ([#23739](vitejs/vite#23739)) ([4ea708a](vitejs/vite@4ea708a)) - **server:** handle socket errors on upgrade requests not taken by the HMR server ([#23728](vitejs/vite#23728)) ([c2c9ef4](vitejs/vite@c2c9ef4)) - **server:** only strip base when path matches a full segment ([#23641](vitejs/vite#23641)) ([3dfde87](vitejs/vite@3dfde87)) ##### Performance Improvements - **ssr:** extract inline source maps without a regexp ([#23775](vitejs/vite#23775)) ([6a02780](vitejs/vite@6a02780)) ##### Miscellaneous Chores - migrate to Oxlint ([#23746](vitejs/vite#23746)) ([5b73935](vitejs/vite@5b73935)) ##### Code Refactoring - **deps:** replace `@vercel/detect-agent` with `std-env` ([#23744](vitejs/vite#23744)) ([ce4293f](vitejs/vite@ce4293f)) - **dev:** consolidate moduleURL to file path utilities ([#23828](vitejs/vite#23828)) ([df7b40e](vitejs/vite@df7b40e)) - **dev:** separate import resolution from URL conversion ([#23791](vitejs/vite#23791)) ([6116689](vitejs/vite@6116689)) - **dev:** share ModuleURL and BrowserURL conversions ([#23790](vitejs/vite#23790)) ([446954c](vitejs/vite@446954c)) - **dev:** use ModuleURLs throughout HTML transforms ([#23815](vitejs/vite#23815)) ([a162990](vitejs/vite@a162990)) ## [v8.3.4](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-834-2026-10-08-small) ##### Features - **bundled-dev:** support `import.meta.hot.acceptExports` ([#23463](vitejs/vite#23463)) ([bc0f21c](vitejs/vite@bc0f21c)) ##### Bug Fixes - avoid mutating hmr defaults (fix [#23575](vitejs/vite#23575)) ([#23576](vitejs/vite#23576)) ([574d5e3](vitejs/vite@574d5e3)) - **build:** correct preloads when chunkImportMap is enabled with non-root base ([#23698](vitejs/vite#23698)) ([2a8c0f0](vitejs/vite@2a8c0f0)) - **build:** wait for in-flight stylesheets in preload helper (fix [#23652](vitejs/vite#23652)) ([#23662](vitejs/vite#23662)) ([036b745](vitejs/vite@036b745)) - **bundled-dev:** serve `/@vite/client` and stub `@vite/env` ([#23664](vitejs/vite#23664)) ([5afc5a8](vitejs/vite@5afc5a8)) - **client:** skip rewriting unchanged adopted styles ([#23697](vitejs/vite#23697)) ([fa71469](vitejs/vite@fa71469)) - **css:** resolve imported preprocessors from their file path with lightningcss ([#23688](vitejs/vite#23688)) ([cf52011](vitejs/vite@cf52011)) - **deps:** update all non-major dependencies ([#23648](vitejs/vite#23648)) ([8a4c19c](vitejs/vite@8a4c19c)) - **deps:** update rolldown-related dependencies ([#23649](vitejs/vite#23649)) ([794516d](vitejs/vite@794516d)) - **dev:** a restart requested during a restart used to be dropped (fix [#23392](vitejs/vite#23392)) ([#23484](vitejs/vite#23484)) ([70d56ea](vitejs/vite@70d56ea)) - don't treat modules ending with js-like query as js ([#23687](vitejs/vite#23687)) ([fcb6f12](vitejs/vite@fcb6f12)) - **html:** avoid adding filesystem root to watcher ([#23689](vitejs/vite#23689)) ([3a7f2ae](vitejs/vite@3a7f2ae)) - **html:** skip caching CSS of chunks in a cycle (fix [#23628](vitejs/vite#23628)) ([#23636](vitejs/vite#23636)) ([15d82f7](vitejs/vite@15d82f7)) - **optimizer:** scan deep imports with custom extensions ([#23678](vitejs/vite#23678)) ([8579189](vitejs/vite@8579189)) - remove input option unescaping for now ([#23694](vitejs/vite#23694)) ([facc2fb](vitejs/vite@facc2fb)) - **server:** match static aliases on path boundaries ([#23643](vitejs/vite#23643)) ([b28db28](vitejs/vite@b28db28)) - **watcher:** normalize file before root check in `ensureWatchedFile` ([#23673](vitejs/vite#23673)) ([12bb28c](vitejs/vite@12bb28c)) ##### Performance Improvements - **module-runner:** skip cloning call sites that have no source map ([#23646](vitejs/vite#23646)) ([3d67486](vitejs/vite@3d67486)) ##### Code Refactoring - **bundled-dev:** import CSS HMR helpers from `/@vite/client` ([#23674](vitejs/vite#23674)) ([182f5b2](vitejs/vite@182f5b2)) ## [v8.3.3](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-833-2026-10-06-small) ##### Bug Fixes - **deps:** update launch-editor to v2.14.2 ([#23654](vitejs/vite#23654)) ([22fd1d5](vitejs/vite@22fd1d5)) - **html:** filename passed to transformIndexHtml should not include queries ([#23653](vitejs/vite#23653)) ([7dafd8e](vitejs/vite@7dafd8e)) - **server:** check `fs.serve` for `?vite-wasm-instance` ([#23655](vitejs/vite#23655)) ([ba8b7ab](vitejs/vite@ba8b7ab)) - **server:** store ids to `safeModulePaths` rather than URLs ([#23656](vitejs/vite#23656)) ([c3e06f9](vitejs/vite@c3e06f9)) ## [v8.3.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-832-2026-10-01-small) ##### Bug Fixes - **build:** preload CSS correctly when `renderBuiltUrl` returns URLs with queries ([#23611](vitejs/vite#23611)) ([64e0a21](vitejs/vite@64e0a21)) - **bundled-dev:** serve lazy chunk sourcemaps ([#23026](vitejs/vite#23026)) ([eb7aa9a](vitejs/vite@eb7aa9a)) - **bundled-dev:** serve the rolldown runtime from the installed rolldown ([#23568](vitejs/vite#23568)) ([bc598a6](vitejs/vite@bc598a6)) - **deps:** update all non-major dependencies ([#23601](vitejs/vite#23601)) ([9944fa6](vitejs/vite@9944fa6)) - **deps:** update rolldown-related dependencies ([#23602](vitejs/vite#23602)) ([88c1741](vitejs/vite@88c1741)) - **html:** resolve percent-encoded srcset urls ([#23609](vitejs/vite#23609)) ([53f1ce7](vitejs/vite@53f1ce7)) - limit size of object and array printing via `forwardConsole` ([#23565](vitejs/vite#23565)) ([e64a587](vitejs/vite@e64a587)) - merge `build.rolldownOptions.output.minify` correctly ([#23536](vitejs/vite#23536)) ([bba3bb8](vitejs/vite@bba3bb8)) - **optimize-deps:** avoid "unsupported" warnings for browser:false mappings ([#23590](vitejs/vite#23590)) ([5e4b9ca](vitejs/vite@5e4b9ca)) - **optimizer:** preserve excluded optional peer require fallbacks ([#23600](vitejs/vite#23600)) ([a2bd6fa](vitejs/vite@a2bd6fa)) - pass queries to `renderBuiltUrl` ([#23586](vitejs/vite#23586)) ([744269e](vitejs/vite@744269e)) - **server:** handle file watcher errors without crashing ([#23503](vitejs/vite#23503)) ([6894f5c](vitejs/vite@6894f5c)) - **server:** release previous environments after initialization ([#23499](vitejs/vite#23499)) ([5a3a010](vitejs/vite@5a3a010)) - **ssr:** encode whitespace in module runner sourceURL ([#23513](vitejs/vite#23513)) ([bbc8812](vitejs/vite@bbc8812)) - **worker:** align worker urls in client and server when using terser ([#23614](vitejs/vite#23614)) ([24bd331](vitejs/vite@24bd331)) ##### Performance Improvements - avoid encoding intermediate source maps ([#23461](vitejs/vite#23461)) ([89574f6](vitejs/vite@89574f6)) - **build:** avoid quadratic link scan in the preload helper ([#23510](vitejs/vite#23510)) ([cf5c028](vitejs/vite@cf5c028)) - only register time middleware when debug logging is enabled ([#23621](vitejs/vite#23621)) ([94d0080](vitejs/vite@94d0080)) ##### Documentation - fix dead og-image PNG links in vite6/vite7 changelog entries ([#23594](vitejs/vite#23594)) ([1929b4c](vitejs/vite@1929b4c)) ##### Miscellaneous Chores - **deps:** update vitest monorepo to v5 ([#23604](vitejs/vite#23604)) ([24339f4](vitejs/vite@24339f4)) ##### Code Refactoring - use `tinyexec` instead of `cross-spawn` ([#23583](vitejs/vite#23583)) ([db915e5](vitejs/vite@db915e5)) ##### Tests - **bundled-dev:** accept a rolldown dev runtime with no helper imports ([#23606](vitejs/vite#23606)) ([634745d](vitejs/vite@634745d)) ## [v8.3.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-831-2026-09-24-small) ##### Bug Fixes - **deps:** update all non-major dependencies ([#23482](vitejs/vite#23482)) ([3c752c8](vitejs/vite@3c752c8)) - **deps:** update all non-major dependencies ([#23537](vitejs/vite#23537)) ([e8990c4](vitejs/vite@e8990c4)) - **deps:** update rolldown-related dependencies ([#23483](vitejs/vite#23483)) ([9aecbbf](vitejs/vite@9aecbbf)) - handle `server.ws: false` in mergeConfig ([#23511](vitejs/vite#23511)) ([f68c0d5](vitejs/vite@f68c0d5)) - merge `build.rolldownOptions.output.comments` correctly ([#23514](vitejs/vite#23514)) ([4aba8d8](vitejs/vite@4aba8d8)) - **optimizer:** don't skip imports whose binding starts with type ([#23540](vitejs/vite#23540)) ([39330f4](vitejs/vite@39330f4)) - **optimizer:** resolve pending discovered dep processing on close before init ([#23567](vitejs/vite#23567)) ([5f89433](vitejs/vite@5f89433)) - **server:** avoid reinitializing watcher when adding file after server close ([#23572](vitejs/vite#23572)) ([6f831f9](vitejs/vite@6f831f9)) - **sourcemap:** skip URL source roots when injecting sources content ([#23519](vitejs/vite#23519)) ([04fc30a](vitejs/vite@04fc30a)) ##### Miscellaneous Chores - merge prereleases in changelog ([#23466](vitejs/vite#23466)) ([99bd9d1](vitejs/vite@99bd9d1)) - **optimizer:** add debug log when waiting for dep before init ([#23566](vitejs/vite#23566)) ([63567c7](vitejs/vite@63567c7)) - update `optimizeDeps.include` comment ([#23489](vitejs/vite#23489)) ([6a84c72](vitejs/vite@6a84c72)) ##### Code Refactoring - assets regexp use non-capture ([#23491](vitejs/vite#23491)) ([f4b4431](vitejs/vite@f4b4431)) - remove duplicate configurations ([#23532](vitejs/vite#23532)) ([9abd99b](vitejs/vite@9abd99b)) - replace `find` with `some` ([#23554](vitejs/vite#23554)) ([af7cdf6](vitejs/vite@af7cdf6))
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [vite](https://vite.dev) ([source](https://github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`8.3.4` → `8.3.5`](https://renovatebot.com/diffs/npm/vite/8.3.4/8.3.5) |  |  | --- ### Release Notes <details> <summary>vitejs/vite (vite)</summary> ### [`v8.3.5`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-835-2026-10-21-small) [Compare Source](vitejs/vite@v8.3.4...v8.3.5) ##### Bug Fixes - **build:** handle missing chunk import maps ([#​23777](vitejs/vite#23777)) ([8d7623d](vitejs/vite@8d7623d)) - **build:** include preload dependencies to chunk import map hashing ([#​23793](vitejs/vite#23793)) ([4d16e7c](vitejs/vite@4d16e7c)) - **bundled-dev:** apply `server.origin` to asset URLs ([#​23683](vitejs/vite#23683)) ([52ba877](vitejs/vite@52ba877)) - **bundled-dev:** declare utf-8 charset in fallback page ([#​23846](vitejs/vite#23846)) ([197daf6](vitejs/vite@197daf6)) - **bundled-dev:** ignore build.chunkImportMap ([#​23685](vitejs/vite#23685)) ([cfe917d](vitejs/vite@cfe917d)) - **bundled-dev:** include user `import.meta.env.*` defines in the `import.meta.env` object ([#​23713](vitejs/vite#23713)) ([6019aa7](vitejs/vite@6019aa7)) - **bundled-dev:** map forwarded error stacks through the bundle source maps ([#​23741](vitejs/vite#23741)) ([11fe1e4](vitejs/vite@11fe1e4)) - **bundled-dev:** normalize served output files ([#​23684](vitejs/vite#23684)) ([df4e02c](vitejs/vite@df4e02c)) - **bundled-dev:** stop hmr propagation at modules that are no longer imported ([#​23839](vitejs/vite#23839)) ([7471e8c](vitejs/vite@7471e8c)) - **css:** don't fail on a literal `%` in `url()` ([#​23676](vitejs/vite#23676)) ([50b382d](vitejs/vite@50b382d)) - **deps:** update all non-major dependencies ([#​23731](vitejs/vite#23731)) ([cf80aa5](vitejs/vite@cf80aa5)) - **deps:** update all non-major dependencies ([#​23826](vitejs/vite#23826)) ([77d8373](vitejs/vite@77d8373)) - **deps:** update rolldown-related dependencies ([#​23733](vitejs/vite#23733)) ([43f0d05](vitejs/vite@43f0d05)) - **deps:** update rolldown-related dependencies ([#​23827](vitejs/vite#23827)) ([c2e0418](vitejs/vite@c2e0418)) - **optimizer:** fall back to yarn.lock for lockfile hash ([#​23667](vitejs/vite#23667)) ([f206096](vitejs/vite@f206096)) - **optimizer:** scan `oxc.jsxInject` imports ([#​23758](vitejs/vite#23758)) ([38f3cb4](vitejs/vite@38f3cb4)) - **optimizer:** skip patches dir check for yarn.lock fallback ([#​23725](vitejs/vite#23725)) ([8e890e1](vitejs/vite@8e890e1)) - **optimizer:** skip patches dir hash for nub lockfile ([#​23761](vitejs/vite#23761)) ([a7d5696](vitejs/vite@a7d5696)) - **resolve:** support subpath imports with multiple `#` ([#​23631](vitejs/vite#23631)) ([0d86b34](vitejs/vite@0d86b34)) - **resolve:** update resolve.exports to 2.0.4 ([#​23739](vitejs/vite#23739)) ([4ea708a](vitejs/vite@4ea708a)) - **server:** handle socket errors on upgrade requests not taken by the HMR server ([#​23728](vitejs/vite#23728)) ([c2c9ef4](vitejs/vite@c2c9ef4)) - **server:** only strip base when path matches a full segment ([#​23641](vitejs/vite#23641)) ([3dfde87](vitejs/vite@3dfde87)) ##### Performance Improvements - **ssr:** extract inline source maps without a regexp ([#​23775](vitejs/vite#23775)) ([6a02780](vitejs/vite@6a02780)) ##### Miscellaneous Chores - migrate to Oxlint ([#​23746](vitejs/vite#23746)) ([5b73935](vitejs/vite@5b73935)) ##### Code Refactoring - **deps:** replace `@vercel/detect-agent` with `std-env` ([#​23744](vitejs/vite#23744)) ([ce4293f](vitejs/vite@ce4293f)) - **dev:** consolidate moduleURL to file path utilities ([#​23828](vitejs/vite#23828)) ([df7b40e](vitejs/vite@df7b40e)) - **dev:** separate import resolution from URL conversion ([#​23791](vitejs/vite#23791)) ([6116689](vitejs/vite@6116689)) - **dev:** share ModuleURL and BrowserURL conversions ([#​23790](vitejs/vite#23790)) ([446954c](vitejs/vite@446954c)) - **dev:** use ModuleURLs throughout HTML transforms ([#​23815](vitejs/vite#23815)) ([a162990](vitejs/vite@a162990)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODEuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [vite](https://vite.dev) ([source](https://github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`8.3.4` → `8.3.5`](https://renovatebot.com/diffs/npm/vite/8.3.4/8.3.5) |  |  | --- ### Release Notes <details> <summary>vitejs/vite (vite)</summary> ### [`v8.3.5`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-835-2026-10-21-small) [Compare Source](vitejs/vite@v8.3.4...v8.3.5) ##### Bug Fixes - **build:** handle missing chunk import maps ([#​23777](vitejs/vite#23777)) ([8d7623d](vitejs/vite@8d7623d)) - **build:** include preload dependencies to chunk import map hashing ([#​23793](vitejs/vite#23793)) ([4d16e7c](vitejs/vite@4d16e7c)) - **bundled-dev:** apply `server.origin` to asset URLs ([#​23683](vitejs/vite#23683)) ([52ba877](vitejs/vite@52ba877)) - **bundled-dev:** declare utf-8 charset in fallback page ([#​23846](vitejs/vite#23846)) ([197daf6](vitejs/vite@197daf6)) - **bundled-dev:** ignore build.chunkImportMap ([#​23685](vitejs/vite#23685)) ([cfe917d](vitejs/vite@cfe917d)) - **bundled-dev:** include user `import.meta.env.*` defines in the `import.meta.env` object ([#​23713](vitejs/vite#23713)) ([6019aa7](vitejs/vite@6019aa7)) - **bundled-dev:** map forwarded error stacks through the bundle source maps ([#​23741](vitejs/vite#23741)) ([11fe1e4](vitejs/vite@11fe1e4)) - **bundled-dev:** normalize served output files ([#​23684](vitejs/vite#23684)) ([df4e02c](vitejs/vite@df4e02c)) - **bundled-dev:** stop hmr propagation at modules that are no longer imported ([#​23839](vitejs/vite#23839)) ([7471e8c](vitejs/vite@7471e8c)) - **css:** don't fail on a literal `%` in `url()` ([#​23676](vitejs/vite#23676)) ([50b382d](vitejs/vite@50b382d)) - **deps:** update all non-major dependencies ([#​23731](vitejs/vite#23731)) ([cf80aa5](vitejs/vite@cf80aa5)) - **deps:** update all non-major dependencies ([#​23826](vitejs/vite#23826)) ([77d8373](vitejs/vite@77d8373)) - **deps:** update rolldown-related dependencies ([#​23733](vitejs/vite#23733)) ([43f0d05](vitejs/vite@43f0d05)) - **deps:** update rolldown-related dependencies ([#​23827](vitejs/vite#23827)) ([c2e0418](vitejs/vite@c2e0418)) - **optimizer:** fall back to yarn.lock for lockfile hash ([#​23667](vitejs/vite#23667)) ([f206096](vitejs/vite@f206096)) - **optimizer:** scan `oxc.jsxInject` imports ([#​23758](vitejs/vite#23758)) ([38f3cb4](vitejs/vite@38f3cb4)) - **optimizer:** skip patches dir check for yarn.lock fallback ([#​23725](vitejs/vite#23725)) ([8e890e1](vitejs/vite@8e890e1)) - **optimizer:** skip patches dir hash for nub lockfile ([#​23761](vitejs/vite#23761)) ([a7d5696](vitejs/vite@a7d5696)) - **resolve:** support subpath imports with multiple `#` ([#​23631](vitejs/vite#23631)) ([0d86b34](vitejs/vite@0d86b34)) - **resolve:** update resolve.exports to 2.0.4 ([#​23739](vitejs/vite#23739)) ([4ea708a](vitejs/vite@4ea708a)) - **server:** handle socket errors on upgrade requests not taken by the HMR server ([#​23728](vitejs/vite#23728)) ([c2c9ef4](vitejs/vite@c2c9ef4)) - **server:** only strip base when path matches a full segment ([#​23641](vitejs/vite#23641)) ([3dfde87](vitejs/vite@3dfde87)) ##### Performance Improvements - **ssr:** extract inline source maps without a regexp ([#​23775](vitejs/vite#23775)) ([6a02780](vitejs/vite@6a02780)) ##### Miscellaneous Chores - migrate to Oxlint ([#​23746](vitejs/vite#23746)) ([5b73935](vitejs/vite@5b73935)) ##### Code Refactoring - **deps:** replace `@vercel/detect-agent` with `std-env` ([#​23744](vitejs/vite#23744)) ([ce4293f](vitejs/vite@ce4293f)) - **dev:** consolidate moduleURL to file path utilities ([#​23828](vitejs/vite#23828)) ([df7b40e](vitejs/vite@df7b40e)) - **dev:** separate import resolution from URL conversion ([#​23791](vitejs/vite#23791)) ([6116689](vitejs/vite@6116689)) - **dev:** share ModuleURL and BrowserURL conversions ([#​23790](vitejs/vite#23790)) ([446954c](vitejs/vite@446954c)) - **dev:** use ModuleURLs throughout HTML transforms ([#​23815](vitejs/vite#23815)) ([a162990](vitejs/vite@a162990)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODEuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Stop HMR propagation at modules that are no longer imported in the module graph.
A module that ran in the page, and whose importers all removed their import of it, is an orphan. Previously, if a module whose importer is an orphan and it's not a hot boundary, then it reloads the page because there's no boundary can be found.
This also fixes the flaky test case on
main.