npm 包 browser-pubsub 使用教程

阅读时长 13 分钟读完

什么是 browser-pubsub

browser-pubsub 是一个轻量级的 JavaScript 库,它提供了一种简单的机制来让 Web 应用程序中的不同部分间进行通信。

PubSub 是一个基于"发布订阅"模式的库。它是通过一个全局的 PubSub 对象来实现的,发布者通过调用 PubSub.publish(channel, message) 来向一个频道发布消息,订阅者通过调用 PubSub.subscribe(channel, function) 来订阅某个频道的消息。这种设计模式支持松散耦合和去耦合,并且使代码更容易理解和维护。

browser-pubsub 可以在多个浏览器窗口、标签页、甚至不同的浏览器中进行通信。在这些情况下,它使用了 PostMessage API,它可以让浏览器窗口间进行异步通信。

安装

使用 npm 安装:

基本用法

首先,在需要使用的文件中引入 PubSub 对象:

发布消息

使用以下命令将消息发布到一个频道:

"message" 参数可以是任意的 JavaScript 对象,以便在应用程序的其他部分中处理。

订阅消息

要监听一个频道的特定类型的消息,使用以下命令:

如果您的消息处理程序需要处理来自多个发布者的消息,则可以使用以下代码:

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

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

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

这将在两个订阅者之间打印出以下内容:

取消订阅

如果您需要取消已订阅的频道,请使用以下命令:

在这里,"handler" 是用来处理接收到的消息。

高级用法

除了上面介绍的基本用法之外,browser-pubsub 还可以使用 PostMessage 进行跨浏览器通信。

跨浏览器通信

要启用跨浏览器通信,您需要在所有窗口中使用相同的域名。例如,在本地开发期间,您可以在窗口 localhost:3000 中打开应用程序,然后在 localhost:3001 中打开另一个窗口。这些窗口中的所有脚本都需要使用同一 URL。

您还需要为将要连接的所有窗口启用跨源访问:

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

该示例中的按钮通过调用 postMessage() 广播了一条消息。当事件被接收到时,窗口 2 会向发送窗口回发另一条消息。

这个函数接受两个参数:

  • message – 需要广播的消息,可以是任意 JSON 格式的对象。
  • target – 目标窗口的 URL,可以是 '*',它表示可以发送到任意窗口。

代码示例

让我们以一个更实际的示例来说明 browser-pubsub 如何使用“发布订阅”模式进行通信。

在这个示例中,我们将创建一个任务清单应用程序,让用户可以添加、编辑和删除任务。我们将使用 browser-pubsub 库来通知其他部分更改。

首先,我们需要设置一个 PubSub 对象:

接下来,我们将创建一个 view-module,它将渲染任务清单和提供一些操作元素,如添加、编辑和删除:

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

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

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

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

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

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

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

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

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

在这个例子中,我们使用了如下的发布者:

这里的 "TaskList" 是我们的通道名称 (channel),它指定了我们将要发布到的消息队列,"action" 和 "id" 是我们的消息信息。

接下来,我们将创建一个数据存储模块来处理数据持久化和任务管理:

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个例子中,我们使用以下代码订阅来自 view-module 的消息:

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

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

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

在订阅器函数中,我们将根据不同的操作类型执行不同的任务。例如,在 "add" 操作中,我们将提示用户添加一个新任务,然后创建一个新任务对象并将其添加到任务列表中。

通过 PubSub.publish('TaskList:display') 函数,我们告诉 view-module 显示最新的任务列表。

最后,我们将在应用程序的入口点中使用这些模块:

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

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

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

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

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

在这个例子中,我们创建了 data-module 和 view-module,并从数据模块中获取任务,然后在 view-module 中呈现它们。通过 PubSub.subscribe('TaskList:display', updateList) 函数,我们将订阅来自 data-module 中发布的 "TaskList:display" 消息,并在更新列表时调用 updateList()。

在这个示例中,我们演示了如何使用 browser-pubsub 来进行简单的数据通信,从而使 Web 应用程序更具动态性和用户友好性。

总结

在本文中,我们学习了如何使用 browser-pubsub 库来实现基于发布订阅模式的简单数据通信,从而实现了一个基本的任务清单应用程序。使用这个库,您可以将应用程序分成清晰的模块并缩小模块间的耦合度。我们已经掌握了如何发布、订阅和取消订阅消息,以及如何在跨浏览器应用程序中使用它们。我希望这篇文章可以为您在 Web 开发中使用 browser-pubsub 库提供一个良好的指导。

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

纠错
反馈