浅析JS异步加载进度条

yizhihongxing

浅析JS异步加载进度条

一、前言

异步加载(Async Loading)已成为一个前端性能优化点,webpack做内部打包时自动对异步进行按需加载,并做了很多优化点。而进度条是主流的展示加载进度的方式之一,那么在HTML页面使用异步加载做进度条的展示时,该如何处理呢?下面是本人介绍的示例。

二、实现思路

  1. 加载异步组件时,先加载进度条组件
  2. 获取异步加载的总文件数量,通过动态修改进度条组件的宽度来呈现当前加载进度

三、实现过程

以Vue为例子,假设你需要加载三个组件,这三个组件分别是 a.vueb.vuec.vue,那么示例代码如下:

<template>
  <div id="app">
    <progress-bar :percent="percent"/>
    <keep-alive>
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

<script>
import ProgressBar from './components/ProgressBar.vue'
export default {
  components: {
    ProgressBar
  },
  data () {
    return {
      percent: 0, // 进度条百分比
      count: 0, // 已加载文件数量
      total: 0 // 总文件数量
    }
  },
  beforeRouteEnter (to, from, next) {
    // 加载异步组件之前,先加载进度条组件
    const loadingInstance = this.$loading({
      lock: true,
      text: 'Loading',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    })

    // 获取异步加载的总文件数量
    const matches = to.matched.reduce((prev, curr) => prev.concat(curr.components.default), [])
    this.total = matches.length

    // 将计算百分比的方法挂载到loading实例上
    loadingInstance.calculatePercent = () => {
      this.percent = Math.floor(++this.count / this.total * 100)
      if (this.percent >= 100) {
        setTimeout(() => {
          loadingInstance.close()
        }, 800)
      }
    }

    // 在loading实例中同步进度条进度
    loadingInstance.syncProgressBar = () => {
      loadingInstance.calculatePercent()
      if (this.percent < 100) {
        setTimeout(() => {
          loadingInstance.syncProgressBar()
        }, 200)
      }
    }

    // 加载异步组件
    Promise.all(matches.map(component => {
      return component()
    })).then(() => {
      loadingInstance.calculatePercent()
    })
  }
}
</script>

四、示例说明

示例1:

在等待加载资源的页面或页面插件中加入进度条展示,增强用户体验,方便用户知道还需要等待多长时间。

示例2:

假设本地代码都已经做了很好的打包和拆分优化工作,在该文方法的基础上,用户使用了外部资源,在外部资源加载完成之前,页面进度条会呈现加载状态,并配合提示语展示当前状态,帮助用户评估资源加载总体时间,减少异常停留的时间。

五、总结

JS异步加载进度条,这篇文章主要介绍了如何使用JavaScript引入异步组件时,在加载组件之前先加载进度条组件,并动态修改进度条组件的宽度来呈现当前加载进度。以上示例也许不能完全满足你的需求,但是基本思路是值得学习的,你可以根据自己的需求进行改造。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析JS异步加载进度条 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • MySQL 中字符集详细介绍

    MySQL 中字符集详细介绍 MySQL 是一种流行的关系型数据库管理系统,它支持多种字符集。字符集决定了数据库中可以存储的字符的种类和编码方式。在本攻略中,我们将详细介绍 MySQL 中的字符集,并提供两个示例说明。 1. 字符集的概念 字符集是一组字符的集合,每个字符都有一个唯一的编码值。MySQL 使用字符集来存储和处理数据。常见的字符集包括 ASCI…

    other 2023年8月19日
    00
  • websocket中文网

    Websocket中文网 Websocket是一项重要的Web技术,它允许浏览器和服务器之间建立一个双向的、实时的数据通道。自HTML5标准引进这项技术以来,Websocket已经成为Web开发中的重要组成部分之一,许多网站都开始使用它来实现实时通信功能。 作为一个Web开发者,学习Websocket技术是非常必要的。这时候,Websocket中文网就是你的…

    其他 2023年3月28日
    00
  • Android Studio怎么用?Android Studio使用教程图文详解

    Android Studio使用教程 简介 Android Studio是一款由Google开发的集成开发环境(IDE),用于开发Android应用程序。本教程将详细介绍如何使用Android Studio进行Android应用程序的开发。 步骤一:安装Android Studio 首先,您需要下载并安装Android Studio。您可以从官方网站上下载适…

    other 2023年9月6日
    00
  • 分享我对JS插件开发的一些感想和心得

    分享我对JS插件开发的一些感想和心得 简介 JS插件开发是一项非常有趣和有挑战性的任务。它允许开发者将自己的功能模块化,并与其他开发者共享和重用。在本攻略中,我将分享一些关于JS插件开发的感想和心得,希望对你有所帮助。 1. 设计插件接口 在开发JS插件时,良好的接口设计是至关重要的。一个好的接口可以提供清晰的使用方式,并减少与其他代码的耦合。以下是一个示例…

    other 2023年7月27日
    00
  • textcontent、innertext的用法 在文档中插入纯文本

    textContent、innerText的用法 在文档中插入纯文本 在JavaScript中,有两个常用的属性可以用来修改页面元素的文本内容,它们分别是 textContent 和 innerText。本文将介绍它们的用法,并以实例演示如何向文档中插入纯文本。 textContent textContent 属性返回或设置指定元素中的文本内容,包括所有后代…

    其他 2023年3月28日
    00
  • 如何解决win10系统安装KB3097617更新补丁失败后电脑无限重启

    如何解决win10系统安装KB3097617更新补丁失败后电脑无限重启 问题描述 在Windows 10系统中,当尝试安装KB3097617更新补丁时,会出现安装失败的情况,随后系统进入无限重启状态,无法进入操作界面。这是因为该更新补丁引起了系统启动引导程序的错误,导致系统无法正常启动。 解决方法 方法1:使用系统修复工具 准备一台可用电脑和一个U盘; 在可…

    other 2023年6月27日
    00
  • 走进SpringBoot之配置文件与多环境详解

    走进SpringBoot之配置文件与多环境详解 配置文件的使用 Spring Boot支持多种类型的配置文件,包括: 属性文件(.properties) YAML文件(.yml或.yaml) JSON文件(.json) 在Spring Boot中,我们可以通过在配置文件中定义属性来配置应用程序的行为。配置文件中的属性可以被注入到Spring Bean中,以及…

    other 2023年6月25日
    00
  • CSS3用@font-face实现自定义英文字体

    下面是关于“CSS3用@font-face实现自定义英文字体”的完整攻略: 什么是@font-face @font-face是CSS3的一个模块,它使得网页设计师可以定义自己的字体,而不用考虑用户是否已经安装了这些字体。该规范定义了一个新的CSS规则,允许开发者定义自己的字体资源,然后通过CSS来控制这些字体资源。 使用步骤 1.准备字体文件 首先,你需要有…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部