PWA 中如何实现多 Tab 之间的会话共享

阅读时长 7 分钟读完

前言

在日常的网页浏览中,我们往往会打开多个网页标签页,每个标签页相当于一个独立的浏览器会话。而对于 Progressive Web App(PWA)来说,一旦被添加到主屏幕上,它的标签页就相当于应用程序的窗口,我们也希望在多个标签页之间共享应用程序的状态。但是,PWA 的标签页之间本身是被隔离的,如果我们需要共享会话,就需要一些额外的工作,本文就来介绍如何在 PWA 中实现多标签页之间的会话共享。

SessionStorage vs LocalStorage

在实现会话共享的过程中,我们可能会使用 SessionStorage 或者 LocalStorage 这两个 Web Storage API。它们都是浏览器提供的本地存储机制,其中 SessionStorage 可以存储一些临时的会话数据,而 LocalStorage 则可以长期存储一些持久化数据。在多标签页之间实现会话共享的情况下,我们通常会选择使用 LocalStorage。

会话共享的实现

在实现会话共享之前,我们需要先了解一下浏览器标签页之间的通信机制,包括 BroadcastChannel,SharedWorker 和 Service Worker。

1. BroadcastChannel

BroadcastChannel 是一个 HTML5 定义的 API,它允许不同的页面和 iframe 之间进行通信,通过它我们可以跨标签页广播消息。使用 BroadcastChannel 实现多标签页之间的会话共享是非常方便的,但是它只允许同源的页面之间通信,因此需要在同一个域名下才能使用。

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

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

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

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

2. SharedWorker

SharedWorker 可以一直在后台运行,提供了一个共享运行环境,多个页面可以通过它来访问一个共享的 JavaScript 上下文环境。SharedWorker 提供了一种比 BroadcastChannel 更强的通信机制,但是需要更多的工作来实现会话共享,它也只能在同一个域名下使用。

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

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

3. Service Worker

Service Worker 是一种独立于当前网页的进程,它可以拦截网络请求并对其进行处理。Service Worker 可以在浏览器标签页之间共享,而且可以跨域。通过将会话数据存储在 IndexedDB 中,并在不同的标签页间共享,我们就可以实现多标签页之间的会话共享。

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

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

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

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

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

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

总结

在本文中,我们介绍了三种不同的技术选项,BroadcastChannel,SharedWorker 和 Service Worker,用于在 PWA 中实现多标签页之间的会话共享。根据实际需求可以选择不同的技术方案来实现。这些技术选项不仅可以为 PWA 提供更好的用户体验,而且也有一定的指导意义,可以帮助开发者更好地了解浏览器的一些工作原理和实现机制。

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

纠错
反馈