Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 实时协作编辑-它是如何工作的?_Javascript_Ajax - Fatal编程技术网

Javascript 实时协作编辑-它是如何工作的?

Javascript 实时协作编辑-它是如何工作的?,javascript,ajax,Javascript,Ajax,我正在编写一个应用程序,其中我希望有近实时的文档协作编辑功能(非常类似于谷歌文档风格的编辑) 我知道如何跟踪光标的位置,这很简单。只需使用当前用户id、文件名、行号和行号(可存储在数据库中)每半秒或每秒轮询一次服务器,此轮询请求的返回值是其他用户光标的位置 我不知道如何更新文档,这样它就不会将光标抛出并强制完全重新加载,因为这对我来说太慢了 这真的只需要在谷歌Chrome上运行,最好是在Firefox上。我不需要支持任何其他浏览器。后台用于合并来自多个对等方的协作编辑的算法称为。不过,实现它并不

我正在编写一个应用程序,其中我希望有近实时的文档协作编辑功能(非常类似于谷歌文档风格的编辑)

我知道如何跟踪光标的位置,这很简单。只需使用当前用户id、文件名、行号和行号(可存储在数据库中)每半秒或每秒轮询一次服务器,此轮询请求的返回值是其他用户光标的位置

我不知道如何更新文档,这样它就不会将光标抛出并强制完全重新加载,因为这对我来说太慢了


这真的只需要在谷歌Chrome上运行,最好是在Firefox上。我不需要支持任何其他浏览器。

后台用于合并来自多个对等方的协作编辑的算法称为。不过,实现它并不是件小事


另请参见有用的链接。

谷歌文档团队对实时协作的工作原理做了一些案例研究,但我找不到博客条目

不过,维基百科页面上有一些不错的东西:

正如金塔塔斯所指出的,这是通过运营转型来实现的。据我所知,这项功能的大部分研究和开发都是作为现已不复存在的GoogleWave项目的一部分进行的,被称为Wave协议。幸运的是,GoogleWave是开源的,因此您可以在

上获得一些好的代码示例,而不必为此使用xmpp或Wave。关于名为infinote的开源实现的大部分工作已经用jinfinote()完成。Jinfinote最近还被移植到python()以集中处理并发性和文档状态。我目前在hwios项目()中使用这两种方法,该项目依赖于WebSocket和json传输。您不希望真的希望对此类应用程序使用轮询。在我看来,xmpp似乎使事情变得不必要的复杂。

在遇到这个问题并进行了更仔细的搜索之后,我认为最好的独立应用程序是,它作为JS浏览器应用程序运行,并在服务器端使用Node.JS。这背后的技术被称为

Etherpad最初是一个相当重的应用程序,被谷歌收购并并入谷歌Wave,但失败了。该代码以开源的形式发布,该技术用Javascript为Etherpad Lite重写,现在改名为“Etherpad”。一些以太技术可能也被整合到谷歌文档中

自Etherpad以来,这项技术已经有了各种版本,特别是一些Javascript库,它们允许将此直接集成到您的web应用程序中:


我是将实时编辑器直接添加到应用程序的软件包的维护者,IMHO是两个世界中最好的:)

实时协作编辑需要几件事情才能有效。这里的大多数其他答案只关注问题的一个方面;即分布式状态(也称为共享可变状态)。操作转换(OT)、无冲突复制数据类型(CRDT)、差分同步和其他相关技术都是实现近实时分布式状态的方法。大多数关注最终的一致性,这允许每个参与者状态的暂时差异,但保证每个参与者状态在编辑停止时最终会收敛。其他答案提到了这些技术的几种实现

然而,一旦共享了可变状态,就需要其他一些特性来提供合理的用户体验。这些附加概念的示例包括:

  • 身份:与您合作的人是谁
  • 状态:当前与您一起“在此”编辑的用户
  • 通信:聊天、音频、视频等,允许用户协调行动
  • 协作式提示:提示其他参与者正在和/或将要做什么的功能
共享光标和选择是协作提示(也称协作感知)的示例。它们帮助用户了解其他参与者的意图和可能的下一步行动。最初的海报部分是询问共享可变状态和协作提示之间的相互作用。这一点很重要,因为文档中光标或所选内容的位置通常通过文档中的位置来描述。问题在于光标的位置(例如)取决于文档的上下文。当我说我的光标在索引37处时,这意味着我正在查看的文档中的字符37。由于您的编辑或其他用户的编辑,您当前拥有的文档可能与我的不同,因此文档中的索引37可能不正确

因此,您用来分发游标位置的机制必须以某种方式集成到系统的机制中,或者至少了解该机制,该机制提供对共享可变状态的并发控制。今天的挑战之一是,尽管存在许多OT/CRDT、双向消息、聊天和其他库,但它们是未集成的孤立解决方案。这使得构建一个能够提供良好用户体验的最终用户系统变得非常困难,并且常常导致技术难题留给开发人员去解决

最后,为了实现一个有效的实时协同编辑系统,你需要考虑所有这些方面;我们甚至还没有讨论历史、授权、应用程序级冲突解决和许多其他方面。您必须以对您的用例有意义的方式构建或找到支持这些概念的技术。那么你必须整合