vue实现懒加载原理
Vue 懒加载的实现原理
Vue 中的懒加载(Lazy Loading)通常用于延迟加载组件、路由或图片等资源,从而提升页面初始加载性能。以下是几种常见的懒加载实现方式及其原理:
组件懒加载
通过动态导入(Dynamic Import)结合 Vue 的异步组件实现懒加载。Webpack 或 Vite 会将动态导入的组件拆分为单独的 chunk,仅在需要时加载。
// Vue 2.x
const LazyComponent = () => import('./LazyComponent.vue');
// Vue 3.x
const LazyComponent = defineAsyncComponent(() => import('./LazyComponent.vue'));
原理:

- 使用
import()语法返回一个 Promise。 - Webpack/Vite 识别动态导入,生成独立 chunk 文件。
- 组件首次渲染时触发 chunk 加载,完成后渲染组件。
路由懒加载
Vue Router 支持懒加载路由,通过动态导入实现路由级代码分割。
const routes = [
{
path: '/lazy',
component: () => import('./views/LazyView.vue')
}
];
原理:

- 路由匹配时触发动态导入。
- 加载完成后渲染对应组件。
- 结合 Vue Router 的导航守卫,可在加载前显示加载状态。
图片懒加载
通过 Intersection Observer API 或滚动事件监听实现图片延迟加载。
原生实现示例:
<img v-lazy="imageUrl" data-src="actual-image.jpg">
// 自定义指令
Vue.directive('lazy', {
inserted: (el, binding) => {
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
el.src = binding.value;
observer.unobserve(el);
}
});
observer.observe(el);
}
});
原理:
- 图片初始占位符为空白或低分辨率图。
- 当图片进入视口时,替换为真实图片地址。
- 使用 Intersection Observer 避免频繁滚动计算。
第三方库支持
- vue-lazyload:封装了图片懒加载的常用功能。
- @vueuse/useIntersectionObserver:组合式 API 实现的观察器。
性能优化建议
- 结合预加载(Prefetch)或预加载提示(
<link rel="prefetch">)平衡懒加载和用户体验。 - 对关键组件避免懒加载,确保首屏速度。
- 使用 Loading 状态或骨架屏减少布局偏移(CLS)。






