【问题标题】:Deploying Updated Javascript Files部署更新的 Javascript 文件
【发布时间】:2011-07-01 13:57:20
【问题描述】:

如果我想为现有的 JS 文件部署错误修复,如何确保旧的没有缓存在客户的计算机上?

【问题讨论】:

    标签: javascript deployment


    【解决方案1】:

    通常情况下,您的静态资源应进行版本控制,并通过/static.js?ver=123 等网址提供服务。所以你只需要增加版本号。以这个相同的站点为例,查看源代码,您会在<head> 部分注意到以下内容:

    <script type="text/javascript" src="http://sstatic.net/js/master.min.js?v=689f646cde8d"></script>
    

    【讨论】:

    • 是否有任何已知的 Web 服务器不能正确处理这个问题?或者可能是 https 什么的?
    • 已知某些代理软件存在不使用查询参数缓存资源的问题。通常的做法是在文件名中包含版本号,例如jquery-1.4.2-min.js.
    • @anddoutoi 起初我认为这对于版本控制文件来说似乎不是很有用,但我想这可能是部署过程的一部分,可能是在它被缩小时。
    • 但是,当服务器在 URL 中作为查询获取版本时,它如何识别文件的正确版本?版本号不会出现在 URL 之外的其他任何地方,还是我在这里误解了什么?
    【解决方案2】:

    如果一切都符合规范,那么您不需要做任何特别的事情。 HTTP 已经有机制来处理这个问题。浏览器应发送带有检索日期的If-Modified-Since 标头或带有缓存副本的ETagIf-None-Match 标头。服务器会检查服务器上文件的修改时间(或者ETag,计算中应该包含修改时间),如果修改时间小于浏览器给定的时间,或者ETag匹配,返回一个304 未修改响应。浏览器只有在收到 304 响应时才应使用其缓存副本。

    其中一个问题是缓存代理,它们要么忽略任何服务器提供的 Expires 标头,要么在未给出时假设它在未来会很好,在这种情况下,您可以发送带有 "must-revalidate" 指令的 Cache-Control 标头.

    当然,浏览器或代理可能不兼容,在这种情况下,其他答案将向您展示如何强制浏览器重新获取资源。

    【讨论】:

      【解决方案3】:

      如果你使用的是 php

      <link rel="stylesheet" 
          href="<?php echo './general.css?' . filemtime('./general.css'); ?>"
          type="text/css" media="screen, projection" />
      

      永远忘记这个问题,它会添加 ?后跟文件自动修改时间,每次更改文件时都会有所不同。

      应该跟其他语言类似。

      【讨论】:

      • 这不会让浏览器在每次刷新页面时都加载(就好像它是新的一样)文件?
      【解决方案4】:

      更改包含 JS 的 HTML 文档中的 URL。

      在查询字符串中附加一个数字(例如版本、源代码控制修订、时间戳)是一种常用技术。

      例如:src="/js/myjs.js?7"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-19
        相关资源
        最近更新 更多