Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit d6c5bcf

Browse files
authored
feat(runtime-core): implement debug hook (#183)
1 parent d490bf2 commit d6c5bcf

File tree

5 files changed

+77
-5
lines changed

5 files changed

+77
-5
lines changed

packages/runtime-vapor/__tests__/apiLifecycle.spec.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {
66
getCurrentInstance,
77
inject,
88
nextTick,
9+
onRenderTracked,
10+
onRenderTriggered,
911
onUpdated,
1012
provide,
1113
ref,
@@ -112,4 +114,47 @@ describe('apiLifecycle', () => {
112114
expect(handleUpdated).toHaveBeenCalledTimes(1)
113115
expect(handleUpdatedChild).toHaveBeenCalledTimes(1)
114116
})
117+
118+
test('onRenderTracked', async () => {
119+
const onTrackedFn = vi.fn()
120+
const count = ref(0)
121+
const { host, render } = define({
122+
setup() {
123+
onRenderTracked(onTrackedFn)
124+
return (() => {
125+
const n0 = createTextNode()
126+
renderEffect(() => {
127+
setText(n0, count.value)
128+
})
129+
return n0
130+
})()
131+
},
132+
})
133+
render()
134+
await nextTick()
135+
expect(onTrackedFn).toBeCalled()
136+
expect(host.innerHTML).toBe('0')
137+
})
138+
test('onRenderTrigger', async () => {
139+
const onRenderTriggerFn = vi.fn()
140+
const count = ref(0)
141+
const { host, render } = define({
142+
setup() {
143+
onRenderTriggered(onRenderTriggerFn)
144+
return (() => {
145+
const n0 = createTextNode()
146+
renderEffect(() => {
147+
setText(n0, count.value)
148+
})
149+
return n0
150+
})()
151+
},
152+
})
153+
render()
154+
count.value++
155+
await nextTick()
156+
expect(onRenderTriggerFn).toBeCalled()
157+
expect(onRenderTriggerFn).toHaveBeenCalledOnce()
158+
expect(host.innerHTML).toBe('1')
159+
})
115160
})

packages/runtime-vapor/src/apiLifecycle.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import {
44
setCurrentInstance,
55
} from './component'
66
import { warn } from './warning'
7-
import { pauseTracking, resetTracking } from '@vue/reactivity'
7+
import {
8+
type DebuggerEvent,
9+
pauseTracking,
10+
resetTracking,
11+
} from '@vue/reactivity'
812
import { ErrorTypeStrings, callWithAsyncErrorHandling } from './errorHandling'
913
import { toHandlerKey } from '@vue/shared'
1014

@@ -77,6 +81,14 @@ export const onUpdated = createHook(VaporLifecycleHooks.UPDATED)
7781
export const onBeforeUnmount = createHook(VaporLifecycleHooks.BEFORE_UNMOUNT)
7882
export const onUnmounted = createHook(VaporLifecycleHooks.UNMOUNTED)
7983

84+
export type DebuggerHook = (e: DebuggerEvent) => void
85+
export const onRenderTriggered = createHook<DebuggerHook>(
86+
VaporLifecycleHooks.RENDER_TRIGGERED,
87+
)
88+
export const onRenderTracked = createHook<DebuggerHook>(
89+
VaporLifecycleHooks.RENDER_TRACKED,
90+
)
91+
8092
export type ErrorCapturedHook<TError = unknown> = (
8193
err: TError,
8294
instance: ComponentInternalInstance | null,

packages/runtime-vapor/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ export {
106106
onUnmounted,
107107
// onActivated,
108108
// onDeactivated,
109-
// onRenderTracked,
110-
// onRenderTriggered,
109+
onRenderTracked,
110+
onRenderTriggered,
111111
onErrorCaptured,
112112
// onServerPrefetch,
113113
} from './apiLifecycle'

packages/runtime-vapor/src/renderEffect.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { invokeDirectiveHook } from './directives'
1818
export function renderEffect(cb: () => void) {
1919
const instance = getCurrentInstance()
2020
const scope = getCurrentScope()
21-
2221
let effect: ReactiveEffect
2322

2423
const job: SchedulerJob = () => {
@@ -77,7 +76,14 @@ export function renderEffect(cb: () => void) {
7776
if (instance) job.id = instance.uid
7877
queueJob(job)
7978
}
80-
79+
if (__DEV__) {
80+
effect.onTrack = instance?.rtc
81+
? e => invokeArrayFns(instance.rtc!, e)
82+
: void 0
83+
effect.onTrigger = instance?.rtg
84+
? e => invokeArrayFns(instance.rtg!, e)
85+
: void 0
86+
}
8187
effect.run()
8288
}
8389

playground/src/App.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
getCurrentInstance,
88
onBeforeUpdate,
99
onUpdated,
10+
onRenderTracked,
11+
onRenderTriggered,
1012
} from 'vue/vapor'
1113
1214
const instance = getCurrentInstance()!
@@ -36,6 +38,13 @@ onUpdated(() => {
3638
console.log('updated')
3739
})
3840
41+
onRenderTracked(e => {
42+
console.log(`Render Tracked:`, e.target)
43+
})
44+
onRenderTriggered(e => {
45+
console.log(`Render trigger:`, e.target)
46+
})
47+
3948
const log = (arg: any) => {
4049
console.log('callback in render effect')
4150
return arg

0 commit comments

Comments
 (0)