Skip to content

Commit ec76aec

Browse files
committed
wip: test hmr updating
1 parent 90c2e20 commit ec76aec

File tree

5 files changed

+156
-6
lines changed

5 files changed

+156
-6
lines changed

packages/runtime-core/src/hmr.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ function reload(id: string, newComp: HMRComponent): void {
119119
// create a snapshot which avoids the set being mutated during updates
120120
const instances = [...record.instances]
121121

122-
if (newComp.vapor) {
122+
if (newComp.__vapor) {
123123
for (const instance of instances) {
124124
instance.hmrReload!(newComp)
125125
}

packages/runtime-vapor/__tests__/components/Teleport.spec.ts

Lines changed: 142 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
type LooseRawProps,
33
type VaporComponent,
4-
createComponent as originalCreateComponent,
4+
createComponent as createComp,
55
} from '../../src/component'
66
import {
77
type VaporDirective,
@@ -12,7 +12,6 @@ import {
1212
template,
1313
withVaporDirectives,
1414
} from '@vue/runtime-vapor'
15-
1615
import { makeRender } from '../_utils'
1716
import {
1817
nextTick,
@@ -23,6 +22,10 @@ import {
2322
shallowRef,
2423
} from 'vue'
2524

25+
import type { HMRRuntime } from '@vue/runtime-dom'
26+
declare var __VUE_HMR_RUNTIME__: HMRRuntime
27+
const { createRecord, rerender, reload } = __VUE_HMR_RUNTIME__
28+
2629
const define = makeRender()
2730

2831
describe('renderer: VaporTeleport', () => {
@@ -33,6 +36,141 @@ describe('renderer: VaporTeleport', () => {
3336
describe('defer mode', () => {
3437
runSharedTests(true)
3538
})
39+
40+
describe('HMR', () => {
41+
test('rerender', async () => {
42+
const target = document.createElement('div')
43+
const root = document.createElement('div')
44+
const childId = 'test1-child'
45+
const parentId = 'test1-parent'
46+
47+
const { component: Child } = define({
48+
__hmrId: childId,
49+
render() {
50+
return template('<div>teleported</div>')()
51+
},
52+
})
53+
createRecord(childId, Child as any)
54+
55+
const { mount, component: Parent } = define({
56+
__hmrId: parentId,
57+
render() {
58+
const n0 = createComp(
59+
VaporTeleport,
60+
{
61+
to: () => target,
62+
},
63+
{
64+
default: () => createComp(Child),
65+
},
66+
)
67+
const n1 = template('<div>root</div>')()
68+
return [n0, n1]
69+
},
70+
}).create()
71+
createRecord(parentId, Parent as any)
72+
mount(root)
73+
74+
expect(root.innerHTML).toBe('<!--teleport--><div>root</div>')
75+
expect(target.innerHTML).toBe('<div>teleported</div>')
76+
77+
// rerender child
78+
rerender(childId, () => {
79+
return template('<div>teleported 2</div>')()
80+
})
81+
82+
expect(root.innerHTML).toBe('<!--teleport--><div>root</div>')
83+
expect(target.innerHTML).toBe('<div>teleported 2</div>')
84+
85+
// rerender parent
86+
rerender(parentId, () => {
87+
const n0 = createComp(
88+
VaporTeleport,
89+
{
90+
to: () => target,
91+
},
92+
{
93+
default: () => createComp(Child),
94+
},
95+
)
96+
const n1 = template('<div>root 2</div>')()
97+
return [n0, n1]
98+
})
99+
100+
expect(root.innerHTML).toBe('<!--teleport--><div>root 2</div>')
101+
expect(target.innerHTML).toBe('<div>teleported 2</div>')
102+
})
103+
104+
test('reload', async () => {
105+
const target = document.createElement('div')
106+
const root = document.createElement('div')
107+
const childId = 'test2-child'
108+
const parentId = 'test2-parent'
109+
110+
const { component: Child } = define({
111+
__hmrId: childId,
112+
render() {
113+
return template('<div>teleported</div>')()
114+
},
115+
})
116+
createRecord(childId, Child as any)
117+
118+
const { mount, component: Parent } = define({
119+
__hmrId: parentId,
120+
render() {
121+
const n0 = createComp(
122+
VaporTeleport,
123+
{
124+
to: () => target,
125+
},
126+
{
127+
default: () => createComp(Child),
128+
},
129+
)
130+
const n1 = template('<div>root</div>')()
131+
return [n0, n1]
132+
},
133+
}).create()
134+
createRecord(parentId, Parent as any)
135+
mount(root)
136+
137+
expect(root.innerHTML).toBe('<!--teleport--><div>root</div>')
138+
expect(target.innerHTML).toBe('<div>teleported</div>')
139+
140+
// reload child
141+
reload(childId, {
142+
__hmrId: childId,
143+
__vapor: true,
144+
render() {
145+
return template('<div>teleported 2</div>')()
146+
},
147+
})
148+
expect(root.innerHTML).toBe('<!--teleport--><div>root</div>')
149+
expect(target.innerHTML).toBe('<div>teleported 2</div>')
150+
151+
// reload parent
152+
reload(parentId, {
153+
__hmrId: parentId,
154+
__vapor: true,
155+
render() {
156+
const n0 = createComp(
157+
VaporTeleport,
158+
{
159+
to: () => target,
160+
},
161+
{
162+
default: () => createComp(Child),
163+
},
164+
)
165+
const n1 = template('<div>root 2</div>')()
166+
return [n0, n1]
167+
},
168+
})
169+
170+
expect(root.innerHTML).toBe('<!--teleport--><div>root 2</div>')
171+
expect(target.innerHTML).toBe('<div>teleported 2</div>')
172+
})
173+
})
36174
})
37175

38176
function runSharedTests(deferMode: boolean): void {
@@ -45,9 +183,9 @@ function runSharedTests(deferMode: boolean): void {
45183
if (component === VaporTeleport) {
46184
rawProps!.defer = () => true
47185
}
48-
return originalCreateComponent(component, rawProps, ...args)
186+
return createComp(component, rawProps, ...args)
49187
}
50-
: originalCreateComponent
188+
: createComp
51189

52190
test('should work', () => {
53191
const target = document.createElement('div')

packages/runtime-vapor/src/block.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,11 @@ export function normalizeBlock(block: Block): Node[] {
184184
} else if (isVaporComponent(block)) {
185185
nodes.push(...normalizeBlock(block.block!))
186186
} else {
187-
nodes.push(...normalizeBlock(block.nodes))
187+
if ((block as any).getNodes) {
188+
nodes.push(...normalizeBlock((block as any).getNodes()))
189+
} else {
190+
nodes.push(...normalizeBlock(block.nodes))
191+
}
188192
block.anchor && nodes.push(block.anchor)
189193
}
190194
return nodes

packages/runtime-vapor/src/components/Teleport.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ export const VaporTeleportImpl = {
5454
})
5555
resetTracking()
5656

57+
if (__DEV__) {
58+
// TODO
59+
;(frag as any).getNodes = () => {
60+
return frag.parent !== frag.currentParent ? [] : frag.nodes
61+
}
62+
}
63+
5764
return frag
5865
},
5966
}

packages/runtime-vapor/src/hmr.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,5 @@ export function hmrReload(
5454
)
5555
simpleSetCurrentInstance(prev, instance.parent)
5656
mountComponent(newInstance, parent, anchor)
57+
instance.block = newInstance.block
5758
}

0 commit comments

Comments
 (0)