使用 React 和 Server-Sent Events 实现实时 Markdown 预览

阅读时长 10 分钟读完

在前端开发中,我们经常需要使用 Markdown 来书写文本、博客和说明文档等。而且,实时的预览功能可以让我们更方便地查看所编辑的文本内容。本篇文章将介绍如何使用 React 和 Server-Sent Events 技术来实现实时的 Markdown 预览功能。

Markdown 是什么?

Markdown 是一种轻量级标记语言,它以易读易写的纯文本形式编写,并可以转换为 HTML 格式发布。Markdown 语法简单而直观,常被用于编写博客、说明文档、GitHub README 等场景中。

Markdown 语法

下面是一些常见的 Markdown 语法:

标题

使用 "#" 符号来表示标题,可以使用 1-6 个 "#" 符号表示不同级别的标题:

粗体和斜体

使用 "**" 和 "_" 符号表示粗体,使用 "*" 和 "" 符号表示斜体:

列表

使用 "-" 或 "*" 符号表示无序列表,使用数字加 "." 符号表示有序列表:

引用

使用 ">" 符号表示引用:

代码块

使用三个反引号 "```" 符号表示代码块:

链接和图片

使用 "[" 和 "]" 符号表示链接和图片,以及 "(" 和 ")" 符号表示对应的链接地址和图片地址:

React 是什么?

React 是由 Facebook 开发的一个用于构建用户界面的 JavaScript 库。它可以根据数据的变化高效地更新 DOM,从而使得开发动态 Web 应用更加方便。

React 特点

React 具有以下特点:

  • 虚拟 DOM:一种轻量级的、在内存中维护的 DOM,能够映射到真实的 DOM。
  • 组件化开发:将一个页面分为多个独立的组件,负责各自的 UI 和交互逻辑,提高代码的复用性、可维护性和可测试性。
  • 单向数据流:父组件通过 props 向子组件传递数据,子组件触发事件来通知父组件更新数据。
  • JSX 语法:一种在 JavaScript 中嵌入 HTML 的语法糖。

Server-Sent Events 是什么?

Server-Sent Events(简称 SSE)是一种允许服务器实时向客户端发送事件流的技术。通过 SSE 协议,客户端可以收到服务器端的新消息,从而实现实时性通信。SSE 使用简单并且跨浏览器,适合用于实现实时的通信功能。

SSE 协议

SSE 协议采用 HTTP 进行传输,但是与普通的 AJAX 不同,SSE 不会关闭连接,允许服务器持续地向客户端发送事件流。

SSE 协议允许服务器向客户端发送一个事件流,事件流的格式如下:

其中,event 表示事件名称;data 表示事件数据;id 表示事件的 ID;retry 表示重试时间。

服务器可以通过 SendEvents 方法将 SSE 事件发送给客户端,如下所示:

上述代码中,创建了一个 EventSource 对象,并且通过 onmessage 回调函数接收 SSE 事件流的数据。

实现实时 Markdown 预览

现在我们已经了解了 Markdown、React 和 SSE 技术,接下来我们将结合这三个技术来实现实时的 Markdown 预览功能。具体来说,我们将实现如下功能:

  1. 编辑 Markdown 文本框实时预览。
  2. 通过 SSE 技术将 Markdown 文本发送到服务器进行转化。
  3. 服务器将转化后的 HTML 文本返回给客户端显示。

编辑 Markdown 文本框

我们将使用 React 来实现 Markdown 编辑器界面以及文本预览功能。先编写编辑器组件代码,如下所示:

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

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

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

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

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

上述代码中,我们使用 useState 钩子函数来定义 markdown 文本状态变量,并且使用 onChange 回调函数来响应文本框内容变化事件。在回调函数中,我们通过 setMarkdown 方法来更新 markdown 文本状态。然后,我们将 markdown 变量的值传递到 marked 函数中进行 Markdown 转换,使用 dangerouslySetInnerHTML 属性将转换后的 HTML 文本渲染到页面上。

使用 SSE 实现 Markdown 转换

接下来,我们需要在服务器端使用 SSE 技术来处理 Markdown 转换请求,将转换后的 HTML 返回给客户端。

这里,我们将使用 koa 来实现服务器端应用。先编写 koa 应用代码,如下所示:

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

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

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

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

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

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

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

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

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

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

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

上述代码中,我们使用 Router 来实现路由功能。在 sseStream 中间件中,我们将响应头设置为 "text/event-stream",然后在 onResponseStart 事件中调用 Readable.from() 方法创建一个 Readable 流,并且将流作为响应体传递给客户端。然后,我们将监听 app 对象的 message 事件,并在事件发生时向客户端发送 SSE 事件消息。

在 markdown 路由中,我们将客户端发送的 Markdown 消息通过 emit 方法发送给 app 对象,然后使用 marked 函数将 Markdown 转换为 HTML,将转换后的 HTML 通过响应体返回给客户端。

客户端代码

最后,我们将在客户端中使用 EventSource 对象连接到服务器端 SSE 流,并且将 Markdown 消息发送到服务器端进行转换。

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

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

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

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

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

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

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

上述代码中,我们使用 useState 钩子函数定义 markdown 和 preview 两个状态变量。在 handleTextChange 回调函数中,我们更新 markdown 状态,并使用 fetch 函数将 Markdown 消息发送给服务器端。然后,在 handlePreview 回调函数中,我们接收服务器端 SSE 发送的消息,并将消息内容更新到 preview 状态。

最后,在组件渲染函数中,我们创建了一个 EventSource 对象,并且在添加了 message 事件监听器,处理服务器端 SSE 发送的消息。

总结

本文介绍了如何使用 React 和 Server-Sent Events 技术来实现实时的 Markdown 预览功能。我们首先了解了 Markdown 的基本语法,然后介绍了 React 和 SSE 技术的相关概念和应用,最后结合这三个技术来实现了实时的 Markdown 预览功能。

通过本篇文章的学习,读者可以了解到如何在实际项目中使用 React 和 SSE 技术来构建实时通信功能。同时,本文也提供了示例代码,读者可以结合代码和文中的说明来进一步理解本文的内容。

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

纠错
反馈