Vue-Router 让你的页面进入页面会有卡顿?别急,终于有了解决方案了!

Vue-Router 是 Vue.js 的官方路由管理器。它允许你在单个页面应用中构建 SPA(单页面应用程序),从而快速、轻松地构建高质量、可扩展的 Web 应用程序。然而,当你在 Vue-Router 中使用了大量的异步组件和子路由时,你可能会发现页面在进入时会有卡顿,影响用户体验。别急,本文将为你介绍一个解决方案。

背景

在使用 Vue-Router 过程中,我们经常使用异步组件和子路由来打造像 Tab 栏、Tab 页等一系列业务模块。如下是一个使用 Vue-Router 实现的路由:

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

这里,我们定义了一个 /home 路由,该路由包含两个子路由 /tab1/tab2。每个视图组件使用了异步组件来延迟加载,保证初始化的速度。虽然这样做可以维持页面加载速度,但是在切换 tab 页时,我们会发现页面卡顿,不流畅。造成这种状况的原因是 Vue-Router 缺乏页面预加载机制,导致在首次进入子路由时会等待异步组件的加载,导致卡顿。

如下是一个 Vue-Router 官方提供的 Demo:

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

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

在这个 Demo 中,当我们进入 /foo/bar 路由时,页面会有明显的卡顿。

那么,如何避免这种卡顿现象呢?

解决方案

解决这个问题的关键是添加一些非常小的 CSS 预加载器 (pre-loaded),以在异步加载的 JS 文件完成之前使关键 CSS 已经可用。通过执行此操作,您可以明显地减少由于 JavaScript 文件加载时首次加载页面而导致的卡顿。

我们可以使用 Webpack 插件 preload-webpack-plugin 来自动生成并注入 preload 标签到 HTML 中。在 Vue-CLI 3 中,已经集成了该插件,它会在生成的 HTML 模板中自动插入预加载标签。您可以通过以下配置对插件进行更多的定制:

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

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

其中:

  • rel 定义预加载类型,可以为 preloadprefetch
  • include 定义需要预加载的模块集合。在本例中,我们包含了 hometab1tab2,这三个是主要需要注意的异步组件。Prefetch 可以指定仅对某些异步组件执行预取操作。
  • excludeHtmlNames 定义需要排除的 HTML 文件名。以下示例将 index.html 排除在预加载之外。
  • fileWhitelist 定义允许的 MIME 类型。在本示例中,我们允许了 .vue.js,其他文件类型将不进行预加载。

一旦您的 Webpack 配置正确,当您启动应用程序时,您会注意到额外的 HTTP 请求发送到服务器以获得预加载 CSS,并且 JavaScript 文件现在有更多时间在后台下载。预加载的 CSS 还可以减少渲染和布局过程中的闪烁。它不仅可以改善所有浏览器的性能,而且特别适用于移动设备。同时,您将注意到页面加载时间比以前短。

示例代码

下面是一个完整的 HTML 文件代码示例,其中包含 Vue.jsVue-RouterWebpack

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

以上代码中,我们使用了 preload 标签来描述需要预加载的 JavaScript 文件,具体包括了 home.jstab1.jstab2.js,这对我们异步的组件将非常有帮助,能够有效地减少进入页面时的卡顿。除此之外,我们还展示了两个 router-link,分别链接到 /home/tab1/home/tab2。这两个链接分别对应了我们的异步组件。最后还使用了 router-view 插槽应用路由占位符。

结论

Vue-Router 是一个非常好用的路由管理器,但是在处理复杂页面、嵌套路由、异步组件等场景时,容易出现页面卡顿的问题。靠着 preload-webpack-plugin Webpack 插件,我们可以巧妙地解决这个问题,避免了组件的重复加载和页面卡顿等问题,给用户带来更好的交互体验。

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


