千家信息网

vue3异步组件怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关vue3异步组件怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在vue3中,异步组件可以减少打包的结果,会将异步组件分开打包,会采用异步的方
千家信息网最后更新 2026年11月03日vue3异步组件怎么用

这篇文章给大家分享的是有关vue3异步组件怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在vue3中,异步组件可以减少打包的结果,会将异步组件分开打包,会采用异步的方式加载组件,可以有效的解决一个组件过大的问题;不使用异步组件,如果组件功能比较多打包出来的结果就会变大。

本教程操作环境:windows7系统、vue2.9.6版,DELL G3电脑。

异步组件是 vue 的一种新能优化的方法,比如可以运用在首屏加载等等场景。

1、异步组件可以减少打包的结果。会将异步组件分开打包,会采用异步的方式加载组件,可以有效的解决一个组件过大的问题。不使用异步组件,如果组件功能比较多打包出来的结果就会变大。

2、异步组件的核心可以给组件定义变成一个函数,函数里面可以用import语法,实现文件的分割加载,import语法是webpack提供的,采用的就是jsonp。

components:{  VideoPlay:(resolve)=>import("../components/VideoPlay")} components:{  VideoPlay(resolve) {    require(["../components/VideoPlay"], resolve)  }} 或者使用回调函数

原理

在createComponent方法中,会有相应的异步组件处理,首先定义一个asyncFactory变量,然后进行判断,如果组件是一个函数,然后会去调resolveAsyncComponent方法,然后将赋值在asyncFactory上的函数传进去,会让asyncFactory马上执行,执行的时候并不会马上返回结果,因为他是异步的,返回的是一个promise,这时候这个值就是undefined,然后就会先渲染一个异步组件的占位,空虚拟节点。如果加载完之后会调factory函数传入resolve和reject两个参数,执行后返回一个成功的回调和失败的回调,promise成功了就会调resolve,resolve中就会调取forceRender方法强制更新视图重新渲染,forceRender中调取的就是$forceUpdate,同时把结果放到factory.resolved上,如果强制刷新的时候就会再次走resolveAsyncComponent方法,这时候有个判断,如果有成功的结果就把结果直接放回去,这时候resolveAsyncComponent返回的就不是undefined了,就会接的创建组件,初始化组件,渲染组件。

源码

src/core/vdom/create-component.js

1、createComponent方法

export function createComponent (  Ctor: Class | Function | Object | void,  data: ?VNodeData,  context: Component,  children: ?Array,  tag?: string): VNode | Array | void {  let asyncFactory  if (isUndef(Ctor.cid)) { // 看组件是否是一个函数    asyncFactory = Ctor // 异步组件一定是一个函数 新版本提供了对象的写法    Ctor = resolveAsyncComponent(asyncFactory, baseCtor) //默认调用此函数时返回undefiend    // 第二次渲染时Ctor不为undefined    if (Ctor === undefined) {      //返回async组件的占位符节点      //作为注释节点,但保留该节点的所有原始信息      //该信息将用于异步服务器渲染和水合。      return createAsyncPlaceholder(        asyncFactory,        data,        context,        children,        tag      )    }  }}

2、resolveAsyncComponent方法

export function resolveAsyncComponent (  factory: Function,  baseCtor: Class): Class | void {  // 如果有错误就返回错误结果  if (isTrue(factory.error) && isDef(factory.errorComp)) {    return factory.errorComp  }  // 再次渲染时可以拿到获取的最新组件  // 如果有成功的结果,就直接返回去  if (isDef(factory.resolved)) {    return factory.resolved  }   if (owner && !isDef(factory.owners)) {    // forceRender 强制刷新渲染    const forceRender = (renderCompleted: boolean) => {      for (let i = 0, l = owners.length; i < l; i++) {        (owners[i]: any).$forceUpdate() // 执行$forceUpdate      }    }    // 成功    const resolve = once((res: Object | Class) => {      factory.resolved = ensureCtor(res, baseCtor)      if (!sync) {        forceRender(true) // 执行强制更新视图重新渲染方法      } else {        owners.length = 0      }    })    // 失败    const reject = once(reason => {      if (isDef(factory.errorComp)) {        factory.error = true        forceRender(true)      }    })     // 执行factory 将resolve方法和reject方法传入    const res = factory(resolve, reject)     sync = false    return factory.loading ? factory.loadingComp : factory.resolved // 返回结果  }}

3、createAsyncPlaceholder 方法

// 创建一个异步组件的占位,空虚拟节点   也就是一个注释export function createAsyncPlaceholder (  factory: Function,  data: ?VNodeData,  context: Component,  children: ?Array,  tag: ?string): VNode {  const node = createEmptyVNode()  node.asyncFactory = factory  node.asyncMeta = { data, context, children, tag }  return node}

感谢各位的阅读!关于"vue3异步组件怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

组件 方法 结果 函数 节点 强制 成功 就是 有效 信息 内容 再次 功能 方式 时候 更多 注释 篇文章 视图 语法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 广东猪兼强互联网科技有限公司 中国互联网科技工作委员会毛军 深圳恒合互联网络科技有限公司 互联网科技股票 易通互联网络科技有限公司 沃里互联网科技 菲比寻常互联网科技 互联网 科技服务平台 互联网公司会议桌创意科技软装饰 深圳市运趣互联网科技有限公司 互联网科技博主是什么意思 团飞科技与伯堂互联网服务平台 茂名市互联网科技产业园 广西互联网科技孵化中心 济南有互联网科技公司吗 本届互联网大会上的黑科技 同城互联网络科技 数字科技和互联网金融哪个好 广东猫王互联网科技有限公司电话 互联网科技保险 科技创新与互联网经济 常德市电业局互联网科技部 金融科技与互联网金融相同和不同 湖南一路畅行互联网科技 互联网5g黑科技有哪些 如何创新互联网科技 阿里互联网科技企业 吉林省码上互联网科技电话 武汉亿视互联网科技有限公司
0