Pārlūkot izejas kodu

refactor(hydration): add hydration enablement control mechanism

ensure hydration related code is tree-shaken when using createApp/createVaporApp + vaporInteropPlugin
daiwei 3 mēneši atpakaļ
vecāks
revīzija
9ce5a20026

+ 7 - 0
packages/runtime-core/src/hydration.ts

@@ -53,6 +53,12 @@ import { isAsyncWrapper } from './apiAsyncComponent'
 import { isReactive } from '@vue/reactivity'
 import { updateHOCHostEl } from './componentRenderUtils'
 
+export let isHydratingEnabled = false
+
+export function setIsHydratingEnabled(value: boolean): void {
+  isHydratingEnabled = value
+}
+
 /**
  * VDOM hydration state.
  * Also used by vapor interop plugin for tree-shaking:
@@ -134,6 +140,7 @@ export function createHydrationFunctions(
   } = rendererInternals
 
   const hydrate: RootHydrateFunction = (vnode, container) => {
+    if (!isHydratingEnabled) return
     if (!container.hasChildNodes()) {
       ;(__DEV__ || __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__) &&
         warn(

+ 1 - 0
packages/runtime-core/src/index.ts

@@ -400,6 +400,7 @@ export {
   normalizeClass,
   normalizeStyle,
 } from '@vue/shared'
+export { setIsHydratingEnabled } from './hydration'
 
 // For test-utils
 export { transformVNodeArgs } from './vnode'

+ 2 - 0
packages/runtime-dom/src/index.ts

@@ -15,6 +15,7 @@ import {
   createHydrationRenderer,
   createRenderer,
   isRuntimeOnly,
+  setIsHydratingEnabled,
   warn,
 } from '@vue/runtime-core'
 import { nodeOps } from './nodeOps'
@@ -148,6 +149,7 @@ export const createApp = ((...args) => {
 }) as CreateAppFunction<Element, Component>
 
 export const createSSRApp = ((...args) => {
+  setIsHydratingEnabled(true)
   const app = ensureHydrationRenderer().createApp(...args)
 
   if (__DEV__) {

+ 2 - 1
packages/runtime-vapor/src/apiCreateApp.ts

@@ -21,7 +21,7 @@ import {
 import type { RawProps } from './componentProps'
 import { getGlobalThis } from '@vue/shared'
 import { optimizePropertyLookup } from './dom/prop'
-import { withHydration } from './dom/hydration'
+import { setIsHydratingEnabled, withHydration } from './dom/hydration'
 
 let _createApp: CreateAppFunction<ParentNode, VaporComponent>
 
@@ -122,6 +122,7 @@ export const createVaporSSRApp: CreateAppFunction<
   ParentNode,
   VaporComponent
 > = (comp, props) => {
+  setIsHydratingEnabled(true)
   prepareApp()
   if (!_hydrateApp)
     _hydrateApp = createAppAPI(hydrateApp, unmountApp, getExposed)

+ 7 - 0
packages/runtime-vapor/src/dom/hydration.ts

@@ -18,10 +18,17 @@ import {
 } from './node'
 import { remove } from '../block'
 
+export let isHydratingEnabled = false
+
+export function setIsHydratingEnabled(value: boolean): void {
+  isHydratingEnabled = value
+}
+
 export let currentHydrationNode: Node | null = null
 
 export let isHydrating = false
 function setIsHydrating(value: boolean) {
+  if (!isHydratingEnabled) return false
   try {
     return isHydrating
   } finally {