【三十天精通Vue 3】 第十五天 Vue 3的异步组件和代码拆分

news2024/11/15 13:30:28

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

    • 引言
    • 一、Vue 3 中的异步组件
      • 1.1 异步组件的概念
      • 1.2 Vue 3 中的异步组件
        • 1.2.1 使用 import() 动态导入
        • 1.2.2 使用 defineAsyncComponent() 方法创建异步组件
        • 1.3.1 预加载异步组件
        • 1.3.2 懒加载异步组件
    • 二、Vue 3 中的代码拆分
      • 2.1 代码拆分的概念
      • 2.2 Vue 3 中的代码拆分
        • 2.2.1 使用 import() 动态导入
        • 2.2.2 使用 SplitChunksPlugin 插件进行代码拆分
      • 2.3 代码拆分的优化
        • 2.3.1 预加载代码块
      • 2.2 Vue 3 中的代码拆分
        • 2.2.1 使用 import() 动态导入
        • 2.2.2 使用 SplitChunksPlugin 插件进行代码拆分
      • 2.3 代码拆分的优化
        • 2.3.1 预加载代码块
        • 2.3.2 懒加载代码块
    • 三、Vue 3 中的异步组件和代码拆分最佳实践
      • 3.1 异步组件和代码拆分的最佳实践
      • 3.2 在 Vue 3 中的异步组件和代码拆分最佳实践
        • 3.2.1 在使用 import() 动态导入时的最佳实践
        • 3.2.2 在使用 defineAsyncComponent() 方法创建异步组件时的最佳实践
        • 3.2.3 在使用 SplitChunksPlugin 插件进行代码拆分时的最佳实践
    • 四、Vue 3 中的异步组件和代码拆分常见问题及解决方案
      • 4.1 如何处理异步组件和代码拆分后的模块依赖关系
      • 4.2 如何处理异步组件和代码拆分后的性能问题
      • 4.3 如何处理异步组件和代码拆分后的调试问题

引言

在现代 Web 应用程序中,性能是一个至关重要的因素。优化 Web 应用程序性能的一种常用方法是使用异步组件和代码拆分。在 Vue 3 中,异步组件和代码拆分得到了进一步的支持和优化。本文将详细介绍 Vue 3 中的异步组件和代码拆分,以及如何使用它们来提高应用程序的性能。

一、Vue 3 中的异步组件

1.1 异步组件的概念

异步组件是指在需要时才会被加载的组件。在Vue 3中,异步组件可以是通过使用import()函数动态导入组件,也可以通过使用defineAsyncComponent()方法创建异步组件。

异步组件的主要好处是可以将应用程序的初始加载时间降至最低,从而提高性能和用户体验。特别是在应用程序中包含大量组件的情况下,异步组件可以显著提高应用程序的性能。

1.2 Vue 3 中的异步组件

在Vue 3中,有两种方法可以创建异步组件:使用import()动态导入和使用defineAsyncComponent()方法。

1.2.1 使用 import() 动态导入

使用import()函数动态导入组件是Vue 3中创建异步组件的一种常见方式。以下是使用import()动态导入组件的示例:

const AsyncComponent = () => import('./AsyncComponent.vue')

使用import()函数动态导入组件时,组件会在需要时按需加载。这意味着组件不会在应用程序初始化时被加载,而是在组件实际被使用之前被加载。

1.2.2 使用 defineAsyncComponent() 方法创建异步组件

Vue 3还提供了defineAsyncComponent()方法来创建异步组件。以下是使用defineAsyncComponent()方法创建异步组件的示例:

import { defineAsyncComponent } from 'vue'

const AsyncComponent = defineAsyncComponent(() =>
  import('./AsyncComponent.vue')
)

使用defineAsyncComponent()方法创建异步组件时,需要将组件的导入包装在一个函数中。defineAsyncComponent()方法将此函数作为参数,并返回一个异步组件。

虽然异步组件可以显著提高应用程序的加载时间和性能,但是还有一些优化可以进一步提高异步组件的性能。

1.3.1 预加载异步组件

在某些情况下,预加载异步组件可以显著提高应用程序的性能。预加载异步组件是在组件被需要之前提前加载组件的一种技术。

以下是一个预加载异步组件的示例:

const AsyncComponent = () => import(/* webpackPrefetch: true */ './AsyncComponent.vue')

在此示例中,使用webpackPrefetch指令告诉Webpack在空闲时间预加载异步

