import() 实现预判式加载,核心是在用户操作前依悬停、路由切换、空闲时段等信号提前加载资源,配合缓存、错误处理与边界降级,提升响应速度并消除白屏。

用 import() 实现“预判式加载”,核心不是等用户点完再加载,而是根据用户行为倾向,在操作发生前就悄悄拉取资源——比如悬停时预加载、路由切换前预取、或在空闲时段提前 fetch 下一个模块。这能显著压缩操作响应间隙,让页面“几乎无感”地完成切换,白屏感自然消失。
基于用户行为的预加载时机
预判的关键是捕捉可预测的操作信号,而不是盲目加载:
-
鼠标悬停(hover)触发:当用户把鼠标移到某个菜单项或按钮上超过300ms,可认为有较高概率点击,此时调用
import('./OrderDetail.vue')开始加载,但不立即挂载组件 -
路由离开前预取:在当前页面的
beforeRouteLeave或onBeforeUnmount中,判断下一个可能去的路径(如从列表页跳转详情页),主动执行import()并缓存 Promise -
空闲时段加载:利用
requestIdleCallback在浏览器空闲时预加载非首屏模块,避免抢占主线程,例如:if ('requestIdleCallback' in window) {<br> requestIdleCallback(() => import('./AnalyticsDashboard.vue'));<br>}
预加载结果的缓存与复用
单纯调用 import() 不做管理,容易重复请求或丢失结果。建议封装成可复用的预加载函数:
- 用 Map 或 WeakMap 缓存已发起的 Promise,相同路径再次调用直接返回已有 Promise
- 加载成功后暂存组件定义(如
const comp = await promise),后续真正需要渲染时直接传入 Vue 的:is或动态组件中 - 避免预加载失败被忽略:给 Promise 加
.catch(console.warn),并在调试环境提示“预加载未命中”,便于排查路径配置问题
配合路由与状态做轻量级“热备”
对高频访问的二级页面(如个人中心、消息页),可在主布局初始化后,用 Promise.allSettled 并行预加载几个关键模块:
- 不阻塞首屏,也不影响当前交互,只是让资源提前进内存或缓存
- 结合
webpackChunkName注释,确保打包后 chunk 名稳定,利于 HTTP 缓存复用 - 示例:
Promise.allSettled([<br> import(/* webpackChunkName: "profile" */ './views/Profile.vue'),<br> import(/* webpackChunkName: "notify" */ './views/Notify.vue')<br>]);
注意边界与降级处理
预加载不是万能的,需考虑实际约束:
- 移动弱网环境下慎用 hover 预加载,可加网络类型判断(
navigator.onLine+navigator.connection.effectiveType) - 预加载模块体积不宜过大,否则反而拖慢当前页;建议单个预加载模块控制在 100KB 以内(gzip 后)
- 始终保留 fallback:即使预加载失败,也要保证
import()在正式调用时仍能执行,不能因预加载逻辑导致功能不可用










