改进 SPA 应用的数据加载方式

前言

随着 web 技术的发展,越来越多的 web 应用选择了采用 SPA (Single Page Application) 的架构模式。SPA 应用通常是通过 AJAX 对后端 API 发起请求并获取数据,然后通过 JavaScript 动态更新渲染页面。然而,SPA 应用中的数据加载往往会带来一些问题,比如卡顿、加载速度过慢等。本文将会介绍一些改进 SPA 应用数据加载方式的技巧,帮助我们更好地优化前端用户体验。

问题分析

首先,我们需要分析 SPA 应用中数据加载过慢的原因。可能的原因有以下几个:

  1. 请求过多:SPA 应用通常是通过 API 请求获取数据,并将数据渲染到页面上。如果一个页面中需要请求过多的 API,就会导致页面加载过慢。

  2. 数据缓存不当:由于 SPA 应用通常是单页面与多个接口交互,如果没有考虑到数据的缓存,每次进入页面都需要重新获取数据,浪费无谓的流量。

  3. 数据加载过程中缺乏提示:SPA 应用中如果没有给用户明示数据正在加载的提示,用户会感到页面卡顿、无反应,从而影响用户体验。

改进策略

合并/缓存请求

SPA 应用发生加载慢的原因之一是请求过多,但不是所有请求都是必要的。我们可以通过合并或缓存请求,达到减少请求数目的目的。

  1. 合并请求:如果一个页面上需要请求多个 API 接口,那么我们可以将这些请求合并成一个请求发送给后端,可以用 gulp、webpack 等自动化打包工具实现。后端用一个 API 接口返回多个数据结构即可。

  2. 缓存数据:对于一些不经常变动的数据,我们可以将其缓存至本地,比如通过 localStorage 或是 sessionStorage 进行缓存。这样,下次请求该数据时我们可以先从缓存中获取数据,而不是重新发生请求。

数据加载提示

在 SPA 应用中,特别是异步请求数据时需要给用户一个加载提示,防止用户产生卡顿无反应的误解以及凸显数据加载的进度,这里我们可以用顶部进度条,像 npm 安装时的进度条一样,在数据加载的过程中逐渐加载及展示。

虚拟滚动

虚拟化滚动是提高大数据展示性能的一种技术。实现原理大致为:当用户滚动到一定位置时,只渲染这个位置前后数个元素,对于其他元素进行回收和复用,从而减少了浏览器渲染的工作量。我们可以使用类似 vue-virtual-scroller 或 react-window 等库来实现虚拟化滚动。这样可以实现大数据量展示的同时保证良好的性能。

示例代码

1.合并请求

CURL 示例:

---- -- ---- -- -------------- ----------------- -- --
    ------- ----------------
    ------- ---------------
-- --------------------------------

Server 示例:

----- --- - ---------------------
----- ---------- - -----------------------

---------------------------
---------------------- ----- ---- -- -
    --- -------- - ---------------------
    --- -------- - ---------------------
    ---------------------- ------------------------ ------- -- -
        ---------------- --------
    -------------- -- -
        ----------------------------
    ---
---

2.缓存数据

使用方式:

-------- ------------------ -
    --- ---------- - ---------------------
    --- ------- - ---------------------------------------------
    -- -------- -- ----- ------ - ----------------- - -------------- -
        -- --
        ------------------------------------
        ------- - -----
    -
    -- --------- -
        ------ ------------------------------
    -
    
    ------ --------------------------- -- -
        --- ------ - ----------------
        -------------------------------- ----------------
            ----- -------
            ---------- ---- ------
        ----
        ------ -------
    ---
-

3. 数据加载提示

使用 nprogress.js 库提示进度提示:

HTML:

---- --- -- ------------ ---- ---
---
----- --------------------------------------------------------------------- -----------------
------- -----------------------------------------------------------------------------
---

JS:

------ --------- ---- ------------

-- ---- ---------
------------------

-- ---- -----------
-----------------

4. 虚拟滚动

使用 react-window 库:

------ - ------------- - ---- ---------------

-------- ------------------ -
    ----- -
        ------
        ----------
        ----------
    - - ------

    -------- ---------------- -
        ----- - ------ ----- - - ------

        ------ -
            ---- --------------------------------
        --
    -

    ------ -
        --------------
            ------------
            ------------------------
            ---------------------
            -----------
        -
            -----------
        ----------------
    --
-

结论

通过实践和经验总结,我们可以发现这几种技巧非常适合改进 SPA 应用中的数据加载方式,其中涉及到的技术覆盖了请求合并、数据缓存、数据加载提示和虚拟滚动。尤其是在大数据量展示优化时,虚拟滚动技术的应用效果更为明显,能有效地提高前端性能,进一步提高产品竞争力。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65b7090dadd4f0e0fffa3c87