组件。这意味着当应用程序需要使用此组件时,它已经被预加载到浏览器中,因此可以立即使用,而不需要等待加载。

1.3.2 懒加载异步组件

在某些情况下,即使是异步加载的组件也可能会影响应用程序的性能。这是因为异步组件会在首次渲染时加载,这可能会导致页面延迟。因此,懒加载异步组件可以进一步优化异步组件的性能。

以下是一个懒加载异步组件的示例:

const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'), {
  // 懒加载异步组件
  loader: () => import('./loading.vue'),
  // 阈值,当加载时间超过200ms时才显示loading组件
  delay: 200,
})

在此示例中,使用defineAsyncComponent()方法创建异步组件并懒加载组件。loader选项指定了一个loading组件,当异步组件加载时,它将显示loading组件。delay选项指定了异步组件加载超过200ms时才显示loading组件。这将确保当异步组件可以立即加载时,不会显示loading组件。

二、Vue 3 中的代码拆分

2.1 代码拆分的概念

代码拆分是指将应用程序的代码拆分成多个较小的部分,以便可以根据需要加载所需的部分,而不必加载整个应用程序。代码拆分可以显著提高应用程序的加载时间和性能。

2.2 Vue 3 中的代码拆分

2.2.1 使用 import() 动态导入

在Vue 3中,可以使用ES6的import()语法动态导入模块,以实现代码拆分。通过动态导入,只有在需要时才会加载特定的代码块。

以下是一个使用import()动态导入组件的示例:

const AsyncComponent = () => import('./AsyncComponent.vue')

2.2.2 使用 SplitChunksPlugin 插件进行代码拆分

除了使用import()语法进行代码拆分之外,还可以使用webpack的SplitChunksPlugin插件将应用程序的代码拆分成多个块。这样做可以进一步优化应用程序的加载时间和性能。

以下是一个使用SplitChunksPlugin插件进行代码拆分的示例:

// webpack.config.js

module.exports = {
  // ...
  optimization: {
    splitChunks: {
      chunks: 'all',
      minSize: 20000,
      maxSize: 70000,
      minChunks: 1,
      maxAsyncRequests: 30,
      maxInitialRequests: 30,
      automaticNameDelimiter: '~',
      enforceSizeThreshold: 50000,
      cacheGroups: {
        defaultVendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true
        }
      }
    }
  }
}

2.3 代码拆分的优化

2.3.1 预加载代码块

在某些情况下,预加载代码块可以显著提高应用程序的性能。预加载代码块是在代码块被需要之前提前加载代码块的一种技术。

以下是一个预加载代码块的示例:

const someModulePromise = import('./someModule.js')
someModulePromise.then(someModule => {
  someModule.preload()
})

在此示例中,我们使用import()动态导入一个模块,然后调用该模块的preload()方法来预加载该模块。2.1 代码拆分的概念

代码拆分是指将应用程序的代码拆分成多个较小的部分,以便可以根据需要加载所需的部分,而不必加载整个应用程序。代码拆分可以显著提高应用程序的加载时间和性能。

2.2 Vue 3 中的代码拆分

2.2.1 使用 import() 动态导入

在Vue 3中,可以使用ES6的import()语法动态导入模块,以实现代码拆分。通过动态导入,只有在需要时才会加载特定的代码块。

以下是一个使用import()动态导入组件的示例:

const AsyncComponent = () => import('./AsyncComponent.vue')

2.2.2 使用 SplitChunksPlugin 插件进行代码拆分

除了使用import()语法进行代码拆分之外,还可以使用webpack的SplitChunksPlugin插件将应用程序的代码拆分成多个块。这样做可以进一步优化应用程序的加载时间和性能。

以下是一个使用SplitChunksPlugin插件进行代码拆分的示例:

// webpack.config.js

module.exports = {
  // ...
  optimization: {
    splitChunks: {
      chunks: 'all',
      minSize: 20000,
      maxSize: 70000,
      minChunks: 1,
      maxAsyncRequests: 30,
      maxInitialRequests: 30,
      automaticNameDelimiter: '~',
      enforceSizeThreshold: 50000,
      cacheGroups: {
        defaultVendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true
        }
      }
    }
  }
}

2.3 代码拆分的优化

2.3.1 预加载代码块

在某些情况下,预加载代码块可以显著提高应用程序的性能。预加载代码块是在代码块被需要之前提前加载代码块的一种技术。

