分享如何在勾选MD5 Cache时兼容热更新

最近在做热更新(其实我一般称呼为补丁更新),发现最外层的main.js是无法更新的(因为添加搜索路径是在这个文件进行的,而这个时候已经加载了包里自带的main.js了),但这个文件的内容在勾选了MD5 Cache后,每个版本都会变化(主要是settings.js的文件名会变化),再仔细看热更新范例教程,看到这一句话:构建时请不要勾选 MD5 Cache,否则会导致热更新无效。
不能勾选MD5 Cache?那基本就不能使用CDN了,或者每次更新都需要去刷新CDN,更新略显不便。因此我尝试把自动生成的main.js放进去src目录,在最外层生成一个main.js来require原本的main.js,实际测试后确实可行。至此鱼(补丁更新)与熊掌(MD5 Cache)即可兼得(修改后的hot-update编辑器插件在这里hot-update.zip (1.3 KB),我自己对路径搜索做了一些逻辑修改,仅供参考)。

主题到这里已经结束了,不过我对MD5 Cache还是有些不满意。目前的MD5 Cache只是取MD5码的前5个16进制字符(相当于2.5个字节的数字)附加到文件名当中。我不太清楚5个字符到底是怎么做的决策,但是我觉得还是有碰撞的可能性的(MD5是个不错的哈希算法,不表示MD5的前2.5个字节也是)。一旦出现不同文件内容会哈希到同一个文件名,对使用CDN来说就个灾难,因此我希望在自定义构建流程里面能够开放用户自定义计算md5 cache的接口,或者在manifest里面可以自定义每个文件的下载url。

不用md5也可以用cdn

那需要每次更新都去刷新缓存吧?
还有什么方式,请指教

每一个版本一个目录就好了
我们的远程目录结构是这样的
-verson.manifest
-1.0.0
–project.manifet
–xxxxxxx
-1.0.1
–project.manifest

其中verson的文件设置不缓存就好,对了可能要改一行源码

手机打字,可能拼错了,理解意思就好

我记得每次去下载project.manifest时,都是取本地的project.manifest中的值,而不是远程的verson.manifest中的值
按照你这种方法,需要修改C++代码

这样改的话,main.js就会有缓存了啊

这样增量更新会有问题吧?版本1到7 中间得更新多少个版本?