跳到主要内容

全量同步和增量同步怎么选?

结论​

全量同步是每次变更都把整篇文档发给服务器。增量同步只发变更区间。大文件、高频率输入用增量;实现简单、文档不大时可以用全量。

展开​

服务器在 initialize 里声明:

{ "textDocumentSync": { "change": 2, "openClose": true, "save": true } }

change 的取值是协议里的同步种类:0 不同步,1 全量,2 增量。

全量:

  • didChange 的文本就是最新全文
  • 服务器直接替换副本
  • 实现省事
  • 大文件每次按键都传整篇,CPU 和管道都会抖

增量:

  • 事件里是 range、rangeLength 和 text
  • 服务器按顺序把补丁打到自己的副本上
  • 必须保证顺序和版本号。中间丢一次补丁,后面的坐标就全错了
  • 客户端一般会带 version。补丁版本不连续就应该向客户端要全量,或者等待下一次 didOpen 级别的对齐

选择建议:普通源代码用增量。如果服务器内部始终把文本交给一个只能接受全文的编译器,可以在服务器边界把增量合成全文,但对客户端仍声明增量,避免传输放大。

不要另外用文件系统监视代替 didChange。未保存内容只存在于编辑器缓冲区。

容易讲错的点​

  • 增量补丁的坐标基于「这一笔变更之前」的文档,不是基于文件开头自己重新数。
  • 服务器用错版本仍去算补全,返回的 range 会落在别的字符上。
  • didSave 不是增量的替代。保存事件默认不带全文,除非客户端能力里要求 includeText。