全量同步和增量同步怎么选?
结论
全量同步是每次变更都把整篇文档发给服务器。增量同步只发变更区间。大文件、高频率输入用增量;实现简单、文档不大时可以用全量。
展开
服务器在 initialize 里声明:
{ "textDocumentSync": { "change": 2, "openClose": true, "save": true } }
change 的取值是协议里的同步种类:0 不同步,1 全量,2 增量。
全量:
didChange的文本就是最新全文- 服务器直接替换副本
- 实现省事
- 大文件每次按键都传整篇,CPU 和管道都会抖
增量:
- 事件里是
range、rangeLength和text - 服务器按顺序把补丁打到自己的副本上
- 必须保证顺序和版本号。中间丢一次补丁,后面的坐标就全错了
- 客户端一般会带
version。补丁版本不连续就应该向客户端要全量,或者等待下一次didOpen级别的对齐
选择建议:普通源代码用增量。如果服务器内部始终把文本交给一个只能接受全文的编译器,可以在服务器边界把增量合成全文,但对客户端仍声明增量,避免传输放大。
不要另外用文件系统监视代替 didChange。未保存内容只存在于编辑器缓冲区。
容易讲错的点
- 增量补丁的坐标基于「这一笔变更之前」的文档,不是基于文件开头自己重新数。
- 服务器用错版本仍去算补全,返回的 range 会落在别的字符上。
didSave不是增量的替代。保存事件默认不带全文,除非客户端能力里要求includeText。