Skip to content

fix(hmr): avoid infinite loop happening with hot.invalidate in circular deps #19870

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

sapphi-red
Copy link
Member

@sapphi-red sapphi-red commented Apr 16, 2025

Description

If all modules in the circular import calls import.meta.hot.invalidate, Vite will try updating the module endlessly.
This PR fixes that by passing where the first import.meta.hot.invalidate call happened. If there was a circular import.meta.hot.invalidate call, Vite will now run the full reload.

I didn't encounter this in past. Maybe #19793 causes it to happen more often.

The test case is based on #11268.

close #16709

@sapphi-red sapphi-red added feat: hmr p3-minor-bug An edge case that only affects very specific usage (priority) labels Apr 16, 2025
@patak-dev
Copy link
Member

/ecosystem-ci run

Copy link

pkg-pr-new bot commented Apr 16, 2025

Open in StackBlitz

npm i https://pkg.pr.new/vite@19870

commit: ffd22bd

@vite-ecosystem-ci
Copy link

📝 Ran ecosystem CI on ffd22bd: Open

suite result latest scheduled
laravel failure failure
vike success failure
storybook success failure
vite-plugin-svelte success failure
vite-plugin-react failure success
vite-environment-examples success failure

astro, analogjs, histoire, marko, nuxt, react-router, previewjs, rakkas, quasar, ladle, vite-setup-catalogue, vuepress, vite-plugin-pwa, vite-plugin-vue, qwik, vitest, vitepress, vite-plugin-react-swc, sveltekit, vite-plugin-cloudflare, waku, unocss

@sapphi-red
Copy link
Member Author

