Skip to content

Commit 493b942

Browse files
authored
fix(plugin-vue): fix hmr when emptying sfc file (#2142)
fix #2128
1 parent a0d922e commit 493b942

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

packages/playground/vue/Main.vue

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
<div class="comments"><!--hello--></div>
33
<h1>Vue SFCs</h1>
44
<pre>{{ time }}</pre>
5-
<Hmr />
5+
<div class="hmr-block">
6+
<Hmr />
7+
</div>
68
<Syntax />
79
<PreProcessors />
810
<CssModules />

packages/playground/vue/__tests__/vue.spec.ts

+5
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ describe('hmr', () => {
133133
)
134134
await untilUpdated(() => page.textContent('.hmr-inc'), 'count is 100')
135135
})
136+
137+
test('should re-render when template is emptied', async () => {
138+
editFile('Hmr.vue', () => '')
139+
await untilUpdated(() => page.innerHTML('.hmr-block'), '<!---->')
140+
})
136141
})
137142

138143
describe('src imports', () => {

packages/plugin-vue/src/handleHotUpdate.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export async function handleHotUpdate({
144144
return [...affectedModules].filter(Boolean) as ModuleNode[]
145145
}
146146

147-
function isEqualBlock(a: SFCBlock | null, b: SFCBlock | null) {
147+
export function isEqualBlock(a: SFCBlock | null, b: SFCBlock | null) {
148148
if (!a && !b) return true
149149
if (!a || !b) return false
150150
// src imports will trigger their own updates

packages/plugin-vue/src/main.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import { PluginContext, TransformPluginContext } from 'rollup'
1111
import { resolveScript } from './script'
1212
import { transformTemplateInMain } from './template'
13-
import { isOnlyTemplateChanged } from './handleHotUpdate'
13+
import { isOnlyTemplateChanged, isEqualBlock } from './handleHotUpdate'
1414
import { RawSourceMap, SourceMapConsumer, SourceMapGenerator } from 'source-map'
1515
import { createRollupError } from './utils/error'
1616

@@ -71,11 +71,23 @@ export async function transformMain(
7171
))
7272
}
7373

74-
const renderReplace = hasTemplateImport
75-
? ssr
74+
let renderReplace = ''
75+
if (hasTemplateImport) {
76+
renderReplace = ssr
7677
? `_sfc_main.ssrRender = _sfc_ssrRender`
7778
: `_sfc_main.render = _sfc_render`
78-
: ''
79+
} else {
80+
// #2128
81+
// User may empty the template but we didn't provide rerender function before
82+
if (
83+
prevDescriptor &&
84+
!isEqualBlock(descriptor.template, prevDescriptor.template)
85+
) {
86+
renderReplace = ssr
87+
? `_sfc_main.ssrRender = () => {}`
88+
: `_sfc_main.render = () => {}`
89+
}
90+
}
7991

8092
// styles
8193
const stylesCode = await genStyleCode(descriptor, pluginContext)

0 commit comments

Comments
 (0)