Javascript 实时协作编辑-它是如何工作的?
我正在编写一个应用程序,其中我希望有近实时的文档协作编辑功能(非常类似于谷歌文档风格的编辑) 我知道如何跟踪光标的位置,这很简单。只需使用当前用户id、文件名、行号和行号(可存储在数据库中)每半秒或每秒轮询一次服务器,此轮询请求的返回值是其他用户光标的位置 我不知道如何更新文档,这样它就不会将光标抛出并强制完全重新加载,因为这对我来说太慢了Javascript 实时协作编辑-它是如何工作的?,javascript,ajax,Javascript,Ajax,我正在编写一个应用程序,其中我希望有近实时的文档协作编辑功能(非常类似于谷歌文档风格的编辑) 我知道如何跟踪光标的位置,这很简单。只需使用当前用户id、文件名、行号和行号(可存储在数据库中)每半秒或每秒轮询一次服务器,此轮询请求的返回值是其他用户光标的位置 我不知道如何更新文档,这样它就不会将光标抛出并强制完全重新加载,因为这对我来说太慢了 这真的只需要在谷歌Chrome上运行,最好是在Firefox上。我不需要支持任何其他浏览器。后台用于合并来自多个对等方的协作编辑的算法称为。不过,实现它并不
这真的只需要在谷歌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)、差分同步和其他相关技术都是实现近实时分布式状态的方法。大多数关注最终的一致性,这允许每个参与者状态的暂时差异,但保证每个参与者状态在编辑停止时最终会收敛。其他答案提到了这些技术的几种实现 然而,一旦共享了可变状态,就需要其他一些特性来提供合理的用户体验。这些附加概念的示例包括:
- 身份:与您合作的人是谁
- 状态:当前与您一起“在此”编辑的用户
- 通信:聊天、音频、视频等,允许用户协调行动
- 协作式提示:提示其他参与者正在和/或将要做什么的功能