猜你喜欢

  • Mocha 测试框架的使用场景分析与最佳实践指南

    前言 前端工程化在近年来得到了快速的普及和发展,前端测试也是其中一个重要的环节。对于前端项目,测试框架可以有效保证代码质量和稳定性,在团队协作中也起到了至关重要的作用。

    6 天前
  • 如何使用 Socket.io 在基于 React 的 SPA 中实现实时化数据

    在现代 web 应用程序中,实时化数据已经变成了非常普遍的需求。而 Socket.io 已经成为了最受欢迎的实现方法之一。本文将介绍如何在基于 React 的 SPA 中使用 Socket.io 来实...

    6 天前
  • Cypress 中如何进行错误处理和异常捕获?

    Cypress 是一个基于 JavaScript 的前端自动化测试框架,它提供了简单易用的 API,可以方便地完成各种测试任务。在测试过程中,错误和异常是难以避免的,因此如何进行错误处理和异常捕获非常...

    6 天前
  • 如何使用 CSS Grid 实现文本溢出处理

    前言 随着互联网的快速发展,越来越多的网站和应用程序需要处理文本溢出的情况。这种情况尤其常见于响应式网页设计中。在这篇文章中,我们将介绍如何使用 CSS Grid 实现文本溢出处理。

    6 天前
  • JDBC 性能瓶颈排查技巧

    在进行数据库操作时,JDBC 是最常用的连接方式。但是,在处理大量数据或频繁操作时,JDBC 可能会出现性能瓶颈的问题。在这篇文章中,我们将介绍如何排查 JDBC 的性能瓶颈问题,并提供一些实用的技巧...

    6 天前
  • React 和 TypeScript 的项目最佳实践

    React 和 TypeScript 是如今前端领域最流行的技术,它们的结合使得我们能够在构建复杂的 Web 应用程序时获得更好的开发体验和代码质量。本文将介绍 React 和 TypeScript ...

    6 天前
  • Serverless 框架中的命名规范及最佳实践

    随着云计算技术的不断发展,Serverless 框架作为一种新型的应用架构模式,在近年来越来越受到前端开发人员的关注和使用。相较于传统的应用架构模式,Serverless 框架具有更高的可伸缩性、更低...

    6 天前
  • 运用 Redux Middleware 实现异步请求

    Redux 是一个非常流行的 JavaScript 应用状态管理库,它使得应用的状态管理更加简单、可预测和可维护。然而在实际的开发过程中,我们经常需要异步请求获取数据,而 Redux 并没有内置的异步...

    6 天前
  • 无障碍模式下,如何实现语音播报功能

    通常,在一个页面或者应用中,人们通过阅读文本或点击链接来获取信息。然而,这对于视觉障碍者和阅读障碍者,以及其他身体障碍者和残障人士来说,是不适用的。为此,无障碍模式成为了优化用户体验的一个必要条件。

    6 天前
  • Android Material Design 中实现分页效果

    Android Material Design 是 Google 推出的一种全新的设计语言,它具有现代、明亮、大胆和色彩丰富的特点。其中,分页效果在 Material Design 中有着重要的应用。

    6 天前
  • Kubernetes 如何支持 PVC 并使用 HostPath PV

    Kubernetes 如何支持 PVC 并使用 HostPath PV Kubernetes 是一个由 Google 主导的开源容器编排系统,它提供了强大的容器编排和服务发现功能,使得容器应用可以在大...

    6 天前
  • Promise.allSettled() 方法的使用及注意事项

    Promise 是 JavaScript 中处理异步操作的对象,它可以帮助我们更加灵活地组织异步代码。 Promise.allSettled() 是 Promise 的一个实例方法,它可以在多个 Pr...

    6 天前
  • 解决 Deno 在 Windows 上启动时遇到的无法找到文件的错误

    Deno 是一个流行的运行时环境,用于 JavaScript 和 TypeScript 开发的现代应用程序。然而,在 Windows 上启动 Deno 时,用户常常会遇到无法找到文件的错误。

    6 天前
  • 在 Vue.js 应用中使用 TypeScript 增强开发

    随着前端技术的快速发展,越来越多的前端开发团队开始采用 TypeScript 作为开发语言。TypeScript 是一种由微软开发的静态类型检查器,它可以在运行代码之前自动检查类型错误,并且能够提供更...

    6 天前
  • 详解 CSS Reset 如何重置样式?

    引言 一个 web 页面在加载时,默认会受到浏览器的一些默认样式影响。如果不进行样式重置,会导致网页的样式出现不符合设计标准、不一致的情况。因此, CSS Reset 就应运而生。

    6 天前
  • Headless CMS 与 React 的结合应用:最佳实践

    前言 在前端开发中,CMS(内容管理系统)扮演了极为重要的角色。CMS 能够管理网站的内容,帮助前端开发人员快速构建网站,提高工作效率。而随着时代的发展,传统 CMS 的缺陷逐渐暴露,比如性能和安全问...

    6 天前
  • Node.js 中缓存处理技巧分享

    随着网页和应用程序的发展,前端性能已经成为了重要的考虑因素。在网页或者应用程序中,缓存技术可以大量降低后端数据查询的频率,进一步提升应用程序性能。 Node.js 作为一个 JavaScript 运行...

    6 天前
  • SASS 嵌套规则引起编写的 bug 解决方法

    什么是 SASS? SASS 是一种 CSS 预处理器,它允许我们使用变量、嵌套规则、函数等等高级的 CSS 功能来编写更加模块化和易于维护的 CSS 代码。SASS 的主要作用是提高前端开发的效率和...

    6 天前
  • jQuery 性能优化实践

    jQuery 是一个非常流行的 JavaScript 库,在开发网站和浏览器应用时经常使用。然而,如果不注意性能,jQuery 可能会拖慢网站或应用的加载速度和响应时间。

    6 天前
  • 失败的 Fastify 框架请求如何重新尝试

    Fastify 是一款快速、低开销、可扩展的 Node.js Web 框架。然而,即使使用 Fastify,仍然可能会遇到失败的请求问题。在这篇文章中,我们将探讨如何重新尝试 Fastify 请求,并...

    6 天前

相关推荐

    暂无文章