Vue中import为什么可以异步加载示例详解

 更新时间:2026年05月28日 10:47:10   作者:小小小小宇  
异步组件是实现这一目标的一种高效方式,它允许Vue在需要时才加载组件的代码,从而显著减少应用的初始加载时间,这篇文章主要介绍了Vue中import为什么可以异步加载的相关资料,需要的朋友可以参考下

这个问题涉及两个层面:JavaScript 语言层面的动态 importVue 框架对异步组件的封装

1. JavaScript 动态import()—— 语言基础

ES2020 引入了 动态 import() 语法,和静态 import 有本质区别:

静态 import动态 import()
语法import X from './X'const X = await import('./X')
执行时机编译时加载,必须先解析运行时按需加载
返回值直接拿到模块绑定返回 Promise<Module>
位置只能在模块顶层可以在任何地方调用
// 静态 import —— 同步解析,必须放在文件顶部
import MyComp from './MyComp.vue'

// 动态 import() —— 返回 Promise,可以按需调用
button.onclick = async () => {
  const module = await import('./HeavyLib.js')
  module.doSomething()
}

为什么动态 import() 能异步? 因为浏览器/打包器(如 Webpack、Vite)会将动态导入的模块单独拆分成 chunk,运行时通过 Promise + <script> 标签动态加载,不会阻塞当前模块的执行。

2. Vue 的异步组件 —— 框架层封装

Vue 利用动态 import 这个语言特性,在框架层面做了封装:

// Vue 3 定义异步组件
import { defineAsyncComponent } from 'vue'

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

// 或者直接在 components 中使用
export default {
  components: {
    AsyncComp: () => import('./HeavyComp.vue')  // 简写
  }
}

Vue 异步组件的工作原理:

  1. 组件注册时,Vue 发现 defineAsyncComponent 或返回 Promise 的函数,不会立即渲染
  2. 当该组件真正需要渲染(进入视口、条件渲染触发)时,Vue 才调用工厂函数
  3. 工厂函数触发 import() → 网络加载 chunk → 解析模块
  4. 加载期间 Vue 显示 loading 状态(可选)
  5. Promise resolve 后,Vue 用拿到的组件定义替换占位,触发重新渲染
用户访问页面
    │
    ▼
Vue 初始化,遇到 async component
    │
    ▼
先渲染 loading/suspense 占位  (不阻塞页面)
    │
    ▼
组件需要渲染时 → 触发 import()
    │
    ▼
网络异步加载 chunk ── 同时页面其他部分正常工作
    │
    ▼
chunk 下载完成 → Promise resolve
    │
    ▼
替换占位,渲染真实组件

3. 结合 webpack/Vite 的代码分割

打包工具看到 import() 语法后会自动做 Code Splitting

// webpack 魔法注释(控制分包行为)
const About = () => import(/* webpackChunkName: "about" */ './About.vue')

// Vite 中直接使用即可,自动分包
const About = () => import('./About.vue')

最终输出:

dist/
  ├── index.html
  ├── assets/
  │   ├── index-abc123.js      ← 主包
  │   ├── about-def456.js      ← 异步 chunk,首次不加载
  │   └── ...

总结

Vue import 能异步加载的根本原因是:

  1. JavaScript import() 返回 Promise,这是 ECMAScript 标准的一部分
  2. 打包工具识别 import() 后自动拆分代码为独立 chunk
  3. Vue 框架封装了生命周期管理(loading/error/timeout/重试),让异步组件对开发者友好

三层合力实现了"按需加载、不阻塞首屏"的效果。

到此这篇关于Vue中import为什么可以异步加载的文章就介绍到这了,更多相关Vue import异步加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue表格组件Vxe-table使用技巧总结

    Vue表格组件Vxe-table使用技巧总结

    这篇文章主要给大家介绍了关于Vue表格组件Vxe-table使用技巧的相关资料,文中还介绍了VXEtable展示指定行所遇到得问题,对大家学习或者使用Vxe-table具有一定的参考学习价值,需要的朋友可以参考下
    2022-09-09
  • vue递归实现自定义tree组件

    vue递归实现自定义tree组件

    这篇文章主要为大家详细介绍了vue递归实现自定义tree组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • vue中组件通信的八种方式(值得收藏!)

    vue中组件通信的八种方式(值得收藏!)

    这篇文章主要给大家总结介绍了关于vue中八种组件通信方式的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Vue 3 表单与后端数据交互之查询并回显数据步骤流程

    Vue 3 表单与后端数据交互之查询并回显数据步骤流程

    本文给大家介绍Vue3表单与后端数据交互之查询并回显数据步骤流程,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Vue项目路由刷新的实现代码

    Vue项目路由刷新的实现代码

    这篇文章主要介绍了Vue项目路由刷新的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 详解lottie动画在vue中的应用

    详解lottie动画在vue中的应用

    Lottie 是一个适用于 Android、iOS、Web 和 Windows 的库,它使用 Bodymovin 解析导出为 JSON 的 Adobe After Effects 动画,下面我们就来看看它在vue中的是如何应用的吧
    2023-12-12
  • Vue3如何处理重复渲染代码的问题

    Vue3如何处理重复渲染代码的问题

    这篇文章主要来和大家一起探讨一下在Vue3项目中如何处理重复渲染代码的问题,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Vue利用广度优先搜索实现watch

    Vue利用广度优先搜索实现watch

    这篇文章主要为大家学习介绍了Vue如何利用广度优先搜索实现watch(有意思),文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • 详解关于element级联选择器数据回显问题

    详解关于element级联选择器数据回显问题

    这篇文章主要介绍了详解关于element级联选择器数据回显问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 在Vue中创建可重用的 Transition的方法

    在Vue中创建可重用的 Transition的方法

    这篇文章主要介绍了在Vue中创建可重用的 Transition,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论