Skip to content

Commit 9f32b1d

Browse files
authored
fix(hmr): trigger prune event when import is removed from non hmr module (#20768)
1 parent 2a4fe41 commit 9f32b1d

File tree

8 files changed

+35
-1
lines changed

8 files changed

+35
-1
lines changed

packages/vite/src/node/plugins/importAnalysis.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin {
835835
isSelfAccepting,
836836
staticImportedUrls,
837837
)
838-
if (hasHMR && prunedImports) {
838+
if (prunedImports) {
839839
handlePrunedModules(prunedImports, environment)
840840
}
841841
}

playground/hmr/__tests__/hmr.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,17 @@ if (!isBuild) {
997997
.toMatch('parent:child')
998998
})
999999

1000+
test('deleting import from non-self-accepting module can trigger prune event', async () => {
1001+
await page.goto(viteTestUrl)
1002+
await expect.poll(() => page.textContent('.prune')).toMatch('prune-init')
1003+
editFile('prune/dep1.js', (code) =>
1004+
code.replace(`import './dep2.js'`, `// import './dep2.js'`),
1005+
)
1006+
await expect
1007+
.poll(() => page.textContent('.prune'))
1008+
.toMatch('prune-init|dep2-disposed|dep2-pruned')
1009+
})
1010+
10001011
test('import.meta.hot?.accept', async () => {
10011012
await page.goto(viteTestUrl)
10021013

playground/hmr/hmr.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import './file-delete-restore'
77
import './optional-chaining/parent'
88
import './intermediate-file-delete'
99
import './circular'
10+
import './prune'
1011
import logo from './logo.svg'
1112
import logoNoInline from './logo-no-inline.svg'
1213
import { msg as softInvalidationMsg } from './soft-invalidation'

playground/hmr/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,4 @@
4545
<img id="logo" />
4646
<img id="logo-no-inline" />
4747
<div class="circular"></div>
48+
<div class="prune">prune-init</div>

playground/hmr/prune/dep1.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import './dep2.js'
2+
3+
// TODO: https://github.com/vitejs/vite/issues/20781
4+
// currently we need one more `import` in this module
5+
// to trigger prune for depending module `dep2.js` since
6+
// the prune event logic is skipped when `es-module-lexer`
7+
// detects `imports.length === 0`
8+
import './dep2-other.js'

playground/hmr/prune/dep2-other.js

Whitespace-only changes.

playground/hmr/prune/dep2.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
if (import.meta.hot) {
2+
import.meta.hot.dispose(() => {
3+
document.querySelector('.prune').textContent += '|dep2-disposed'
4+
})
5+
import.meta.hot.prune(() => {
6+
document.querySelector('.prune').textContent += '|dep2-pruned'
7+
})
8+
}

playground/hmr/prune/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import './dep1.js'
2+
3+
if (import.meta.hot) {
4+
import.meta.hot.accept(() => {})
5+
}

0 commit comments

Comments
 (0)