js文件缓存之版本管理详解


Posted in Javascript onJuly 05, 2013

近几个月来的工作是一个交易系统持续改进项目,迭代发布周期大约为2~3周。最近一次迭代是V16版,在礼拜三完成发布。不幸的是,第二天上午就被老大逮过去。原来老大从生产中揪出了一个bug,大致的问题如下:

系统中有一个常用的自定义控件,目的是协助选择客户,而V16版的持续改进需求是给控件增加两个筛选选项,支持不同的默认值配置。很简单的一个需求,代码修改也简单,其中一个修改是给一个js文件里边的一个函数增加了一个传入参数,用来传递配置值。经过RC、RTW测试,一切都显得很正常,不过上了生产才被发现bug了。加载出来的客户明显不正常、数目不对,也与预期的查询配置不相符。

检查控件内部跳转链接,发现问题,传递的参数明显与预期不符,而这个链接则是由上面修改过的JS函数生成。因此判定问题是由于客户端缓存了原版JS文件,新函数的调用由旧函数所替换引发的。经过清除缓存,重新加载页面后,这个自定义控件能够正常工作。很不幸的是,我们是不能通过打电话告诉每一位用户,你需要清除缓存,然后才能正常使用这个功能。

到此时,我才意识到需要一种方法来控件JS的缓存问题,否则,后续任何涉及JS文件内容的修改,都会因为缓存无法获取最新JS文件,而导致生产事故。

原则上,我们是需要在有JS更新的时候,才会去重新加载JS文件,而不是每次都重新加载,因此第一种做法给JS应用地址后添加随机参数是不可取的,因为它意味着,几乎每次加载页面都会是重新加载JS,而不会合理的利用缓存JS。但是,我们还有第二种更合理的做法,如果关注过一些国外网站代码,会发现,他们通常是在js链接后添加一个版本号参数,而不是随机数,当js代码发生修改时,只需要将版本号加1,就可以很巧妙的解决通知客户端更新js文件。不知道,谁是第一个想到这种方法的人,不过毫无疑问,他是值得我们钦佩的,真是一个不错的idea的!

附赠些许代码:
<script src="../JavaScript/SelectOpenWindow.js?v=1" type="text/javascript"></script>

Javascript 相关文章推荐
jquery 学习笔记 传智博客佟老师附详细注释
Sep 12 Javascript
js日历功能对象
Jan 12 Javascript
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
JavaScript仿微博发布信息案例
Nov 16 Javascript
如何处理JSON中的特殊字符
Nov 30 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
Angular 向组件传递模板的两种方法
Feb 23 Javascript
Vue动态加载异步组件的方法
Nov 21 Javascript
javascript实现移动端上传图片功能
Aug 18 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 #Javascript
把input初始值不写value的具体实现方法
Jul 04 #Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
Jul 04 #Javascript
简单实用jquery版三级联动select示例
Jul 04 #Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 #Javascript
js将控件隐藏的方法及display属性介绍
Jul 04 #Javascript
Jquery多选框互相内容交换的实例代码
Jul 04 #Javascript
You might like
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
PHP时间格式控制符对照表分享
2013/07/23 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
简明json介绍
2008/09/28 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
Python编码时应该注意的几个情况
2013/03/04 Python
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
python__new__内置静态方法使用解析
2020/01/07 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
Python内置异常类型全面汇总
2020/05/28 Python
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
给排水专业应届生求职信
2013/10/12 职场文书
教育学习自我评价
2014/02/03 职场文书
团队拓展活动总结
2014/08/27 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
共青团员自我评价范文
2014/09/14 职场文书
工作收入证明范本
2015/06/12 职场文书
母亲去世追悼词
2015/06/23 职场文书
党员发展大会主持词
2015/07/03 职场文书
同学聚会祝酒词
2015/08/10 职场文书
详解SQL的窗口函数
2022/04/21 Oracle