【问题标题】:Reload javascript and css files for a website in Safari在 Safari 中为网站重新加载 javascript 和 css 文件
【发布时间】:2017-09-13 17:12:50
【问题描述】:

这让我发疯。每个浏览器和设备都有自己的方式来清除缓存并重新加载 .js 和 .css 文件。例如,我可以在 Chrome 中执行此操作的唯一方法是转到我的登录页面,按 F12 加载调试器并继续。这似乎是唯一的方法来做到这一点。

在 Windows 中的旧版 Safari 中,您可以从菜单中执行此操作,就像您在 IMac 桌面上的 Safari 中执行的操作一样。

但是你在 iPhone 或 iPad 上是怎么做的??????

我正在使用 IMac 调试手机,但无论我怎么做,.js 文件都保持不变。当我在页面上查看网站时,更改就在那里。

我尝试过让手机崩溃,双击刷新按钮,将其置于私密模式并返回。没有任何效果。有趣的是,我在私人移动中尝试过它,在“开发”菜单中,我可以看到 .js 文件的两个版本 - 一个有更改,一个没有更改。当我回到非私有模式时,旧的 .js 文件(没有更改)在那里。

我还尝试删除我网站的网站数据,但没有成功。

谁知道怎么做??????

谢谢,

汤姆

【问题讨论】:

    标签: javascript iphone safari


    【解决方案1】:

    在包含您的 JS 或 CSS 时附加一个查询字符串,并在您更新代码时更改它。它将使该文件的缓存本地版本无效。

    <script src="test.js?1234567"></script>
    

    通常使用时间戳。

    【讨论】:

    • 它不适用于 Mac webkit 浏览器 (Chrome/Safai)。
    • 使用(动态)时间戳将导致 CSS 永远不会被缓存。你不想这样。
    【解决方案2】:

    转到 Safari -> 首选项 -> 单击高级选项卡底部的高级选项卡单击“在栏中显示开发菜单”复选框并关闭首选项。然后你可以在有Safari、文件、编辑、查看等的程序栏中打开开发菜单,然后点击清空缓存。

    【讨论】:

    • 我试过了。我一直在尝试在 IMac 和 iPhone 上进行停止和启动 safari 的所有组合,并选择 Empty Caches,但似乎无法弄清楚什么是有效的。我做了足够多的时间,最终它得到了刷新。但是每次更改都要花 20 分钟来刷新缓存,这是非常令人沮丧的。
    【解决方案3】:

    在 iOS 10 中,您可以通过转到设置 > Safari 并单击“清除历史记录和网站数据”来清除缓存。

    对我来说,这有点矫枉过正,因为我不想为 every 网站删除 everything。所以,我要做的是直接浏览到 js 或 css 文件,如果它是较旧的缓存版本,则重新加载它。

    【讨论】:

    • 我也不想清除每个站点的所有内容。我正在调试我的应用程序并进行更改。我只想刷新我的应用程序/页面的 .js 和 .css 文件。
    • @tshad 这已在 iOS 11 中得到解决。您现在可以转到“设置”>“Safari”>“高级”>“网站数据”。这允许您清除各个域的网站数据。
    • 在我的情况下,我什至找不到单个网站数据,因此直接浏览 css 文件是强制 Safari 刷新其样式表缓存的好方法。工作了一个款待。赞成。
    【解决方案4】:

    我认为没有一种“简单”的方法可以做到这一点。我已经尝试了以上所有方法,包括修改 css 和 js 查询字符串。最接近有效的是 Rockadile 的评论。

    打开设置--Safari--网站数据

    然后清除您要刷新的站点

    提示:如果您正在调试页面,请使用 IP 地址,那么它将显示在此列表的顶部。保持 safari 和网站数据都打开,以便您可以在两者之间切换。

    这不像 ctl-F5 那样简单,但肯定比清除整个浏览器的缓存要少。

    【讨论】:

      【解决方案5】:

      2 个答案:

      第一个答案:如果您只需要强制刷新一次,请点击标签图标,然后选择私人并粘贴并转到 URL。私有会话将永远不会有任何内容的缓存版本,除非它被缓存在中间代理处。当然,它会缓存对同一文件的后续请求。您可以关闭私人会话并创建一个新会话,这与切换到设置应用程序的烦恼程度大致相当。

      第二个答案:如果您是开发人员并且正在使用 Apache,您可以像这样设置一个 .htaccess 文件:

      <filesMatch "\.(html|htm|js|css)$">
        FileETag None
        <ifModule mod_headers.c>
           Header unset ETag
           Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
           Header set Pragma "no-cache"
           Header set Expires "Wed, 21 Oct 2015 07:28:00 GMT"
        </ifModule>
      </filesMatch>
      

      【讨论】:

        【解决方案6】:

        我发现此解决方案适用于 iOS Safari 和其他浏览器...

        每当它检测到缓存的 Web 应用程序或网页与服务器的版本不匹配时,它会执行 window.location.reload(true) 强制页面重新加载以避免使用缓存。

        您确实希望在发布您的网站的第一个版本之前使用此机制,否则一旦发布,您将无法再依赖永远升级您的 iOS 用户.如果您依赖客户端应用程序和服务器版本同步,这将是一场噩梦。 叹息 ...可悲的是,Safari 和 iOS Safari 似乎特别渴望take the throne once held by Internet Explorer

        部署期间

        • 增加并保存内部版本号。
        • 我使用一个看起来像 {"major":1,"minor":0,"patch":0,"build":12}version.json 文件
        • version.json 复制到客户端和服务器应用程序。

        在服务器上:

        • 用 PHP/Node/Ruby/C# 编写一个服务器 API,返回服务器的 version.json
        • 使用 Web 服务器规则和响应标头来防止 API 结果被缓存。

        在客户端应用或网页中:

        • 要诊断问题,请显示客户端版本 + 客户端和服务器内部版本号。

        页面加载时调用...

        function onload() {
          var clientVersion = require("./version.json");
          // Might replace axios with new fetch() API or older XMLHttpRequest
          axios.get("/api/version").then(function(res) {
            var serverVersion = res.data;
            var lastReload = parseInt(localStorage.getItem("lastReload") || "0");
            var now = new Date().getTime();
            if (
              serverVersion.build !== clientVersion.build &&
              now - lastReload > 60 * 1000 // Prevent infinite reloading.
            ) {
              localStorage.setItem("lastReload", now);
              window.location.reload(true); // force page reload
            }
          });
        }
        

        您可能更喜欢测试serverVersion.build &gt; clientVersion.build 而不是serverVersion.build !== clientVersion.build。测试!== 的好处在于,它不仅可以让您升级版本,还可以回滚版本并确保客户端也能回滚。

        如果客户端和服务器内部版本号不匹配,我会通过仅在 60 秒内执行一次重新加载来防止客户端无限重新加载。

        请注意,此方法仅与匹配的内部版本号(= 部署号)有关,您可能更喜欢更复杂的东西。

        这是一个用于增加内部版本号的简单节点应用程序。

        const APP_DATA = "../app/src/assets"; // client folder
        const FUNC_DATA = "../functions/data"; // server folder
        
        var log = require("debug")("build:incr");
        var fs = require("fs");
        
        function readJson(path) {
          log(`Reading: ${path}`);
          const text = fs.readFileSync(path);
          return JSON.parse(text);
        }
        
        function writeJson(path, json) {
          log(`Writing: ${path}`);
          fs.writeFileSync(path, JSON.stringify(json));
        }
        
        let version = readJson("./version.json");
        
        version.build++;
        
        log("Version = ", version);
        writeJson("./version.json", version);
        writeJson(`${APP_DATA}/version.json`, version);
        writeJson(`${FUNC_DATA}/version.json`, version);
        

        【讨论】:

        猜你喜欢
        • 2013-04-28
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 2022-01-08
        • 2022-08-16
        • 2019-01-09
        • 2019-03-01
        相关资源
        最近更新 更多