白嫖党的福利,js 片段实现同步感知

前言

思源 s3 或 webdav 同步,如果自动同步的话,官方最快也要 10 分钟左右,虽然云端选项里说,数据不动后 30 秒后同步,但实时上,真正两端同步要 10 分钟左右,甚至更久。

但官方同步也提供了同步感知功能,可以在 30 秒左右实现两端真正的同步。

这个功能很不错,但需要年订阅及同步空间受到 8G 限制。

那么如果使用 s3 或 webdav 能不能实现像官方同步那样的同步感知功能呢?

当然可以,这个脚本就是为了解决这个问题而开发的。

先看效果

左侧 PC 客户端,右侧手机客户端。

这是同步间隔 2 秒钟的效果,2 秒后开始同步(请仔细观察下方的同步状态),受限于网络,实际同步效果可能会有几秒钟的延迟。

r53.gif

完整脚本如下

gitee 备份代码:如果上述代码无法访问,可点击这里访问备份版。

原理

下载 3.png

本脚使用 GoEasy 平台的 webscoket 开发,因此需要先去平台注册账号和创建应用。不过别担心,这些操作非常简单,下面会一步步介绍。

GoEasy 平台承诺永久免费,但有一定的限制,不过对我们做思源同步来说功能足够了,官方提供了国内和国外服务器,速度很快。

使用方法

  1. 注册账号,去官网这里 https://www.goeasy.io/cn/signup.html 注册,这个无需多说。

  2. 创建应用,登录后,到这里 https://console.goeasy.io/#/application 创建应用。

    image.png

    应用名随便输入即可。

    建议选择杭州服务器和基础型,基础性默认每月有 10 万条消息。日活用户数量,就是支持的客户端数。那么消耗的消息数=客户端数 x 1 + 1,比如,你推送了一条消息,有三个客户端成功接收,那么您总共消费的消息量为 1 + 3 = 4 条。

    这里虽然说免费 5 年,但官方首页说永久免费,不知道是否仅这个应用限制 5 年,如果是这样的话,那么 5 年后删除该应用,重新建个应用应该可以的。

    每月 10 万条基本上够用了,如果不够,只需要每次同步时延迟同步时间就可以了,后面还会说明。

  3. 获取 appKey,创建应用后,即可去应用详情页查看 appKey 了,这里用 Common key 就可以了,如图

    image.png

  4. 把上面的完整脚本复制到 js 代码片段中,然后把 const appKey = 'BC-xxxxxx' 参数修改为你刚才的 Common key 即可。

  5. 刷新或重启思源,就可以了。

参数说明和注意事项

  1. 参数 jsPath 默认使用官方的 cdn 链接,这里建议下载到本地,访问速度更快。
  2. autoSync 参数,如果设置为 true,当内容修改时会自动同步,如果设置为 false,只有手动点同步按钮时,才会通知其他客户端进行同步。
  3. autoSyncInterval 参数,自动同步间隔时间,单位秒,默认 30 秒,不宜设置过小,过小则易导致冲突,且频繁输入时可能导致频繁同步,从而导致较耗资源。不过,别太担心,设置适宜的同步间隔一般没有性能问题,因为脚本仅在文件变化后才同步,文件无变化不同步,因此,一般不会导致性能问题。如果 autoSyncInterval 秒内多次被改动,仅最后一次同步改动后 autoSyncInterval 秒后才同步,所以这个值不宜过小,过小会导致频繁同步。另外,同步过于频繁也会比较消耗 GoEasy 的消息数,换句话说,如果消息数不足时,可以把该参数适当设置大点即可。
  4. syncActions 参数,需要同步的操作,可根据自己的需要增删,注释或删除不需要的操作即可关闭,但这个列表并未包含所有修改操作,仅包含一些常用操作。
  5. 必须配置了 s3 同步或 webdav 才行,官方同步不支持(官方同步,请使用官方自带的感知功能)。且该脚本仅在 s3 同步下测试通过,webdav 的用户请自行测试,如果有问题可以自行解决或本帖反馈。
  6. 虽然实现了接近实时的同步功能,但仍然需要按交替进行操作文档且同步期间不宜操作文档,否则容易造成冲突。
  7. 如果同步选项选择了 30 秒后自动同步选项可能会存在和系统的自动同步同时被触发的情况,虽然这个概率很小,因此使用该脚本时,推荐选择手动同步(开启和关闭时自动同步一次)选项,这样最大程度的减少冲突的可能,虽然通常影响不大。(这里有个疑问,不知道系统自动同步是如何实现的?没发现调用 api 和 websocket,难道是内核内部自动同步的,没和前端进行交互?有知道的大佬请告知下,先谢谢啦!

免责声明

同步有风险!同步前请做好备份!!!请在新空间测试无误后再使用!本脚本仅用于学习交流,造成的任何后果均与脚本及作者无关。

鸣谢

listenChange 函数参考了 @muhanstudio 大佬的代码

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23023 引用 • 92617 回帖
  • 同步
    28 引用 • 398 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1273 回帖
  • S3
    8 引用 • 207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • caogle

    文件冲突之类的可以彻底根除了,赞

  • 其他回帖
  • wilsons

    嗯嗯,国内这种免费的不多,这个好在使用简单,使用太复杂了不适合新手用户。

    1 回复
  • wilsons

    更新至 0.0.4

    增加同步失败时通知用户,可通过参数开关;

    增加断线消息补发;

    去掉控制台调试信息;

    增加即将同步时的云朵状态(红色代表即将在 30 秒后开始同步)

    image.png

    image.png

  • const appKey = 'BC-xxxxxx' 的 Common key 参数修改到引号里,还是将这个全部替换掉?!

    1 回复
  • 查看全部回帖