vite 不内置加载占位符机制,需开发者手动实现:通过响应式 loading 标志控制骨架屏等 ui 渲染,并推荐使用 vue 的 defineasynccomponent 配合 loadingcomponent、delay 和 timeout 等选项深度集成。

JavaScript 中 Vite 本身不提供内置的“加载占位符”(如骨架屏、loading 状态组件)配置机制——它不自动注入 loading UI,也不在 import() 过程中默认包裹状态逻辑。占位符是应用层行为,需开发者结合异步加载流程手动实现。
动态导入时显示 loading 状态
最直接的方式是在调用 import() 前后控制一个响应式 loading 标志,配合 UI 展示占位内容:
- 定义一个响应式变量(如 Vue 的
ref(false)或 React 的useState(false))表示“正在加载” - 在触发动态导入前设为 true,导入成功或失败后设为 false
- 模板中用该变量条件渲染骨架屏、文字提示或 spinner
示例(Vue 3 + Composition API):
const isLoading = ref(false)<br>const loadComponent = async () => {<br> isLoading.value = true<br> try {<br> const mod = await import('./HeavyChart.vue')<br> return mod.default<br> } finally {<br> isLoading.value = false<br> }<br>}
封装可复用的异步组件包装器
避免每个地方重复写 loading 逻辑,可封装一个通用函数或组合式函数:
- 接收模块路径和可选的 fallback 组件(如
<skeleton></skeleton>) - 返回包含
Component、isLoading、error的响应式对象 - 支持超时、重试、错误降级等增强能力
这样在模板中就能统一使用:<component :is="asyncComp.Component" v-if="!asyncComp.isLoading"></component> + <skeleton v-else></skeleton>
与 Vue 异步组件深度集成
Vue 3 原生支持异步组件语法,Vite 完全兼容。推荐用 defineAsyncComponent 并传入 loading 状态钩子:
- 通过
loadingComponent选项指定占位组件(如Skeleton.vue) - 用
delay控制 loading 最短展示时间(防闪烁) - 用
timeout设置最大等待时长,超时触发errorComponent
示例:
import { defineAsyncComponent } from 'vue'<br>const AsyncReport = defineAsyncComponent({<br> loader: () => import('./ReportView.vue'),<br> loadingComponent: Skeleton,<br> delay: 200,<br> timeout: 5000,<br> errorComponent: ErrorTip<br>})
构建时预加载不影响占位逻辑
Vite 的 modulepreload 和 prefetch 是资源加载策略,和 UI 占位无直接关系。即使模块已被预加载,await import() 仍会返回 Promise,你依然需要处理其生命周期来控制 loading 状态。不要误以为开了 modulePreload 就不用写 loading 逻辑了——首屏不可见模块仍可能延迟解析,网络波动也会影响实际就绪时间。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











