Skip to content
āĻāχ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ

Async Components ​

Basic Usage ​

āĻŦāĻĄāĻŧ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāĻžāύāϗ⧁āϞāĻŋāϤ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āĻ…ā§āϝāĻžāĻĒāϟāĻŋāϕ⧇ āϛ⧋āϟ āϛ⧋āϟ āĻ–āĻŖā§āĻĄā§‡ āĻ­āĻžāĻ— āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϞ⧇āχ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāϟāĻŋ āϏāĻŽā§āĻ­āĻŦ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, Vue āĻāϰ āĻāĻ•āϟāĻŋ defineAsyncComponent āĻĢāĻžāĻ‚āĻļāύ āϰāϝāĻŧ⧇āϛ⧇:

js
import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() => {
  return new Promise((resolve, reject) => {
    // ...load component from server
    resolve(/* loaded component */)
  })
})
// ... use `AsyncComp` like a normal component

āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, defineAsyncComponent āĻāĻ•āϟāĻŋ āϞ⧋āĻĄāĻžāϰ āĻĢāĻžāĻ‚āĻļāύ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āϝāĻ–āύ āφāĻĒāύāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āφāĻĒāύāĻžāϰ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āϏāĻ‚āĻœā§āĻžāĻž āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇āϛ⧇āύ āϤāĻ–āύ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋāϰ resolve āĻ•āϞāĻŦā§āϝāĻžāĻ• āĻ•āϞ āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤ āφāĻĒāύāĻŋ āϞ⧋āĻĄ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ⧇āϛ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāϤ⧇ reject(reason) āĻ•āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

ES āĻŽāĻĄāĻŋāωāϞ āĻĄāĻžāχāύāĻžāĻŽāĻŋāĻ• āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇, āϤāĻžāχ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āϏāĻŽāϝāĻŧ āφāĻŽāϰāĻž āĻāϟāĻŋāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āĻ¤ā§āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ fineAsyncComponent. Vite āĻāĻŦāĻ‚ āĻ“āϝāĻŧ⧇āĻŦāĻĒā§āϝāĻžāϕ⧇āϰ āĻŽāϤ⧋ āĻŦāĻžāĻ¨ā§āĻĄāϞāĻžāϰāϗ⧁āϞāĻŋāĻ“ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ (āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻŦāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ¸ā§āĻĒā§āϞāĻŋāϟ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇), āϤāĻžāχ āφāĻŽāϰāĻž āĻāϟāĻŋ Vue SFC āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ:

js
import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() =>
  import('./components/MyComponent.vue')
)

āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ AsyncComp āĻšāϞ āĻāĻ•āϟāĻŋ āĻ°â€ā§āϝāĻžāĻĒāĻžāϰ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āϝāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϞ⧋āĻĄāĻžāϰ āĻĢāĻžāĻ‚āĻļāύāϕ⧇ āĻ•āϞ āĻ•āϰ⧇ āϝāĻ–āύ āĻāϟāĻŋ āφāϏāϞ⧇ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āϰ⧇āĻ¨ā§āĻĄāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āωāĻĒāϰāĻ¨ā§āϤ⧁, āĻāϟāĻŋ āϝ⧇āϕ⧋āύ⧋ āĻĒā§āϰāĻĒāϏ āĻāĻŦāĻ‚ āĻ¸ā§āϞāϟ āĻŦāϰāĻžāĻŦāϰ āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āĻŸā§‡ āϚāϞ⧇ āϝāĻžāĻŦ⧇, āϤāĻžāχ āφāĻĒāύāĻŋ āĻ…āϞāϏ āϞ⧋āĻĄāĻŋāĻ‚ āĻ…āĻ°ā§āϜāύ⧇āϰ āϏāĻŽāϝāĻŧ āĻŽā§‚āϞ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϟāĻŋāϕ⧇ āύāĻŋāĻ°ā§āĻŦāĻŋāĻ˜ā§āύ⧇ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ• āĻ°â€ā§āϝāĻžāĻĒāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āϏāĻžāϧāĻžāϰāĻŖ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āĻŽāϤ⧋, async āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ app.component() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ registered globally āĻšāϤ⧇ āĻĒāĻžāϰ⧇:

js
app.component(
  'MyComponent',
  defineAsyncComponent(() => import('./components/MyComponent.vue'))
)

āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ: āφāĻĒāύāĻŋ defineAsyncComponent āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

vue
<script>
import { defineAsyncComponent } from 'vue'

export default {
  components: {
    AdminPage: defineAsyncComponent(() =>
      import('./components/AdminPageComponent.vue')
    )
  }
}
</script>

<template>
  <AdminPage />
</template>

