javascript - 使用 Node.js 和 Socket.io 实时更新大型 HTML 内容

标签 javascript node.js websocket socket.io real-time

我正在构建一个 Web 应用程序,它根据一个客户端所做的更改更新每个客户端网页的 HTML 内容,为此我目前使用的是 Node.js 的 Socket.io。

我正在使用 HTML5 的 contenteditable 属性来允许客户端手动编辑我需要为其他客户端更新的 div 元素的内容。

我面临的问题是我不明白应该通过 websockets 发送什么数据来通知服务器,进而通知其他客户端所做的更改。

在添加和删除每个字符时发送整个 innerHTML 意味着通过 websockets 发送大量数据,这会导致性能差和速度慢。 发送附加数据不是一种选择,因为我们不知道数据在 div 元素中的哪个位置被附加、删除或编辑。

请注意,使用键盘并不是客户更改其网页副本的 HTML 内容的唯一方式。所需的 div 元素的数据根据​​客户端使用 javascript 的几个事件而改变。

现在我需要知道如何通过 websockets 发送准确的更改信息,即使是最微小的更改也能获得实时体验。

附言我不打算使用任何现有模块,如 Share.js,但欢迎提出建议。

最佳答案

这实际上不是一个“问题”,而是一个讨论,属于“头脑 Storm ”主题。它也非常基于意见,因为没有特定的一种方式来谈论如此广泛的话题。

但我会捕获机会,并以我处理这个问题的方式提供我纯粹的恕我直言(抱歉这么个人化):

  • 文本版本控制 - 一种跟踪文本版本的方法,类似于 git,但使用字符位置而不是行。每个可编辑的文本都应该是版本控制的,应该有一个“主控”来合并内容,并通知客户新版本。在客户端,版本更改(提交)应该以与服务器合并相同的方式应用。关于提交顺序。
  • 结构更新 - 这略有不同,因为结构更新仅涉及 HTML 结构,并且不需要版本控制(您仍然有可能需要版本控制,或者至少需要一些操作历史记录,并且涉及赛车条件)。编辑结构会将此类更改通知服务器。它应该确保所有客户在结构方面“在同一页面上”。
  • Referencing - 这可能很难。引用 HTML 元素可以非常简单(选择器),但有一种复杂性——例如 <ul>。许多<li> ,通过索引引用每个 - 足够公平,但如果你在两者之间放置新元素怎么办?那会弄乱引用。因此引用应该是唯一的,并且完全取决于服务器将决定的同步 ID。您需要使用指向 html 元素的指针来保留所有引用的列表,以便直接访问它们很容易。
  • 服务器 <> 客户端 政治。如果您要充分谈论同步体验,那么您必须遵循权威的沟通策略。只有服务器真正决定事情的地方,客户端呈现并只提供一些输入(请求)。例如,当客户端想要将元素添加到 HTML 中时,他发送请求,然后服务器决定这样,并插入它,一旦它进入,它将发布这样的事件,然后元素将出现在客户端上,然后他们可以编辑这个内容元素。您可以通过“前进”来进一步增强它,而无需等待服务器,但这应该作为额外的层来完成,而不是主要逻辑的一部分。
  • 当一个客户端正在处理 Node (元素/文本)时,它应该是唯一可以处理它的人(以防止冲突)。提交将被视为“进行中”,并且应该是单一版本提交。一开始,您只能在用户“完成”编辑文本或元素后进行更新。稍后添加此类过程的实时可视化功能。
  • 您必须研究这将造成的流量。通过版本控制和基于事件的元素编辑 - 这将非常高效,但成本将是服务器端实际上应该模拟整个 DOM 结构并进行合并和其他操作。

同样,这主要是基于意见的回答,而且不是一个小话题,它涉及到很多领域。我认为就目标的“纯粹”和“良好”方法而言,而不是“最快”,可能只有一些折衷的更简单的解决方案..

关于javascript - 使用 Node.js 和 Socket.io 实时更新大型 HTML 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21854214/

相关文章:

javascript - React hooks - 如何访问...其他传播以及命名属性

javascript - 切换复选框组中的复选框

javascript - 如何在 ANTD 设计菜单中添加自定义图像/图标?

java - 使用 Spring Security 的 SpringMVC Websockets 消息传递用户身份验证

javascript - 如何检测没有对象的响应

javascript - Jest 手动模拟需要新实例的包

javascript - 我如何打包应用程序以获得单个 .exe for Win 或 .app for Mac?

javascript - Ionic 2 菜单转换

javascript - 在websockets javascript和golang服务器上工作,尝试发送文件和图像

websocket - Websocket客户端是否有关闭连接的情况?