猜你喜欢

  • 在 GraphQL 中使用 Dataloader 优化查询性能的方法

    在使用 GraphQL 进行数据查询时,经常会遇到查询嵌套的情况。例如,查询一个电影列表,每个电影下还包含了演员信息,每个演员下还包含了其参演的电影列表。如果不加处理,这种嵌套查询可能会导致性能问题,...

    9 个月前
  • 如何使用 ECMAScript 2020 中的可选链操作符 nullish

    ECMAScript 2020 是 JavaScript 的最新版本,引进了大量有用的新特性和语言功能,其中一个很实用的功能是可选链操作符 nullish。通过这个新操作符,开发者可以轻松地避免图谋多...

    9 个月前
  • 如何在 Mocha 测试框架中使用 sinon-chai 进行 Chai 断言扩展

    前言 在进行前端开发过程中,测试是不可或缺的环节。而 Mocha 是一个流行的 JavaScript 测试框架,可以用于编写单元测试、集成测试、端到端测试等各种类型的测试。

    9 个月前
  • 如何用 Serverless 架构快速部署一个静态网站

    随着互联网的不断发展,许多公司和个人都需要搭建自己的网站。然而,对于初学者和小型团队而言,搭建一个静态网站的成本和难度都比较高。为了解决这个问题,我们可以尝试使用 Serverless 架构快速部署一...

    9 个月前
  • 从头开始理解 Qt 性能优化

    Qt 是一个广泛使用的跨平台应用程序开发框架,旨在构建高效、现代化的应用程序。然而,在大型项目中,Qt 应用程序的性能可能会受到影响,导致响应时间变慢,资源占用变高,甚至崩溃。

    9 个月前
  • 利用 Babel 和 Webpack 构建高质量 React 应用

    随着 React 越来越受欢迎,开发人员开始寻找更好的方法来构建 React 应用。 Babel 和 Webpack 是两个非常重要的工具,可以帮助开发人员提高 React 应用的质量。

    9 个月前
  • Mongoose 中如何使用 $unset 操作符来删除字段?

    Mongoose 是一个 Node.js 中非常流行的 MongoDB 封装工具,它为 Node.js 的开发者们提供了许多方便的功能,使得我们可以更加轻松地与 MongoDB 数据库交互。

    9 个月前
  • ES7 中的 async/await 语法糖

    在过去的 JavaScript 代码中,我们经常发现异步代码的回调嵌套多层,让代码难以理解和维护。ES6 随着 Promise 对象的引入,给异步代码的处理带来了很大的便利。

    9 个月前
  • ESLint 与 Babel 结合使用的安装及配置方法详解

    随着前端技术的不断发展,JavaScript 也变得越来越复杂。为了保证代码的可读性和可维护性,我们需要遵循一定的编码规则和标准。而 ESLint 就是一款用于检查 JavaScript 代码规范的工...

    9 个月前
  • RESTful API 中 HATEOAS 原则的应用与实践

    在 RESTful API 架构中,HATEOAS (Hypertext As The Engine Of Application State) 是一种设计原则,旨在提高 API 的可伸缩性和灵活性。

    9 个月前
  • CSS Flexbox 在 Bootstrap 框架中的应用

    什么是 Flexbox? Flexbox 是指弹性盒子布局,它是一种新的 CSS 布局方式,用于设计复杂的页面布局和元素定位。Flexbox 旨在让容器更具灵活性和自适应性,并为元素提供了更多的布局和...

    9 个月前
  • ECMAScript 2020:对 JavaScript 中的数组方法的优化

    对于前端开发者而言,JavaScript 中的数组方法一直是必不可少的一部分。在 ECMAScript 2020 中,JavaScript 的数组方法得到了进一步的优化,这些优化能够帮助开发者更加高效...

    9 个月前
  • 如何使用 ES9 中的 Rest/Spread 属性处理函数参数

    在ES9中,引入了Rest/Spread属性,可以方便地处理函数参数,使得我们在JavaScript开发中更加便利。本文将详细介绍如何使用Rest/Spread属性处理函数参数,让你掌握这项技术。

    9 个月前
  • Vuex 中 actions、mutations、getters 分别的作用及用法

    Vuex 是 Vue.js 中的一种状态管理库,它提供了一种集中式存储管理应用的所有组件的状态,并以可预测的方式进行状态更改。Vuex 中有三种不同的概念,包括:actions、mutations ...

    9 个月前
  • 了解 ES12 规范中 Privileged Inheritance 的作用

    ES12 是 ECMAScript(即 JavaScript)的最新规范,其中新增了 Privileged Inheritance 这一特性。本文将介绍这一特性的作用,以及如何正确使用它。

    9 个月前
  • 使用 Enzyme 和 Jest 测试 React Native 应用

    在前端开发中,测试是一个极其重要的部分。针对于 React Native 应用,测试可以帮助我们快速的发现问题,并帮助我们更好地维护应用的质量。在这篇文章中,我们将会使用 Enzyme 和 Jest ...

    9 个月前
  • ES10 中的新特性:静态方法 Array.from()

    在 ES10 中,JavaScript 新增了一种静态方法 Array.from(),这个方法可以将类数组和可迭代对象转换成数组。接下来,我们将深入讲解这个新特性的用法和意义。

    9 个月前
  • Sequelize 操作 NoSQL 数据库完整指南

    在前端开发中,我们经常会碰到操作数据库的需求。越来越多的开发者选择使用 NoSQL 数据库,如 MongoDB、CouchDB 等。然而,当我们使用 Sequelize(一个支持 SQL 数据库的 O...

    9 个月前
  • RxJS 中使用 throttleTime 操作符实现用户操作限流

    在现代 web 应用中,用户操作往往十分频繁且不可控。为了保证用户操作的正常流程,我们往往需要对用户操作进行限流。RxJS 中的 throttleTime 操作符可以帮助我们实现这样的限流机制。

    9 个月前
  • Babel 转译 ES6 箭头函数时的注意事项

    什么是箭头函数? 箭头函数是 ES6 中的新语法,它可以用更加简洁的方式来定义函数。箭头函数的定义方式如下: -- ------ -------- ------ -- - ------ - - -...

    9 个月前

相关推荐

    暂无文章