āĻāϗ⧁āϞāĻŋ āϏāϰāĻžāϏāϰāĻŋ āϤāĻžāĻĻ⧇āϰ āĻŽā§‚āϞ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āĻŸā§‡āϰ āĻ­āĻŋāϤāϰ⧇āĻ“ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇:

vue
<script setup>
import { defineAsyncComponent } from 'vue'

const AdminPage = defineAsyncComponent(() =>
  import('./components/AdminPageComponent.vue')
)
</script>

<template>
  <AdminPage />
</template>

Loading and Error States ​

āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇ āĻ…āύāĻŋāĻŦāĻžāĻ°ā§āϝāĻ­āĻžāĻŦ⧇ āϞ⧋āĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āϜāĻĄāĻŧāĻŋāϤ - defineAsyncComponent() āωāĻ¨ā§āύāϤ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāχ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇:

js
const AsyncComp = defineAsyncComponent({
  // the loader function
  loader: () => import('./Foo.vue'),

  // A component to use while the async component is loading
  loadingComponent: LoadingComponent,
  // Delay before showing the loading component. Default: 200ms.
  delay: 200,

  // A component to use if the load fails
  errorComponent: ErrorComponent,
  // The error component will be displayed if a timeout is
  // provided and exceeded. Default: Infinity.
  timeout: 3000
})

āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āϞ⧋āĻĄāĻŋāĻ‚ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻāϟāĻŋ āĻĒā§āϰāĻĨāĻŽā§‡ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšāĻŦ⧇ āϝāĻ–āύ āĻ­āĻŋāϤāϰ⧇āϰ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϟāĻŋ āϞ⧋āĻĄ āĻšāĻšā§āϛ⧇⧎ āϞ⧋āĻĄāĻŋāĻ‚ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āĻĻ⧇āĻ–āĻžāύ⧋āϰ āφāϗ⧇ āĻāĻ•āϟāĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āϟ 200ms āĻŦāĻŋāϞāĻŽā§āĻŦ āφāϛ⧇ - āĻāϰ āĻ•āĻžāϰāĻŖ āĻšāϞ āĻĻā§āϰ⧁āϤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āϗ⧁āϞāĻŋāϤ⧇, āĻāĻ•āϟāĻŋ āϤāĻžāĻ¤ā§āĻ•ā§āώāĻŖāĻŋāĻ• āϞ⧋āĻĄāĻŋāĻ‚ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āϖ⧁āĻŦ āĻĻā§āϰ⧁āϤ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻāĻžāρāϕ⧁āύāĻŋāϰ āĻŽāϤ⧋ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤

āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻāϟāĻŋ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšāĻŦ⧇ āϝāĻ–āύ āϞ⧋āĻĄāĻžāϰ āĻĢāĻžāĻ‚āĻļāύ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻ¤ā§āϝāĻžāĻŦāĻ°ā§āϤāĻŋāϤ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āϟāĻŋ āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āϏāĻŽāϝāĻŧ āύāĻŋāϞ⧇ āφāĻĒāύāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϟāĻŋ āĻĻ⧇āĻ–āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

Lazy Hydration ​

āĻāχ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϤāĻ–āύāχ āĻĒā§āϰāϝ⧋āĻœā§āϝ āϝāĻ–āύ āφāĻĒāύāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ-āϏāĻžāχāĻĄ āϰ⧇āĻ¨ā§āĻĄāĻžāϰāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āύāĨ¤

Vue 3.5+ āĻ, āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ• āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻšāĻžāχāĻĄā§āϰ⧇āĻļāύ āĻ•ā§ŒāĻļāϞ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ āĻšāĻžāχāĻĄā§āϰ⧇āĻŸā§‡āĻĄ āĻšāϞ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

  • Vue āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āĻšāĻžāχāĻĄā§āϰ⧇āĻļāύ āĻ•ā§ŒāĻļāϞāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ–ā§āϝāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻāχ āĻ…āĻ¨ā§āϤāĻ°ā§āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āĻ•ā§ŒāĻļāϞāϗ⧁āϞāĻŋ āĻĒ⧃āĻĨāĻ•āĻ­āĻžāĻŦ⧇ āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϝāĻžāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰāĻž āĻšāϞ⧇ āϏ⧇āϗ⧁āϞāĻŋ āĻ—āĻžāĻ›-āĻ•āĻžāρāĻĒāĻžāύ⧋ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

  • āύāĻ•āĻļāĻžāϟāĻŋ āχāĻšā§āĻ›āĻžāĻ•ā§ƒāϤāĻ­āĻžāĻŦ⧇ āĻĢā§āϞ⧇āĻ•ā§āϏāĻŋāĻŦāϞāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻŽā§āύ-āĻ¸ā§āϤāϰ⧇āϰāĨ¤ āĻ•āĻŽā§āĻĒāĻžāχāϞāĻžāϰ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āϏ⧁āĻ—āĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝāĻ­āĻžāĻŦ⧇ āĻāϟāĻŋāϰ āωāĻĒāϰ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻŽā§‚āϞ āĻŦāĻž āωāĻšā§āϚ āĻ¸ā§āϤāϰ⧇āϰ āϏāĻŽāĻžāϧāĻžāύāϗ⧁āϞāĻŋāϤ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ (āϝ⧇āĻŽāύ Nuxt)āĨ¤

