defineLazyHydrationComponent
定义具有特定策略的延迟水合组件。
defineLazyHydrationComponent 是一个编译器宏,可帮助您创建具有特定延迟水合策略的组件。延迟水合会推迟水合过程,直到组件变得可见或浏览器完成更多关键任务。这可以显著降低初始性能开销,特别是对于非核心组件而言。
使用
可见性策略 (Visibility Strategy)
当组件在视口中变得可见时进行水合。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'visible',
() => import('./components/MyComponent.vue'),
)
</script>
<template>
<div>
<!--
Hydration will be triggered when
the element(s) is 100px away from entering the viewport.
-->
<LazyHydrationMyComponent :hydrate-on-visible="{ rootMargin: '100px' }" />
</div>
</template>
hydrateOnVisible prop 是可选的。您可以传递一个对象来自定义底层 IntersectionObserver 的行为。
底层使用了 Vue 内置的
hydrateOnVisible 策略.空闲策略 (Idle Strategy)
当浏览器空闲时水合组件。如果您需要组件尽快加载,但又不希望阻塞关键渲染路径,此策略非常适用。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'idle',
() => import('./components/MyComponent.vue'),
)
</script>
<template>
<div>
<!-- Hydration will be triggered when the browser is idle or after 2000ms. -->
<LazyHydrationMyComponent :hydrate-on-idle="2000" />
</div>
</template>
hydrateOnIdle prop 是可选的。您可以传递一个正数来指定最大超时时间。
空闲策略适用于可以在浏览器空闲时进行水合的组件。
底层使用了 Vue 内置的
hydrateOnIdle 策略.交互策略 (Interaction Strategy)
在特定交互(例如点击、鼠标悬停)后水合组件。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'interaction',
() => import('./components/MyComponent.vue'),
)
</script>
<template>
<div>
<!--
Hydration will be triggered when
the element(s) is hovered over by the pointer.
-->
<LazyHydrationMyComponent hydrate-on-interaction="mouseover" />
</div>
</template>
hydrateOnInteraction prop 是可选的。如果您没有传递事件或事件列表,它默认会在 pointerenter、click 和 focus 时触发水合。
底层使用了 Vue 内置的
hydrateOnInteraction 策略.媒体查询策略 (Media Query Strategy)
当窗口匹配媒体查询时水合组件。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'mediaQuery',
() => import('./components/MyComponent.vue'),
)
</script>
<template>
<div>
<!--
Hydration will be triggered when
the window width is greater than or equal to 768px.
-->
<LazyHydrationMyComponent hydrate-on-media-query="(min-width: 768px)" />
</div>
</template>
底层使用了 Vue 内置的
hydrateOnMediaQuery 策略.时间策略 (Time Strategy)
在指定的延迟(以毫秒为单位)后水合组件。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'time',
() => import('./components/MyComponent.vue'),
)
</script>
<template>
<div>
<!-- Hydration is triggered after 1000ms. -->
<LazyHydrationMyComponent :hydrate-after="1000" />
</div>
</template>
时间策略适用于可以等待特定时间的组件。
条件策略 (If Strategy)
根据布尔条件水合组件。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'if',
() => import('./components/MyComponent.vue'),
)
const isReady = ref(false)
function myFunction () {
// Trigger custom hydration strategy...
isReady.value = true
}
</script>
<template>
<div>
<!-- Hydration is triggered when isReady becomes true. -->
<LazyHydrationMyComponent :hydrate-when="isReady" />
</div>
</template>
条件策略最适合可能不需要始终进行水合的组件。
从不水合 (Never Hydrate)
从不水合该组件。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'never',
() => import('./components/MyComponent.vue'),
)
</script>
<template>
<div>
<!-- This component will never be hydrated by Vue. -->
<LazyHydrationMyComponent />
</div>
</template>
监听水合事件
所有延迟水合组件在水合时都会触发 @hydrated 事件。
<script setup lang="ts">
const LazyHydrationMyComponent = defineLazyHydrationComponent(
'visible',
() => import('./components/MyComponent.vue'),
)
function onHydrate () {
console.log('Component has been hydrated!')
}
</script>
<template>
<div>
<LazyHydrationMyComponent
:hydrate-on-visible="{ rootMargin: '100px' }"
@hydrated="onHydrated"
/>
</div>
</template>
参数
为确保编译器正确识别此宏,请避免使用外部变量。以下做法将导致该宏无法被正确识别:
<script setup lang="ts">
const strategy = 'visible'
const source = () => import('./components/MyComponent.vue')
const LazyHydrationMyComponent = defineLazyHydrationComponent(strategy, source)
</script>
策略 (strategy)
- 类型:
'visible' | 'idle' | 'interaction' | 'mediaQuery' | 'if' | 'time' | 'never' - 必需:
true
| 策略 (Strategy) | 描述 |
|---|---|
visible | 当组件在视口中变得可见时进行水合。 |
idle | 当浏览器空闲时或在延迟后进行水合。 |
interaction | 在用户交互(例如点击、悬停)时进行水合。 |
mediaQuery | 当满足指定的媒体查询条件时进行水合。 |
if | 当满足指定的布尔条件时进行水合。 |
time | 在指定的延迟时间后进行水合。 |
never | 阻止 Vue 对该组件进行水合。 |
source
- 类型:
() => Promise<Component> - 必需:
true