在 Safari 中为网站重新加载 javascript 和 css 文件

Posted

技术标签:

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

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

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

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

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

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

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

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

谢谢,

汤姆

【问题讨论】:

【参考方案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":12version.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);

【讨论】:

不错的解决方案。不幸的是,似乎不推荐将参数传递给location.reload。 ***.com/questions/55127650/…

以上是关于在 Safari 中为网站重新加载 javascript 和 css 文件的主要内容,如果未能解决你的问题,请参考以下文章

iPad iOS 无法加载网站并且总是重新加载

删除ios safari浏览器的网站数据

网站在Safari中无法正常显示

第一次在 Safari (mac) 中未正确加载素材图标

单击 Safari 上的后退按钮时使用 React 挂钩强制页面重新加载

Safari 重新加载内存中的视频