Hydrate on Idle ​

Hydrates via requestIdleCallback:

js
import { defineAsyncComponent, hydrateOnIdle } from 'vue'

const AsyncComp = defineAsyncComponent({
  loader: () => import('./Comp.vue'),
  hydrate: hydrateOnIdle(/* optionally pass a max timeout */)
})

Hydrate on Visible ​

āϝāĻ–āύ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ(āϗ⧁āϞāĻŋ) IntersectionObserver āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻšāϝāĻŧ āϤāĻ–āύ āĻšāĻžāχāĻĄā§āϰ⧇āϟ āĻ•āϰ⧁āύ⧎

js
import { defineAsyncComponent, hydrateOnVisible } from 'vue'

const AsyncComp = defineAsyncComponent({
  loader: () => import('./Comp.vue'),
  hydrate: hydrateOnVisible()
})

āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāϕ⧇āϰ āϜāĻ¨ā§āϝ āϐāĻšā§āĻ›āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻŽāĻžāύ āĻĒāĻžāϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇:

js
hydrateOnVisible({ rootMargin: '100px' })

Hydrate on Media Query ​

āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŽāĻŋāĻĄāĻŋāϝāĻŧāĻž āĻ•ā§āϝ⧋āϝāĻŧāĻžāϰ⧀ āĻŽāĻŋāϞ⧇ āϗ⧇āϞ⧇ āĻšāĻžāχāĻĄā§āϰ⧇āϟ āĻ•āϰ⧇āĨ¤

js
import { defineAsyncComponent, hydrateOnMediaQuery } from 'vue'

const AsyncComp = defineAsyncComponent({
  loader: () => import('./Comp.vue'),
  hydrate: hydrateOnMediaQuery('(max-width:500px)')
})

Hydrate on Interaction ​

āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟ āĻāϞāĻŋāĻŽā§‡āĻ¨ā§āĻŸā§‡ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϘāϟāύāĻž(āϗ⧁āϞāĻŋ) āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻšāϞ⧇ āĻšāĻžāχāĻĄā§āϰ⧇āϟ āĻšāϝāĻŧāĨ¤ āϝ⧇ āχāϭ⧇āĻ¨ā§āϟāϟāĻŋ āĻšāĻžāχāĻĄā§āϰ⧇āĻļāύāϕ⧇ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧇āϛ⧇ āϤāĻž āĻšāĻžāχāĻĄā§āϰ⧇āĻļāύ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϞ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϞ⧇ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤

js
import { defineAsyncComponent, hydrateOnInteraction } from 'vue'

const AsyncComp = defineAsyncComponent({
  loader: () => import('./Comp.vue'),
  hydrate: hydrateOnInteraction('click')
})

āĻāĻ•āĻžāϧāĻŋāĻ• āχāϭ⧇āĻ¨ā§āϟ āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻžāĻ“ āĻšāϤ⧇ āĻĒāĻžāϰ⧇:

js
hydrateOnInteraction(['wheel', 'mouseover'])

Custom Strategy ​

ts
import { defineAsyncComponent, type HydrationStrategy } from 'vue'

const myStrategy: HydrationStrategy = (hydrate, forEachElement) => {
  // forEachElement is a helper to iterate through all the root elements
  // in the component's non-hydrated DOM, since the root can be a fragment
  // instead of a single element
  forEachElement(el => {
    // ...
  })
  // call `hydrate` when ready
  hydrate()
  return () => {
    // return a teardown function if needed
  }
}

const AsyncComp = defineAsyncComponent({
  loader: () => import('./Comp.vue'),
  hydrate: myStrategy
})

Using with Suspense ​

Async āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ <Suspense> āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ <Suspense> āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ• āĻ•āĻŽā§āĻĒā§‹āύ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āύāĻĨāĻŋāϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ <Suspense>-āĻāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻŦ⧇āĻĻāĻŋāϤ āĻ…āĻ§ā§āϝāĻžāϝāĻŧ⧇āĨ¤

Async Components has loaded