9
回答
reloadJs请问,重启web服务器浏览器会重新加载js吗?

最近做项目要升级,但是又怕有的浏览器没有及时更新js,导致业务出错;请教了一个比我多工作1年的同事;他说重启服务器,浏览器会重新加载js文件,真的是这样吗?

(刚才看了下,发现开源中国首页很多js文件url都加了?t=14435345454这种时间戳加参数的形式,看来这种改变路径以达到重新请求的方式越来越流行了。但是我还是要科普一下,以便大家看到这篇文章时,可以同时了解下缓存机制。

网上搜的: 
    Last-Modified:服务器上文件的最后修改时间 
    Etag:文件标识 
    Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间) 
    Cache-control:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间 )
举报
共有9个答案 最后回答: 2年前

你要好好研究下HTTP协议中header里的几个参数:

Cache-Control,  Expires

Etag, Last-Modified

这两组理解后就知道和web服务器重不重启根本没有任何关系

--- 共有 1 条评论 ---
快速开发师说的好,网上搜的: Last-Modified:服务器上文件的最后修改时间 Etag:文件标识 Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间) Cache-control:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间) 2年前 回复
js是客户端脚本,和web服务器重启无关,你要让浏览器重新加载js可以考虑修改js的url,后面加个时间戳,比如http://www.oschina.net/js/2012/jquery-1.7.1.min.js?t=1451964198000
--- 共有 8 条评论 ---
gqy2468回复 @乌龟壳 : 你们讨论的那么热烈,我就不插话了 2年前 回复
乌龟壳回复 @快速开发师 : 其实我是在回@gqy2468 ,没有在讨论你的话题~~~ 2年前 回复
快速开发师回复 @乌龟壳 : 说实话跟本没明白你说的是什么意思,我们讨论的这个人发言,跟你说的服务器上的文件修改时间卵关系都没有,我也可以不加它那个时间戳,我这样“xx.js?sss=asdasd" 都是可以的。你是没理解到真正作用被他的发言所误导,加?加参数是要让请求的资源路径不一样,浏览器本地缓存是根据完全的路径作为key值,只要不一样就可以保证重新请求了。 2年前 回复
乌龟壳回复 @快速开发师 : 时间戳手动改?一般都是读磁盘上文件修改时间吧。那这就推倒出我刚才说的那些问题了。 2年前 回复
快速开发师回复 @乌龟壳 : 我修改的是超链接路径,跟服务器换和负载均衡扯上什么关系了。 2年前 回复
我是好奇这个标题点击进来的,这种情况一般就是一楼说的那样,现在的处理方式都是在 xxx.js?v=1.0 这样子的动态参数,就是静态资源版本,请求的URL变化了,浏览器也就不会缓存了。

真是醉了,写 web 这种基础知识都不了解吗?还 url 加个时间戳。Last-Modified、If-Modified-Since。

最简单的方式:把你的服务器的每个 js 文件尾部加个空格,修改其最后修改时间 mtime。

--- 共有 3 条评论 ---
jQer回复 @快速开发师 : 说明你们的版本管理太烂 2年前 回复
乌龟壳Last Modified的前提是浏览器要发请求到服务器判断版本,这就是一个延迟。如果用文件名带版本号的机制,在http设置js的超时时间很长后,这样第二次加载的时候就直接从浏览器缓存拿起来,完全没有延迟了。 2年前 回复
快速开发师呵呵,你的更麻烦,还要破坏文件,一般做项目都是要提交到SVN的,别人一看,咦,谁动了我的文件。 2年前 回复

不一定,要看你webserve的设置。

如果设置了资源立刻过期(Cache-Control:max-age=0),那么浏览器每次请求都不会走缓存,都是去源服务器请求数据。

如果设置了cache时间大于0,那么浏览器会先判断是否过期再去获取资源。没有过期的话直接从浏览器缓存获取。

如果资源已过期,同时设置了etag,那么浏览器会对比etag,发现etag没有变化,那么就会直接返回304+空的response body,这样仅仅有http头部的传输消耗。

最好的方式就是上线时采用构建工具,自动查看依赖,修改变化过文件的文件名,这样就不用关心客户端的缓存问题,因为只要是变化的文件,最终上线的时候,文件名都变了。上线的时候先上资源文件,再上html,一点问题都不会有。

--- 共有 5 条评论 ---
zabcd117回复 @快速开发师 : 文件名不能随便改是因为打包时依赖做的不好,你看互联网这些大站,都是文件名md5,变化的时候直接生成一个新文件,这样的话非常安全,可以绕过所有的缓存系统。 2年前 回复
快速开发师文件名不能随便改,改超链接参数就可以了。 2年前 回复
乌龟壳回复 @zabcd117 : 谢谢,我研究下 2年前 回复
zabcd117回复 @乌龟壳 : 国内百度的FIS3,是一个一站式的解决方案。搞定的话,基本前端所有的构建都没有问题了。如果只是手机中那种单页面应用,直接用webpack这个打包工具也可以,基于node。 2年前 回复
乌龟壳 可否具体讲下有哪些工具或者思路能自动完成这个? 2年前 回复
顶部