如何解决在 PWA 中打开链接阻止了后退操作的问题?

阅读时长 4 分钟读完

什么是 PWA?

PWA 即是 Progressive Web App,它是一种结合了 Web 技术和 Native App 的优势,拥有类似 Native App 的用户体验的 Web 应用。它可以离线使用、在手机桌面添加图标、推送消息等,同时支持在各种桌面和移动设备上使用。

问题描述

在 PWA 中,打开链接会覆盖当前页面,并且当用户尝试使用浏览器的后退功能时,会发现返回到的是初始页面,而不是上一个页面。这是因为使用 PWA 时,在打开链接时没有经过真正的跳转,而是采用了异步加载的方式。这种异步加载消除了许多加载时间延迟的问题,但它也损失了默认浏览器后退按钮的功能,从而使得用户会感到困惑和不便。

解决方法

使用 History API

为了解决上述问题,我们需要使用浏览器的 History API,它提供了一种修改 URL 和对历史记录进行操作的方法。我们可以使用 pushState() 、replaceState() 和 popState() 等方法,从而修改浏览器的历史记录和 URL,从而使我们能够错误地拦截后退按钮,并恢复默认的浏览器行为。

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

-- -------------
----------------------------------- -------- --- -
  -- ---------
  ----- ----- - --------
  -- ------- -
    -- ---------
    -------------------
  -
---
展开代码

代码详解

上面的代码中,我们通过自定义函数 changeRoute() 来修改浏览器的历史记录。该函数有三个参数,分别是 route 、 title 和 url 。其中 route 表示当前路由的状态,它通常是一个对象,里面包含了路由的一些信息,比如路由名称、参数等。参数 title 和 url 分别表示要改变的页面的标题和 URL 。

在 changeRoute() 方法中,我们使用了 history.pushState() 来在浏览器的历史记录中添加新的记录。该方法会将 route 对象压入历史记录栈中,并更新浏览器的 URL 和标题。

在 popstate 事件中,我们使用 e.state 来获取当前的路由状态 route 。我们首先判断 route 是否存在,并在存在的情况下加载对应路由的内容。

-- -------------------- ---- -------
-- ---------
-------- ------------------ -
  -- -- ----- --- ------
  ---------------- -
    ------- ------
    -------- -
      --------------- ------------
    --
  --
    ----------- -- -----------
    --------------- -- -
      -- ---------
      -----------------------
    ---
-
展开代码

在 loadContent() 方法中,我们使用 Fetch API 发送到服务器,获取对应路由的内容。获得内容后,我们通过调用一个自定义的 renderContent() 方法来渲染路由内容。

改进体验

使用上述方法,我们可以解决异步加载 PWA 中打开链接阻止后退操作的问题。但是,默认情况下会出现一个闪烁现象,使用户体验变差。在此,我们可以使用 Service Worker 来拦截所有的网络请求,并在缓存中添加所有页面和资源。

使用上述代码,我们将所有的网络请求拦截下来,并在本地缓存中添加所有页面和资源,从而保证在路由切换时,能够快速加载路由内容,同时减少页面闪烁现象。

小结

经过上述的操作,我们可以有效地解决 PWA 中异步加载打开链接阻止后退操作的问题,并且 使用 Service Worker 可以优化 PWA 的性能和体验。这对于 PWA 应用是非常重要和实用的。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bffb02314edc26845f2692

纠错
反馈

纠错反馈