mirror of https://github.com/vuejs/core.git
				
				
				
			wip: vapor hmr rerender
This commit is contained in:
		
							parent
							
								
									6c4018652b
								
							
						
					
					
						commit
						4833c1c96e
					
				| 
						 | 
					@ -381,6 +381,17 @@ export interface GenericComponentInstance {
 | 
				
			||||||
  // exposed properties via expose()
 | 
					  // exposed properties via expose()
 | 
				
			||||||
  exposed: Record<string, any> | null
 | 
					  exposed: Record<string, any> | null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * setup related
 | 
				
			||||||
 | 
					   * @internal
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  setupState?: Data
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * devtools access to additional info
 | 
				
			||||||
 | 
					   * @internal
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  devtoolsRawSetupState?: any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // lifecycle
 | 
					  // lifecycle
 | 
				
			||||||
  isMounted: boolean
 | 
					  isMounted: boolean
 | 
				
			||||||
  isUnmounted: boolean
 | 
					  isUnmounted: boolean
 | 
				
			||||||
| 
						 | 
					@ -473,6 +484,10 @@ export interface GenericComponentInstance {
 | 
				
			||||||
   * @internal
 | 
					   * @internal
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  [LifecycleHooks.SERVER_PREFETCH]?: LifecycleHook<() => Promise<unknown>>
 | 
					  [LifecycleHooks.SERVER_PREFETCH]?: LifecycleHook<() => Promise<unknown>>
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * @internal vapor only
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  hmrRerender?: () => void
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -584,11 +599,6 @@ export interface ComponentInternalInstance extends GenericComponentInstance {
 | 
				
			||||||
   * @internal
 | 
					   * @internal
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  setupState: Data
 | 
					  setupState: Data
 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
   * devtools access to additional info
 | 
					 | 
				
			||||||
   * @internal
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  devtoolsRawSetupState?: any
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // main proxy that serves as the public instance (`this`)
 | 
					  // main proxy that serves as the public instance (`this`)
 | 
				
			||||||
  proxy: ComponentPublicInstance | null
 | 
					  proxy: ComponentPublicInstance | null
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,7 +96,8 @@ function rerender(id: string, newRender?: Function): void {
 | 
				
			||||||
    // this flag forces child components with slot content to update
 | 
					    // this flag forces child components with slot content to update
 | 
				
			||||||
    isHmrUpdating = true
 | 
					    isHmrUpdating = true
 | 
				
			||||||
    if (instance.vapor) {
 | 
					    if (instance.vapor) {
 | 
				
			||||||
      // TODO
 | 
					      // @ts-expect-error TODO
 | 
				
			||||||
 | 
					      instance.hmrRerender()
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      const i = instance as ComponentInternalInstance
 | 
					      const i = instance as ComponentInternalInstance
 | 
				
			||||||
      i.renderCache = []
 | 
					      i.renderCache = []
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -508,3 +508,4 @@ export {
 | 
				
			||||||
  type AppUnmountFn,
 | 
					  type AppUnmountFn,
 | 
				
			||||||
} from './apiCreateApp'
 | 
					} from './apiCreateApp'
 | 
				
			||||||
export { currentInstance, setCurrentInstance } from './componentCurrentInstance'
 | 
					export { currentInstance, setCurrentInstance } from './componentCurrentInstance'
 | 
				
			||||||
 | 
					export { registerHMR, unregisterHMR } from './hmr'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@ export class DynamicFragment extends Fragment {
 | 
				
			||||||
    if (this.scope) {
 | 
					    if (this.scope) {
 | 
				
			||||||
      this.scope.off()
 | 
					      this.scope.off()
 | 
				
			||||||
      parent && remove(this.nodes, parent)
 | 
					      parent && remove(this.nodes, parent)
 | 
				
			||||||
 | 
					      // TODO lifecycle unmount
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (render) {
 | 
					    if (render) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@ import {
 | 
				
			||||||
  nextUid,
 | 
					  nextUid,
 | 
				
			||||||
  popWarningContext,
 | 
					  popWarningContext,
 | 
				
			||||||
  pushWarningContext,
 | 
					  pushWarningContext,
 | 
				
			||||||
 | 
					  registerHMR,
 | 
				
			||||||
  setCurrentInstance,
 | 
					  setCurrentInstance,
 | 
				
			||||||
  warn,
 | 
					  warn,
 | 
				
			||||||
} from '@vue/runtime-dom'
 | 
					} from '@vue/runtime-dom'
 | 
				
			||||||
| 
						 | 
					@ -40,6 +41,7 @@ import {
 | 
				
			||||||
  getSlot,
 | 
					  getSlot,
 | 
				
			||||||
} from './componentSlots'
 | 
					} from './componentSlots'
 | 
				
			||||||
import { insert } from './dom/node'
 | 
					import { insert } from './dom/node'
 | 
				
			||||||
 | 
					import { hmrRerender } from './hmr'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { currentInstance } from '@vue/runtime-dom'
 | 
					export { currentInstance } from '@vue/runtime-dom'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,15 +141,13 @@ export function createComponent(
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
      instance.block = []
 | 
					      instance.block = []
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      instance.setupState = setupResult
 | 
					      instance.devtoolsRawSetupState = setupResult
 | 
				
			||||||
      instance.block = component.render.call(
 | 
					      instance.setupState = proxyRefs(setupResult)
 | 
				
			||||||
        null,
 | 
					      devRender(instance)
 | 
				
			||||||
        proxyRefs(setupResult),
 | 
					
 | 
				
			||||||
        instance.props,
 | 
					      // HMR
 | 
				
			||||||
        instance.emit,
 | 
					      registerHMR(instance)
 | 
				
			||||||
        instance.attrs,
 | 
					      instance.hmrRerender = hmrRerender.bind(null, instance)
 | 
				
			||||||
        instance.slots,
 | 
					 | 
				
			||||||
      )
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    // in prod result can only be block
 | 
					    // in prod result can only be block
 | 
				
			||||||
| 
						 | 
					@ -177,6 +177,20 @@ export function createComponent(
 | 
				
			||||||
  return instance
 | 
					  return instance
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * dev only
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function devRender(instance: VaporComponentInstance): void {
 | 
				
			||||||
 | 
					  instance.block = instance.type.render!.call(
 | 
				
			||||||
 | 
					    null,
 | 
				
			||||||
 | 
					    instance.setupState,
 | 
				
			||||||
 | 
					    instance.props,
 | 
				
			||||||
 | 
					    instance.emit,
 | 
				
			||||||
 | 
					    instance.attrs,
 | 
				
			||||||
 | 
					    instance.slots,
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const emptyContext: GenericAppContext = {
 | 
					const emptyContext: GenericAppContext = {
 | 
				
			||||||
  app: null as any,
 | 
					  app: null as any,
 | 
				
			||||||
  config: {},
 | 
					  config: {},
 | 
				
			||||||
| 
						 | 
					@ -238,6 +252,8 @@ export class VaporComponentInstance implements GenericComponentInstance {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // dev only
 | 
					  // dev only
 | 
				
			||||||
  setupState?: Record<string, any>
 | 
					  setupState?: Record<string, any>
 | 
				
			||||||
 | 
					  devtoolsRawSetupState?: any
 | 
				
			||||||
 | 
					  hmrRerender?: () => void
 | 
				
			||||||
  propsOptions?: NormalizedPropsOptions
 | 
					  propsOptions?: NormalizedPropsOptions
 | 
				
			||||||
  emitsOptions?: ObjectEmitsOptions | null
 | 
					  emitsOptions?: ObjectEmitsOptions | null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  popWarningContext,
 | 
				
			||||||
 | 
					  pushWarningContext,
 | 
				
			||||||
 | 
					  setCurrentInstance,
 | 
				
			||||||
 | 
					} from '@vue/runtime-core'
 | 
				
			||||||
 | 
					import { normalizeBlock } from './block'
 | 
				
			||||||
 | 
					import { type VaporComponentInstance, devRender } from './component'
 | 
				
			||||||
 | 
					import { insert, remove } from './dom/node'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function hmrRerender(instance: VaporComponentInstance): void {
 | 
				
			||||||
 | 
					  const normalized = normalizeBlock(instance.block)
 | 
				
			||||||
 | 
					  const parent = normalized[0].parentNode!
 | 
				
			||||||
 | 
					  const anchor = normalized[normalized.length - 1].nextSibling
 | 
				
			||||||
 | 
					  remove(instance.block, parent)
 | 
				
			||||||
 | 
					  const reset = setCurrentInstance(instance)
 | 
				
			||||||
 | 
					  pushWarningContext(instance)
 | 
				
			||||||
 | 
					  devRender(instance)
 | 
				
			||||||
 | 
					  reset()
 | 
				
			||||||
 | 
					  popWarningContext()
 | 
				
			||||||
 | 
					  insert(instance.block, parent, anchor)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue