baynkbtg 2017-04-06
这个过程叫做 revision。如果你有一个名字是 main.js 的脚本,且有 cache 头,浏览器就会对他进行缓存,下次再访问时文件如果尚在缓存期内就直接读取缓存,而非再次从网络加载,提升页面的访问速度。问题来了,如果这时你对这个文件进行任何修改,可能是加新功能,也可能是修正了某个导致非常严重问题的 bug,即使你更新了服务器上的 main.js,用户浏览器也是不会更新的,因为尚在缓存期内。因此根据文件内容算出一个 hash 值作为文件名,只要文件内容稳定,文件名就不发生变化,你可以把缓存期限设置为一万年,但是一旦内容变化,就生成一个具有新名字的文件,就解决了上诉问题。可以理解成这是针对同一个文件的版本控制,每个版本都会有对应的一个实体文件。以前还有做法是在文件名后面加 query 参数,文件名不变,query 变了也不会直接读取缓存。更有甚者(国内某知名 SNS 网站)现在还在用的方式是在前端用脚本加时间戳,导致文件永远不会被缓存...即使内容没变,浪费流量、拖慢加载速度。除了节省流量、提升加载速度,也使得热部署成为可能。现在所有的前端 workflow 中 revision 应该是标配了。
因为浏览器存在缓存机制,所以需要改变js文件的名字保证下一次浏览器可以请求到最新的js文件。
如果你愿意可以用更好看的命名方法,只要手动在js文件名后面加上一个版本号,但是手动修改文件名这种重复性劳动还是交给计算机做吧。
于是md5这种方法登场了。