【问题标题】:How to force refresh client js from server side?如何从服务器端强制刷新客户端 js?
【发布时间】:2013-12-05 13:02:01
【问题描述】:

情况如下:

我得到一个 js 来监控网络广告。由于浏览器缓存,当我在服务器端更新 js 时,客户端上的 js 不会立即刷新。如何在我更新 js 后立即强制刷新客户端 js服务器端?

附言添加版本号策略在我的情况下没有用。

【问题讨论】:

    标签: javascript browser


    【解决方案1】:

    简单的策略 - 将版本号作为查询字符串添加到您的 js 文件中,然后更改版本号。这将导致浏览器再次获取您的 js 文件 -

    <script src="mysource.js?version=123"></script>
    

    每当您在服务器上更改脚本时,也要在 html 中更改此版本号。或者更好的是,每次请求此脚本时应用一个随机数作为 version 值。

    【讨论】:

    • 这个策略不能在我的情况下使用。我的js被不同的项目使用,这个策略意味着一旦我更新我的js,一堆人必须更新他们的代码,成本太高.谢谢。
    • @Allerson:可能没有。使用您的脚本的其他人可以附加一个随机数作为版本值。这样,每次请求脚本时,都会请求一个新的值(如果随机数非常大,两次生成随机数的机会非常低)。所以他们不必手动做任何事情。这就是一些 JavaScript 框架(即 Sencha Touch)加载其 JS 组件的方式。
    • 一个新问题:因为我们附加了一个随机数作为版本值,这意味着js不能被缓存,我们的服务器会收到更多的请求。这个js一天会被请求2000万次以上,并且我们只有3台服务器,这样压力会很大。
    • 出色的 hack,它拯救了我的一天 - 谢谢 :)
    【解决方案2】:

    您可以使用 HTTP 的 cache-control mechanisms 来控制浏览器的缓存。

    在提供 JS 文件的副本时,请在响应中包含 ETag 和/或 Last-Modified 标头。还包括一个“Cache-Control: must-revalidate”标头。这告诉浏览器它必须每次都与服务器进行检查,并且它可以在以后的请求中发送If-None-Match 和/或If-Modified-Since 标头,要求服务器仅在文件发生更改时才发送文件。

    如果您想避免浏览器每次检查服务器的负载,并且更改不会立即生效也可以,您还可以在当前时间和 @987654328 中包含 Date 标头@ 标头设置为将来的某个时间点——可能是 12 或 24 小时。这允许浏览器在指定的时间内使用其缓存副本,然后再与您的服务器进行核对。

    HTTP 的缓存控制功能非常强大,但也有很多细微差别,例如对中间缓存的控制(例如,在您的服务器和用户浏览器之间 的其他系统)。您将需要全面了解caching in HTTP,而不仅仅是我提到的特定标头字段。

    【讨论】:

      【解决方案3】:

      您可以通过更改文件名来做到这一点。添加一些版本号(可能类似于参数,例如,对于 PHP,filename.js?v=time();)或者只是在文件名的末尾附加一些随机数。

      其实我不确定你是否可以强制客户端刷新这种类型的文件。但是在更改文件名时,您将强制浏览器获取最新版本。

      【讨论】:

        猜你喜欢
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 2010-09-07
        • 2012-09-25
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多