最近在做热更新(其实我一般称呼为补丁更新),发现最外层的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。