以下是一个预加载代码块的示例:

const someModulePromise = import('./someModule.js')
someModulePromise.then(someModule => {
  someModule.preload()
})

在此示例中,我们使用import()动态导入一个模块,然后调用该模块的preload()方法来预加载该模块。

2.3.2 懒加载代码块

懒加载代码块是一种在需要时才加载代码块的技术。与预加载代码块不同,懒加载代码块只有在需要时才会被加载,从而减少了应用程序的初始化时间。

Vue 3 中可以使用 dynamic import() 方法来实现懒加载代码块。以下是一个使用 dynamic import() 方法来懒加载代码块的示例:

const handleClick = async () => {
  const module = await import('./someModule.js')
  module.doSomething()
}

在此示例中,当 handleClick() 函数被调用时,会异步地加载 someModule.js 模块,并在加载完成后执行其中的 doSomething() 函数。

在使用懒加载代码块时,需要注意以下几点:

  1. 懒加载代码块应该包含在异步函数中。这样可以确保代码块在需要时才被加载。
  2. 在加载完成后,可以通过返回一个 Promise 对象来执行一些逻辑。例如,在上面的示例中,我们使用 await 关键字等待模块加载完成后再执行 doSomething() 函数。
  3. 懒加载代码块可以进一步优化,例如通过预加载来提前加载一些代码块,以减少懒加载时的延迟时间。

三、Vue 3 中的异步组件和代码拆分最佳实践

3.1 异步组件和代码拆分的最佳实践

异步组件和代码拆分可以显著提高应用程序的性能,但是需要注意一些最佳实践来确保它们的最佳效果。

以下是一些异步组件和代码拆分的最佳实践:

  1. 尽可能使用异步组件和代码拆分来减少初始加载时间。
  2. 预加载和懒加载异步组件和代码块以最大限度地减少加载时间和提高性能。
  3. 使用代码拆分来拆分应用程序代码,并通过减少每个页面所需的代码量来加速页面加载速度。
  4. 使用异步组件来延迟加载那些不是在初始页面加载时就必需的组件。
  5. 在异步组件中使用 v-cloak 或等效的技术来防止闪烁。
  6. 对于移动设备,尽可能减少异步组件和代码拆分的数量,以提高移动设备的性能和体验。

3.2 在 Vue 3 中的异步组件和代码拆分最佳实践

3.2.1 在使用 import() 动态导入时的最佳实践

在使用 import() 动态导入时,可以使用 webpackPrefetch 和 webpackPreload 指令来预加载和懒加载组件。

webpackPrefetch 允许浏览器在空闲时间预加载组件,而 webpackPreload 则允许浏览器在当前页面上加载组件。

另外,如果您使用 TypeScript,则可以在编译时使用 ts-loader 或者 babel-loader 进行类型检查和转译。

以下是一个使用 import() 动态导入的最佳实践示例:

const AsyncComponent = () => import(/* webpackPrefetch: true */ './AsyncComponent.vue')

3.2.2 在使用 defineAsyncComponent() 方法创建异步组件时的最佳实践

在使用 defineAsyncComponent() 方法创建异步组件时,可以使用 factory 函数来加载组件。factory 函数应该返回一个 Promise 对象,该对象包含组件的定义。

另外,您还可以使用 Suspense 组件来显示一个占位符,以便在组件加载时向用户提供更好的反馈。

以下是一个使用 defineAsyncComponent() 方法创建异步组件的最佳实践示例:

const AsyncComponent = defineAsyncComponent({
  loader: () => import('./AsyncComponent.vue'),
  delay: 200,
  timeout: 3000,
  suspensible: true,
  onError: (error) => {
    console.error('Error loading component:', error)
  },
})

3.2.3 在使用 SplitChunksPlugin 插件进行代码拆分时的最佳实践

在使用 SplitChunksPlugin 插件进行代码拆分时,可以使用以下配置选项来最大限度地减少加载时间和提高性能:

  1. 使用maxInitialRequestsmaxAsyncRequests选项限制同时加载的代码块数量,以避免同时加载过多的代码块,导致页面加载时间过长。
  2. 使用minSize选项来指定要拆分的代码块的最小大小,以避免将过小的代码块拆分出来,从而降低了代码的并行加载性能。
  3. 使用cacheGroups选项对代码块进行分组,以便在不同的分组之间进行代码拆分,并使用test选项来指定要匹配的模块。
  4. 使用filename选项来指定代码块的输出文件名,以避免生成过多的文件,从而导致浪费空间和降低性能。

