unexpected full reloads for modules that are not referenced
Describe the bug
- First, App.tsx import the Foo method of a.ts
- Then I removed the Foo method, and now a.ts is not imported by any file
- Modify the a.ts file at this time. After saving, vite reload the entire page, HMR does not work.
https://github.com/user-attachments/assets/c90c59f2-99f1-4492-983d-27b83f035089
Reproduction
https://stackblitz.com/edit/vitejs-vite-d4lgyd?file=src%2Fa.ts,src%2FApp.tsx&terminal=dev
Steps to reproduce
No response
System Info
...
Used Package Manager
pnpm
Logs
No response
Validations
- [X] Follow our Code of Conduct
- [X] Read the Contributing Guidelines.
- [X] Read the docs.
- [X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- [X] Make sure this is a Vite issue and not a framework-specific issue. For example, if it's a Vue SFC related bug, it should likely be reported to vuejs/core instead.
- [X] Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
- [X] The provided reproduction is a minimal reproducible example of the bug.
This may be the key code
https://github.com/vitejs/vite/blob/720447ee725046323387f661341d44e2ad390f41/packages/vite/src/node/server/hmr.ts#L399-L401
The behavior might not be entirely ideal, but it doesn't look so bothering either. Can you maybe explain if you have any concrete use cases where this scenario shouldn't full reload?
Yeah this may be hard to fix because the no-importers check is used to assume a module is a root, e.g. if you ssrLoadModule a .js file, that file would be the root so it assumes a full reload.
If we want to fix this, we need an alternate way to track the root, which is similar to https://github.com/vitejs/vite/issues/16664 that is the inverse of the problem, where a circular dep causes the root to not be detected and miss a reload.