I've taken a look at the react plugin failure. It's probably a flaky fail (vitejs/vite-plugin-react#459).

@sapphi-red sapphi-red merged commit d4ee5e8 into vitejs:main Apr 16, 2025
20 checks passed
@sapphi-red sapphi-red deleted the fix/import-hot-invalidate-in-circular-deps branch April 16, 2025 07:48
renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Apr 17, 2025
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | vite    | 6.2.1 | 6.3.1 |


## [v6.3.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small631-2025-04-17-small)

-   fix: avoid using `Promise.allSettled` in preload function ([#19805](vitejs/vite#19805)) ([35c7f35](vitejs/vite@35c7f35)), closes [#19805](vitejs/vite#19805)
-   fix: backward compat for internal plugin `transform` calls ([#19878](vitejs/vite#19878)) ([a152b7c](vitejs/vite@a152b7c)), closes [#19878](vitejs/vite#19878)


## [v6.3.0](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#630-2025-04-16)

-   fix(hmr): avoid infinite loop happening with `hot.invalidate` in circular deps ([#19870](vitejs/vite#19870)) ([d4ee5e8](vitejs/vite@d4ee5e8)), closes [#19870](vitejs/vite#19870)
-   fix(preview): use host url to open browser ([#19836](vitejs/vite#19836)) ([5003434](vitejs/vite@5003434)), closes [#19836](vitejs/vite#19836)


## [v6.2.6](https://github.com/vitejs/vite/releases/tag/v6.2.6)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.6/packages/vite/CHANGELOG.md) for details.


## [v6.2.5](https://github.com/vitejs/vite/releases/tag/v6.2.5)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.5/packages/vite/CHANGELOG.md) for details.


## [v6.2.4](https://github.com/vitejs/vite/releases/tag/v6.2.4)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/CHANGELOG.md) for details.


## [v6.2.3](https://github.com/vitejs/vite/releases/tag/v6.2.3)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.3/packages/vite/CHANGELOG.md) for details.


## [v6.2.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small622-2025-03-14-small)

-   fix: await client buildStart on top level buildStart ([#19624](vitejs/vite#19624)) ([b31faab](vitejs/vite@b31faab)), closes [#19624](vitejs/vite#19624)
-   fix(css): inline css correctly for double quote use strict ([#19590](vitejs/vite#19590)) ([d0aa833](vitejs/vite@d0aa833)), closes [#19590](vitejs/vite#19590)
-   fix(deps): update all non-major dependencies ([#19613](vitejs/vite#19613)) ([363d691](vitejs/vite@363d691)), closes [#19613](vitejs/vite#19613)
-   fix(indexHtml): ensure correct URL when querying module graph ([#19601](vitejs/vite#19601)) ([dc5395a](vitejs/vite@dc5395a)), closes [#19601](vitejs/vite#19601)
-   fix(preview): use preview https config, not server ([#19633](vitejs/vite#19633)) ([98b3160](vitejs/vite@98b3160)), closes [#19633](vitejs/vite#19633)
-   fix(ssr): use optional chaining to prevent "undefined is not an object" happening in \`ssrRewriteStac ([4309755](vitejs/vite@4309755)), closes [#19612](vitejs/vite#19612)
-   feat: show friendly error for malformed `base` ([#19616](vitejs/vite#19616)) ([2476391](vitejs/vite@2476391)), closes [#19616](vitejs/vite#19616)
-   feat(worker): show asset filename conflict warning ([#19591](vitejs/vite#19591)) ([367d968](vitejs/vite@367d968)), closes [#19591](vitejs/vite#19591)
-   chore: extend commit hash correctly when ambigious with a non-commit object ([#19600](vitejs/vite#19600)) ([89a6287](vitejs/vite@89a6287)), closes [#19600](vitejs/vite#19600)
renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Apr 17, 2025
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | vite    | 6.2.1 | 6.3.1 |


## [v6.3.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small631-2025-04-17-small)

-   fix: avoid using `Promise.allSettled` in preload function ([#19805](vitejs/vite#19805)) ([35c7f35](vitejs/vite@35c7f35)), closes [#19805](vitejs/vite#19805)
-   fix: backward compat for internal plugin `transform` calls ([#19878](vitejs/vite#19878)) ([a152b7c](vitejs/vite@a152b7c)), closes [#19878](vitejs/vite#19878)


## [v6.3.0](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#630-2025-04-16)

-   fix(hmr): avoid infinite loop happening with `hot.invalidate` in circular deps ([#19870](vitejs/vite#19870)) ([d4ee5e8](vitejs/vite@d4ee5e8)), closes [#19870](vitejs/vite#19870)
-   fix(preview): use host url to open browser ([#19836](vitejs/vite#19836)) ([5003434](vitejs/vite@5003434)), closes [#19836](vitejs/vite#19836)


## [v6.2.6](https://github.com/vitejs/vite/releases/tag/v6.2.6)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.6/packages/vite/CHANGELOG.md) for details.


## [v6.2.5](https://github.com/vitejs/vite/releases/tag/v6.2.5)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.5/packages/vite/CHANGELOG.md) for details.


## [v6.2.4](https://github.com/vitejs/vite/releases/tag/v6.2.4)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/CHANGELOG.md) for details.


## [v6.2.3](https://github.com/vitejs/vite/releases/tag/v6.2.3)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.3/packages/vite/CHANGELOG.md) for details.


## [v6.2.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small622-2025-03-14-small)

-   fix: await client buildStart on top level buildStart ([#19624](vitejs/vite#19624)) ([b31faab](vitejs/vite@b31faab)), closes [#19624](vitejs/vite#19624)
-   fix(css): inline css correctly for double quote use strict ([#19590](vitejs/vite#19590)) ([d0aa833](vitejs/vite@d0aa833)), closes [#19590](vitejs/vite#19590)
-   fix(deps): update all non-major dependencies ([#19613](vitejs/vite#19613)) ([363d691](vitejs/vite@363d691)), closes [#19613](vitejs/vite#19613)
-   fix(indexHtml): ensure correct URL when querying module graph ([#19601](vitejs/vite#19601)) ([dc5395a](vitejs/vite@dc5395a)), closes [#19601](vitejs/vite#19601)
-   fix(preview): use preview https config, not server ([#19633](vitejs/vite#19633)) ([98b3160](vitejs/vite@98b3160)), closes [#19633](vitejs/vite#19633)
-   fix(ssr): use optional chaining to prevent "undefined is not an object" happening in \`ssrRewriteStac ([4309755](vitejs/vite@4309755)), closes [#19612](vitejs/vite#19612)
-   feat: show friendly error for malformed `base` ([#19616](vitejs/vite#19616)) ([2476391](vitejs/vite@2476391)), closes [#19616](vitejs/vite#19616)
-   feat(worker): show asset filename conflict warning ([#19591](vitejs/vite#19591)) ([367d968](vitejs/vite@367d968)), closes [#19591](vitejs/vite#19591)
-   chore: extend commit hash correctly when ambigious with a non-commit object ([#19600](vitejs/vite#19600)) ([89a6287](vitejs/vite@89a6287)), closes [#19600](vitejs/vite#19600)
renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Apr 19, 2025
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | vite    | 6.2.1 | 6.3.2 |


## [v6.3.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small632-2025-04-18-small)

-   fix: match default asserts case insensitive ([#19852](vitejs/vite#19852)) ([cbdab1d](vitejs/vite@cbdab1d)), closes [#19852](vitejs/vite#19852)
-   fix: open first url if host does not match any urls ([#19886](vitejs/vite#19886)) ([6abbdce](vitejs/vite@6abbdce)), closes [#19886](vitejs/vite#19886)
-   fix(css): respect `css.lightningcss` option in css minification process ([#19879](vitejs/vite#19879)) ([b5055e0](vitejs/vite@b5055e0)), closes [#19879](vitejs/vite#19879)
-   fix(deps): update all non-major dependencies ([#19698](vitejs/vite#19698)) ([bab4cb9](vitejs/vite@bab4cb9)), closes [#19698](vitejs/vite#19698)
-   feat(css): improve lightningcss messages ([#19880](vitejs/vite#19880)) ([c713f79](vitejs/vite@c713f79)), closes [#19880](vitejs/vite#19880)


## [v6.3.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small631-2025-04-17-small)

-   fix: avoid using `Promise.allSettled` in preload function ([#19805](vitejs/vite#19805)) ([35c7f35](vitejs/vite@35c7f35)), closes [#19805](vitejs/vite#19805)
-   fix: backward compat for internal plugin `transform` calls ([#19878](vitejs/vite#19878)) ([a152b7c](vitejs/vite@a152b7c)), closes [#19878](vitejs/vite#19878)


## [v6.3.0](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#630-2025-04-16)

-   fix(hmr): avoid infinite loop happening with `hot.invalidate` in circular deps ([#19870](vitejs/vite#19870)) ([d4ee5e8](vitejs/vite@d4ee5e8)), closes [#19870](vitejs/vite#19870)
-   fix(preview): use host url to open browser ([#19836](vitejs/vite#19836)) ([5003434](vitejs/vite@5003434)), closes [#19836](vitejs/vite#19836)


## [v6.2.6](https://github.com/vitejs/vite/releases/tag/v6.2.6)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.6/packages/vite/CHANGELOG.md) for details.


## [v6.2.5](https://github.com/vitejs/vite/releases/tag/v6.2.5)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.5/packages/vite/CHANGELOG.md) for details.


## [v6.2.4](https://github.com/vitejs/vite/releases/tag/v6.2.4)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/CHANGELOG.md) for details.


## [v6.2.3](https://github.com/vitejs/vite/releases/tag/v6.2.3)

Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/v6.2.3/packages/vite/CHANGELOG.md) for details.


## [v6.2.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small622-2025-03-14-small)

-   fix: await client buildStart on top level buildStart ([#19624](vitejs/vite#19624)) ([b31faab](vitejs/vite@b31faab)), closes [#19624](vitejs/vite#19624)
-   fix(css): inline css correctly for double quote use strict ([#19590](vitejs/vite#19590)) ([d0aa833](vitejs/vite@d0aa833)), closes [#19590](vitejs/vite#19590)
-   fix(deps): update all non-major dependencies ([#19613](vitejs/vite#19613)) ([363d691](vitejs/vite@363d691)), closes [#19613](vitejs/vite#19613)
-   fix(indexHtml): ensure correct URL when querying module graph ([#19601](vitejs/vite#19601)) ([dc5395a](vitejs/vite@dc5395a)), closes [#19601](vitejs/vite#19601)
-   fix(preview): use preview https config, not server ([#19633](vitejs/vite#19633)) ([98b3160](vitejs/vite@98b3160)), closes [#19633](vitejs/vite#19633)
-   fix(ssr): use optional chaining to prevent "undefined is not an object" happening in \`ssrRewriteStac ([4309755](vitejs/vite@4309755)), closes [#19612](vitejs/vite#19612)
-   feat: show friendly error for malformed `base` ([#19616](vitejs/vite#19616)) ([2476391](vitejs/vite@2476391)), closes [#19616](vitejs/vite#19616)
-   feat(worker): show asset filename conflict warning ([#19591](vitejs/vite#19591)) ([367d968](vitejs/vite@367d968)), closes [#19591](vitejs/vite#19591)
-   chore: extend commit hash correctly when ambigious with a non-commit object ([#19600](vitejs/vite#19600)) ([89a6287](vitejs/vite@89a6287)), closes [#19600](vitejs/vite#19600)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat: hmr p3-minor-bug An edge case that only affects very specific usage (priority) trigger: preview
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Infinite HMR loop if circular dep calls import.meta.hot.invalidate()
2 participants