}
}
-/**
- * @internal
- */
export const setCurrentInstance = (instance: GenericComponentInstance) => {
const prev = currentInstance
internalSetCurrentInstance(instance)
currentInstance && currentInstance.scope.off()
internalSetCurrentInstance(null)
}
+
+/**
+ * Exposed for vapor only. Vapor never runs during SSR so we don't want to pay
+ * for the extra overhead
+ * @internal
+ */
+export const simpleSetCurrentInstance = (
+ i: GenericComponentInstance | null,
+ unset?: GenericComponentInstance,
+): void => {
+ currentInstance = i
+ if (unset) {
+ unset.scope.off()
+ } else if (i) {
+ i.scope.on()
+ }
+}
type AppMountFn,
type AppUnmountFn,
} from './apiCreateApp'
-export { currentInstance, setCurrentInstance } from './componentCurrentInstance'
+export {
+ currentInstance,
+ simpleSetCurrentInstance,
+} from './componentCurrentInstance'
export { registerHMR, unregisterHMR } from './hmr'
// teardown previous branch
if (this.scope) {
- this.scope.off()
+ this.scope.stop()
parent && remove(this.nodes, parent)
// TODO lifecycle unmount
}
popWarningContext,
pushWarningContext,
registerHMR,
- setCurrentInstance,
+ simpleSetCurrentInstance,
+ unregisterHMR,
warn,
} from '@vue/runtime-dom'
import { type Block, isBlock } from './block'
}
const instance = new VaporComponentInstance(component, rawProps, rawSlots)
- const resetCurrentInstance = setCurrentInstance(instance)
+ const prev = currentInstance
+ simpleSetCurrentInstance(instance)
pauseTracking()
if (__DEV__) {
devRender(instance)
// HMR
- registerHMR(instance)
- instance.hmrRerender = hmrRerender.bind(null, instance)
- instance.hmrReload = hmrReload.bind(null, instance)
+ if (component.__hmrId) {
+ registerHMR(instance)
+ instance.hmrRerender = hmrRerender.bind(null, instance)
+ instance.hmrReload = hmrReload.bind(null, instance)
+ }
}
} else {
// in prod result can only be block
popWarningContext()
}
resetTracking()
- resetCurrentInstance()
+ simpleSetCurrentInstance(prev, instance)
return instance
}
parent: ParentNode,
): void {
if (instance.isMounted && !instance.isUnmounted) {
+ if (__DEV__ && instance.type.__hmrId) {
+ unregisterHMR(instance)
+ }
if (instance.bum) invokeArrayFns(instance.bum)
+ instance.scope.stop()
// TODO invoke unmount recursively for children
remove(instance.block, parent)
// queuePostFlushCb(() => {
import {
+ currentInstance,
popWarningContext,
pushWarningContext,
- setCurrentInstance,
+ simpleSetCurrentInstance,
} from '@vue/runtime-core'
import { normalizeBlock } from './block'
import { type VaporComponentInstance, devRender } from './component'
const parent = normalized[0].parentNode!
const anchor = normalized[normalized.length - 1].nextSibling
remove(instance.block, parent)
- const reset = setCurrentInstance(instance)
+ const prev = currentInstance
+ simpleSetCurrentInstance(instance)
pushWarningContext(instance)
devRender(instance)
- reset()
popWarningContext()
+ simpleSetCurrentInstance(prev, instance)
insert(instance.block, parent, anchor)
}
currentInstance,
queueJob,
queuePostFlushCb,
- setCurrentInstance,
+ simpleSetCurrentInstance,
warn,
} from '@vue/runtime-dom'
import { type VaporComponentInstance, isVaporComponent } from './component'
warn('renderEffect called without active vapor instance.')
}
- const effect = new ReactiveEffect(
- noLifecycle
- ? fn
- : () => {
- const reset = setCurrentInstance(instance)
- const { isMounted, isUpdating, bu, u } = instance
- // before update
- if (isMounted && !isUpdating && (bu || u)) {
- instance.isUpdating = true
- bu && invokeArrayFns(bu)
- fn()
- queuePostFlushCb(() => {
- instance.isUpdating = false
- u && invokeArrayFns(u)
- })
- } else {
- fn()
- }
- reset()
- },
- )
+ const renderEffectFn = noLifecycle
+ ? fn
+ : () => {
+ const prev = currentInstance
+ simpleSetCurrentInstance(instance)
+ if (
+ instance.isMounted &&
+ !instance.isUpdating &&
+ (instance.bu || instance.u)
+ ) {
+ instance.isUpdating = true
+ instance.bu && invokeArrayFns(instance.bu)
+ fn()
+ queuePostFlushCb(() => {
+ instance.isUpdating = false
+ instance.u && invokeArrayFns(instance.u)
+ })
+ } else {
+ fn()
+ }
+ simpleSetCurrentInstance(prev, instance)
+ }
+ const effect = new ReactiveEffect(renderEffectFn)
const job: SchedulerJob = effect.runIfDirty.bind(effect)
job.i = instance
job.id = instance.uid