Vue Suspense 可在企业正式首页实现模块按需等待,核心是用<Suspense>包裹异步组件(如远程数据组件、动态Banner),配合defineAsyncComponent或async setup自动等待内部Promise完成并展示fallback。
Vue Suspense 可以在企业正式首页实现模块按需等待,核心是把异步组件(比如远程获取数据的组件、动态加载的 Banner 或产品列表)用 <Suspense> 包裹,并配合 setup 中的 defineAsyncComponent 或 async setup 函数。它不直接控制“加载时机”,而是让 Vue 在组件挂载时自动等待其内部 Promise 完成,期间展示 fallback 内容。
首页中需要延迟加载或依赖异步数据的模块(如最新新闻、客户案例、动态统计数字),应独立成单文件组件,并通过 defineAsyncComponent 引入。避免直接 import 同步加载,否则会阻塞首屏渲染。
defineAsyncComponent(() => import('./components/NewsSection.vue'))
setup 可直接写 await 请求,例如 const res = await fetch('/api/news')
onMounted + axios 模拟异步——这样 Suspense 无法感知,fallback 不会生效一个 <Suspense> 可以包裹多个子组件,但只有第一个遇到 pending 状态的组件会触发 fallback。建议按区域拆分,每个关键模块单独配一个 Suspense,提升可控性。
<Suspense fallback="加载中..."><NewsSection /></Suspense>
Suspense 提供了 pending 和 resolved 状态,可通过 v-if 或插槽响应式控制 UI。例如在加载时隐藏旧内容、禁用按钮、或显示占位高度防止布局跳动。
<template #fallback><Skeleton /></template> 实现视觉连贯timeout 属性(需 Vue 3.4+),超时后直接展示 error fallback在 Nuxt 或纯 SSR 环境中,Suspense 的 fallback 会在服务端渲染为静态内容,而 async setup 里的请求实际发生在客户端。若需服务端预取数据,应结合 asyncData 或 useAsyncData(Nuxt)等方案,而非仅靠 Suspense。
setup 中的 await 不会等待完成再输出 HTML,所以服务端不会等异步组件就绪