问题描述
有时在引用样式文件或资源文件时会加上版本号例如:style.css?v=20140520background: xxx.jpg?v=201140520我是菜鸟,有这么几个困惑:
这样的好处和必要性是什么?我只知道一点,避免用户端的缓存而使样式不刷新。请问还有别的考虑吗?在什么情况下是可以不加的,在什么情况下是必须加的?因为我在读别的网站源码的时候发现有些是加的,有些是不加的。服务器根据版本号返回相应版本的文件的机制是怎么样的?我之前对svn,git等版本管理工具的认识仅仅停留在团队代码协作工具上。是不是在这个机制里是svn起的作用?具体的流程是怎样的?如何确定版本号?我看很多代码加版本号的时候是加日期?还有别的方式吗?如何知道自己该加的版本号是什么?问题解答
回答1:我们希望工程师源码是这么写的:
<script type='text/javascript' src='https://www.6hehe.com/wenda/a.js'></script>
但是线上代码是这样的:
<script type='text/javascript' src='https://www.6hehe.com/wenda/a_82244e91.js'></script>
其中”_82244e91”这串字符是根据a.js的文件内容进行hash运算得到的,只有文件内容发生变化了才会有更改。由于版本序列是与文件名写在一起的,而不是同名文件覆盖,因此不会出现上述说的那些问题。同时,这么做还有其他的好处:
线上的a.js不是同名文件覆盖,而是文件名+hash的冗余,所以可以先上线静态资源,再上线html页面,不存在间隙问题; 遇到问题回滚版本的时候,无需回滚a.js,只须回滚页面即可; 由于静态资源版本号是文件内容的hash,因此所有静态资源可以开启永久强缓存,只有更新了内容的文件才会 缓存失效,缓存利用率大增; 修改静态资源后会在线上产生新的文件,一个文件对应一个版本,因此不会受到构造CDN缓存形式的攻击
静态资源版本更新与缓存
回答2:你说的对,这样的好处和必要性就是避免用户端的缓存而使样式不刷新。其它都不重要。如果有版本快速迭代的需求,建议加,以方便用户及时更新。如果是长时间无更新的页面不必加。通常由发布、打包工具来负责输出具体的版本号。可以选用版本管理工具的总体版本号,可以选用修改或打包日期号,可以选用任何自定义的版本号(比如在头文件里手动指定的版本号),总之按需自选。一般用日期号就可以了,比较简单。回答3:对于经常需要修改的静态文件。 每次修改过后自动生成新的版本号。 浏览器就会对新文件进行缓存。对于常用不变的这个就可以不加。 比如你用了不许要制定的第三方库 版本升级的频率不会很高。 这样的就可一不加。