例如,以下是一个最佳实践的配置示例:

optimization: {
  splitChunks: {
    cacheGroups: {
      defaultVendors: {
        test: /[\\/]node_modules[\\/]/,
        name: 'vendors',
        chunks: 'all'
      },
      default: {
        minChunks: 2,
        priority: -20,
        reuseExistingChunk: true
      }
    },
    maxInitialRequests: 5,
    maxAsyncRequests: 3,
    minSize: 10000,
    filename: '[name].[contenthash].js'
  }
}

这个配置示例将所有来自 node_modules 的代码块拆分为一个名为 vendors 的代码块,并对其他代码块进行默认拆分。它还使用了maxInitialRequestsmaxAsyncRequests选项限制了同时加载的代码块数量,并使用minSize选项来指定要拆分的代码块的最小大小。最后,它使用了filename选项来指定代码块的输出文件名,以便在生成文件时避免浪费空间。

四、Vue 3 中的异步组件和代码拆分常见问题及解决方案

4.1 如何处理异步组件和代码拆分后的模块依赖关系

当使用异步组件和代码拆分时,可能会出现模块依赖关系不正确的问题,导致应用程序无法正常运行。为了解决这个问题,可以使用以下技术:

  • 使用Webpack的代码分析工具,例如Webpack Bundle Analyzer来分析模块之间的依赖关系。
  • 确保在代码拆分和异步组件中正确地导入和导出模块。
  • 确保在代码拆分和异步组件中正确地使用Webpack的代码分割和分块技术。

4.2 如何处理异步组件和代码拆分后的性能问题

异步组件和代码拆分可以显著提高应用程序的性能,但是在某些情况下,可能会出现性能问题。为了解决这个问题,可以使用以下技术:

  • 使用Webpack的性能分析工具,例如Webpack Performance Profiler来分析应用程序的性能问题。
  • 确保在异步组件和代码拆分中正确地使用Webpack的代码分割和分块技术。
  • 确保异步组件和代码拆分只加载必要的代码块和模块,而不是所有的代码块和模块。

4.3 如何处理异步组件和代码拆分后的调试问题

异步组件和代码拆分可能会使调试过程更加困难。为了解决这个问题,可以使用以下技术:

  • 使用Webpack的sourcemap选项来提供更好的调试信息。
  • 在需要调试异步组件和代码拆分时,可以通过Webpack的devtool选项来指定合适的调试模式。
  • 在需要调试异步组件和代码拆分时,可以使用Vue Devtools来进行调试。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python机器学习、深度学习技术提升气象、海洋、水文领域应用

Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库,还有丰富的第三方库,Python在数据处理、科学计算、数学建模、数据挖…

设计模式--原型模式

目录 基本介绍 传统方式克隆 原型模式改进 浅拷贝和深拷贝 浅拷贝的介绍 深拷贝的介绍 原型模式的注意事项和细节 基本介绍 (1) 原型模式(prototype模式): 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 (2) 原型模式是一种创建型设计模式 允许一个…

妙用Java 8中的 Function接口,消灭if...else

