-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
/
hmr.ts
120 lines (102 loc) · 3.37 KB
/
hmr.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { virtual } from 'virtual:file'
import { foo as depFoo, nestedFoo } from './hmrDep'
import './importing-updated'
import './invalidation/parent'
import './file-delete-restore'
import './optional-chaining/parent'
export const foo = 1
text('.app', foo)
text('.dep', depFoo)
text('.nested', nestedFoo)
text('.virtual', virtual)
const btn = document.querySelector('.virtual-update') as HTMLButtonElement
btn.onclick = () => {
if (import.meta.hot) {
import.meta.hot.send('virtual:increment')
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ foo }) => {
console.log('(self-accepting 1) foo is now:', foo)
})
import.meta.hot.accept(({ foo }) => {
console.log('(self-accepting 2) foo is now:', foo)
})
const handleDep = (type, newFoo, newNestedFoo) => {
console.log(`(${type}) foo is now: ${newFoo}`)
console.log(`(${type}) nested foo is now: ${newNestedFoo}`)
text('.dep', newFoo)
text('.nested', newNestedFoo)
}
import.meta.hot.accept('./hmrDep', ({ foo, nestedFoo }) => {
handleDep('single dep', foo, nestedFoo)
})
import.meta.hot.accept(['./hmrDep'], ([{ foo, nestedFoo }]) => {
handleDep('multi deps', foo, nestedFoo)
})
import.meta.hot.dispose(() => {
console.log(`foo was:`, foo)
})
import.meta.hot.on('vite:afterUpdate', (event) => {
console.log(`>>> vite:afterUpdate -- ${event.type}`)
})
import.meta.hot.on('vite:beforeUpdate', (event) => {
console.log(`>>> vite:beforeUpdate -- ${event.type}`)
const cssUpdate = event.updates.find(
(update) =>
update.type === 'css-update' && update.path.match('global.css'),
)
if (cssUpdate) {
text(
'.css-prev',
(document.querySelector('.global-css') as HTMLLinkElement).href,
)
// Wait until the tag has been swapped out, which includes the time taken
// to download and parse the new stylesheet. Assert the swapped link.
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (
node.nodeType === Node.ELEMENT_NODE &&
(node as Element).tagName === 'LINK'
) {
text('.link-tag-added', 'yes')
}
})
mutation.removedNodes.forEach((node) => {
if (
node.nodeType === Node.ELEMENT_NODE &&
(node as Element).tagName === 'LINK'
) {
text('.link-tag-removed', 'yes')
text(
'.css-post',
(document.querySelector('.global-css') as HTMLLinkElement).href,
)
}
})
})
})
observer.observe(document.querySelector('#style-tags-wrapper'), {
childList: true,
})
}
})
import.meta.hot.on('vite:error', (event) => {
console.log(`>>> vite:error -- ${event.err.message}`)
})
import.meta.hot.on('vite:invalidate', ({ path }) => {
console.log(`>>> vite:invalidate -- ${path}`)
})
import.meta.hot.on('custom:foo', ({ msg }) => {
text('.custom', msg)
})
// send custom event to server to calculate 1 + 2
import.meta.hot.send('custom:remote-add', { a: 1, b: 2 })
import.meta.hot.on('custom:remote-add-result', ({ result }) => {
text('.custom-communication', result)
})
}
function text(el, text) {
document.querySelector(el).textContent = text
}