reloadJs请问,重启web服务器浏览器会重新加载js吗?
最近做项目要升级,但是又怕有的浏览器没有及时更新js,导致业务出错;请教了一个比我多工作1年的同事;他说重启服务器,浏览器会重新加载js文件,真的是这样吗?
(刚才看了下,发现开源中国首页很多js文件url都加了?t=14435345454这种时间戳加参数的形式,看来这种改变路径以达到重新请求的方式越来越流行了。但是我还是要科普一下,以便大家看到这篇文章时,可以同时了解下缓存机制。
网上搜的:Last-Modified:服务器上文件的最后修改时间
Etag:文件标识
Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间)
Cache-control:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间 )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
加个版本号,更新的时候版本号一起更新就不会有这样的问题。
变版本号,整那些没用的干啥 一个个还都长篇大论的
回复
国内百度的FIS3,是一个一站式的解决方案。搞定的话,基本前端所有的构建都没有问题了。如果只是手机中那种单页面应用,直接用webpack这个打包工具也可以,基于node。
可否具体讲下有哪些工具或者思路能自动完成这个?
回复
谢谢,我研究下
文件名不能随便改,改超链接参数就可以了。
回复
文件名不能随便改是因为打包时依赖做的不好,你看互联网这些大站,都是文件名md5,变化的时候直接生成一个新文件,这样的话非常安全,可以绕过所有的缓存系统。
不一定,要看你webserve的设置。
如果设置了资源立刻过期(Cache-Control:max-age=0),那么浏览器每次请求都不会走缓存,都是去源服务器请求数据。
如果设置了cache时间大于0,那么浏览器会先判断是否过期再去获取资源。没有过期的话直接从浏览器缓存获取。
如果资源已过期,同时设置了etag,那么浏览器会对比etag,发现etag没有变化,那么就会直接返回304+空的response body,这样仅仅有http头部的传输消耗。
最好的方式就是上线时采用构建工具,自动查看依赖,修改变化过文件的文件名,这样就不用关心客户端的缓存问题,因为只要是变化的文件,最终上线的时候,文件名都变了。上线的时候先上资源文件,再上html,一点问题都不会有。
可以增加时间戳,比对下嘛,
Last Modified的前提是浏览器要发请求到服务器判断版本,这就是一个延迟。如果用文件名带版本号的机制,在http设置js的超时时间很长后,这样第二次加载的时候就直接从浏览器缓存拿起来,完全没有延迟了。
回复
说明你们的版本管理太烂
回复
我修改的是超链接路径,跟服务器换和负载均衡扯上什么关系了。
回复
时间戳手动改?一般都是读磁盘上文件修改时间吧。那这就推倒出我刚才说的那些问题了。
回复
其实我是在回
@gqy2468 ,没有在讨论你的话题~~~
回复
你们讨论的那么热烈,我就不插话了
js是客户端脚本,和web服务器重启无关,你要让浏览器重新加载js可以考虑修改js的url,后面加个时间戳,比如http://www.oschina.net/js/2012/jquery-1.7.1.min.js?t=1451964198000
说的好,网上搜的: Last-Modified:服务器上文件的最后修改时间 Etag:文件标识 Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间) Cache-control:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间)
你要好好研究下HTTP协议中header里的几个参数:
Cache-Control, Expires
Etag, Last-Modified
这两组理解后就知道和web服务器重不重启根本没有任何关系