在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...。 if (...){throw new RuntimeException("出现异常了")&#x…

全网详细解决1093 - You can‘t specify target table ‘xxx‘ for update in FROM clause的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误 1. 复现错误 今天在工作时,接到一个新需求,就是将app_page_button表中的label_code字段修改为edit,条件如下: 只更新值为null的label_code 且以/edit/${id}结尾的option_value 首先…

基于微信小程序+爬虫制作一个表情包小程序

跟朋友聊天斗图失败气急败坏的我选择直接制作一个爬虫表情包小程序,从源头解决问题,从此再也不用担心在斗图中落入下风 精彩专栏持续更新↓↓↓ 微信小程序实战开发专栏 一、API1.1 项目创建1.2 图片爬虫帮助类1.3 测试窗体1.4 接口封装二、小程序2.1 项目创建2.2 页面设计2.…

css 实现太极效果

目录 一、简述二、太极效果制作 一、简述 本次主要介绍::after,::before,box-shadow这三个属性。 ::after,::before这两个是伪类选择器,box-shaow是用来设置元素的阴影效果 before:向选定的元素前插入内容 after:向选定的元素后插…

关于在线CAD编辑的解决方案思考

基于ODA的VisualizeJs库的能力 ODA官网的OpenCloud提供了在线浏览CAD图纸的能力(ODA自身也不支持直接在线解析Dwg,而是通过ODA提供的WebTools里面的FileConverter的能力将dwg图纸转换为VSF格式(CAD的一种二三维格式,在AutoCAD中也有一种类似的ForgeView…

chatGPT衣食住行10种场景系列教程(01)使用chatGPT设计发型、P图变漂亮~真帅哈哈哈~

导读 时隔5个多月,chatGPT可谓是一日千里,越演越火,携带着AIGC行业一起飞了起来,那么在短短5个月当中有那些值得我们关注的事件?有那些好玩的场景?以及有那些chatGPT好用的工具?本文都将一一告…

neo4j数据库的安装及使用

一、安装neo4j 安装neo4j数据库,需要先安装jdk,jdk版本不能太低,不然运行neo4j的时候会报错。 我下载的是jdk11,以前已经下载过了,这里不再进行演示,下载jdk11的教程应该挺多的,自己搜一个吧 …

nodejs+vue美容院预约管理系统springboot+java+python

本课题将根据用户类型大致划分为管理员模块和美容师模块和用户模块,开发语言拟采用目前比较 语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode ,界面采用vue前端框…

jsp+servlet教材预定系统mysql

目 录 一、引言 6 (一) 课题目的及意义 6 1、课题目的 6 2、课题研究意义 6 (二) 国内外研究现状 6 1、国外研究现状 6 2、国内研究现状 7 (三) 研究方法及设计思路 7 1、研究方法 7 2、设计思路 8 二、需求分析与可行性分析 9 (一) 需求分析…

源码:LeakCanary

一、介绍 自动检测内存泄漏的检查工具 二、使用 debugImplementation com.squareup.leakcanary:leakcanary-android:2.5debugImplementation只在debug模式的编译和最终的debug apk打包时有效 Memory Profiler 使用步骤 生成的内存泄漏快照 会放在sdcard/Download/leakcanar…

Node【Global全局对象】之【URL】

文章目录 🌟前言🌟URL🌟URL组成部分🌟URL 类🌟url.href🌟url.pathname🌟url.port🌟url.protocol🌟url.search🌟url.searchParams🌟url.hash&#…

DAY829

学习目标:成就上瘾,学到欲罢不能 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:背单词150个,背《死亡诗社》经典语段,抄写…

【web前端开发】CSS定位

文章目录 1.定位介绍2.定位的方式2.1 相对定位2.2 绝对定位2.2.1 子绝父相 2.3 固定定位 3. 元素的层级关系4. 总结 1.定位介绍 定位有两个作用: 1.可以解决盒子和盒子之间的层叠问题 (定位之后元素层级最高,可以层叠在其它盒子上面) 2.可以让盒子始终固定在屏幕中的某个位置 …

shell呈现数据

shell脚本编程系列 理解输入和输出 目前为止了解了两种显示脚本输出的方法:在显示器屏幕上显示输出,将输出重定向到文件中,这两种方法将数据输出全部显示出来,要么什么都不显示,但有时一部分数据显示屏幕上&#xff0…

Android---启动页+闪屏页

目录 启动页 闪屏页 启动页 app 在进入首页面的过程中,都会线加载一张图片然后再进入闪屏页。这样,可以给用户很好的体验。 作用:避免加载白屏页面,进行业务的预处理(网络检测、数据预加载...) 界面组成…

基于Pyqt5快速构建应用程序详细教程

一、介绍 图形用户界面,更广为人知的名称是 GUI,是当今大多数个人计算机的一个特征。 它为不同计算技能水平的用户提供了直观的体验。 尽管 GUI 应用程序可能会使用更多资源,但由于其点击式特性,它们通常对用户友好。 PyQt 是可用…

最小生成树|二分图

最小生成树跟边的正负没有任何关系。 最小生成树 朴素Prime 该算法和Dijkstr算法很像。 先把所有距离初始化为正无穷 进行n次迭代 找到不在集合(集合指当前的生成树)当中的点,s数组表示当前已经在连通块(生成树)中的所…

vue-simple-uploader在VUE3中分片上传大文件

vue-simple-uploader是一个优秀的大文件分片上传组件,在vue2里面工作一切正常,但是在vue3里面却发现了一些问题: (1)在element-plus的el-dialog里面渲染失败; (2)上传进度条不能正…