.html文件防止script脚本缓存的三种方法

 更新时间:2024年01月19日 10:54:54   作者:柯尔茶  
现在有这样一个问题,由于一些原因,我们经常需要修改gTool的代码然后上传更新cdn,但是用户通过 html 文件访问的 gTool 链接实际上还是缓存的,所以现在问题就是如何禁止缓存,文中给大家介绍了三个方法供大家参考,需要的朋友可以参考下

场景

我们有一个工具库通过 script 放在了全局中,它会提供一个带有许多方法的全局对象 gTool。就像下面这样:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <script type="text/javascript" src="https://xxxx/common/tool.min.js"></script> // [!code hl]
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

然后我们就可以在 main.ts 里能使用 gTool.jumpLink 方法啦。

gTool.jumpLink({})

问题

但是现在有这样一个问题,由于一些原因,我们经常需要修改 gTool 的代码然后上传更新 cdn。但是用户通过 html 文件访问的 gTool 链接实际上还是缓存的,根本不会去请求服务器,也就导致用户的 gTool 版本可能过低 bug 没有被修复。

所以现在问题就是如何禁止缓存。

方法

这里我尝试了 3 个方法

1 创建 script 标签并 appendChild 到 body

最终我选择了这种方案,满足需求并且上线后没有问题。

可以使用 js 动态创建 script 节点并插入到 dom 中去。 但是需要注意动态创建的 script 脚本是异步的,不会阻塞浏览器向下执行 js。

下面这段代码,永远都是 'body 执行' 先于 'tool 脚本执行' 打印。这样就导致获取不到全局的 gTool 对象,也就导致报错了。

<!DOCTYPE html>
<html>
  <head>
    <script>
      var htmlScriptScript = document.createElement('script')
      htmlScriptScript.type = 'text/javascript'
      htmlScriptScript.src = 'https://xxxx/common/tool.min.js?a=' + Math.random()
      htmlScriptScript.onload = function () {
        console.error('tool 脚本执行')
      }
      document.head.appendChild(htmlScriptScript)
    </script>
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script>
      console.error('body 执行')
    </script>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

为了保证 gTool 加载完成后才向下执行脚本,我们可以自己写一个阻塞函数。如下:

<!DOCTYPE html>
<html>
  <head>
    <script>
      var htmlScriptScript = document.createElement('script')
      htmlScriptScript.type = 'text/javascript'
      htmlScriptScript.src = 'https://xxxx/common/tool.min.js?a=' + Math.random()
      htmlScriptScript.onload = function () {
        window.gTool = gTool
      }
      document.head.appendChild(htmlScriptScript)
    </script>
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script>
+      async function main() {
+        function awaitTool() {
+          return new Promise(resolve => {
+            const interval = setInterval(() => {
+              if (window.gTool) {
+                clearInterval(interval)
+                resolve(null)
+              }
+            }, 50)
+          })
+        }
+        await awaitTool();
+        // other code
+      } 

+      main()
    </script>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

main() 函数会每隔 50ms 去检查 window 上是否有 gTool 对象,有就说明 gTool 脚本已经加载完了,可以继续往下执行了,否则就继续递归执行 main(),知道 gTool 脚本加载完毕。

2 在地址后加一个随机参数

并不是很好的解决方案。

这种方法虽然可行,但是每次都需要发版。因为发版需要走流程审核,而且有发版次数限制。

下面两种引入方式都是一样的,只不过第二种每次重新打包的时候会自动刷新时间戳。

<script type="text/javascript" src="https://xxxx/common/tool.min.js?time=1124112341"></script> // [!code hl]

<!-- 或者 -->

<script type="text/javascript" src="https://xxxx/common/tool.min.js?time=<%=Math.random()%>"></script>

3 document.write()

这种方法不行。

使用 document.write API 来防止 .html 文件缓存 script 脚本。

MDN 里写了,从 Chrome 55 开始,Chrome(可能)不会运行通过 document.write() 注入的 <script>,以防止使用 2G 连接的用户找不到 HTTP 缓存。所以这种方法用来动态注入 <script> 脚本根本不可行。

<script>
  document.write("<script src='https://xxxx/common/tool.min.js?rnd=" + Math.random() + "'></s " + " cript> ")
</script>

以上就是.html文件防止script脚本缓存的三种方法的详细内容,更多关于.html防止script缓存的资料请关注脚本之家其它相关文章!

相关文章

  • ES6学习教程之Map的常用方法总结

    ES6学习教程之Map的常用方法总结

    Map 是 ES6 中新增的一种数据结构,与 Set 一起添加,其实功能都差不多。下面这篇文章主要给大家总结介绍了关于ES6学习教程之Map的常用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • JavaScript 复制对象与Object.assign方法无法实现深复制

    JavaScript 复制对象与Object.assign方法无法实现深复制

    这篇文章主要介绍了JavaScript 复制对象与Object.assign方法无法实现深复制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 使用js的replace()方法查找字符示例代码

    使用js的replace()方法查找字符示例代码

    JavaScript具有一个非常有用的方法replace(),可以用它利用备选字符集途欢指定的字符,下面有个不错的示例,大家可以尝试操作下
    2013-10-10
  • 原生JS实现动态添加新元素、删除元素方法

    原生JS实现动态添加新元素、删除元素方法

    这篇文章主要介绍了原生js实现动态添加新元素、删除元素方法 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • js判断生效时间不得大于失效时间的思路及代码

    js判断生效时间不得大于失效时间的思路及代码

    生效时间不得大于失效时间在一些推销、优惠方面还是比较实用的,接下来一起看下详细的实现代码,感兴趣的朋友可以参考下哈,希望对你有所帮助
    2013-04-04
  • JS检测移动端横竖屏的代码

    JS检测移动端横竖屏的代码

    这篇文章主要介绍了JS检测移动端横竖屏的代码,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • JavaScript中的类型检查

    JavaScript中的类型检查

    本文给大家介绍了JavaScript中的类型检查的一些知识点,整理的非常详细,推荐给大家,希望对大家学习JavaScript能够所帮助
    2020-02-02
  • 微信小程序实现日期时间筛选器

    微信小程序实现日期时间筛选器

    这篇文章主要为大家详细介绍了微信小程序实现日期时间筛选器,支持年月日时分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JS插件plupload.js实现多图上传并显示进度条

    JS插件plupload.js实现多图上传并显示进度条

    这篇文章主要为大家详细介绍了PHP结合plupload.js JS插件实现多图上传并显示进度条加删除实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • jquery根据锚点offset值实现动画切换

    jquery根据锚点offset值实现动画切换

    点击后僵硬的切换是不是很不爽,下面为大家介绍的是根据锚点offset值来实现动画切换,喜欢的朋友不要错过
    2014-09-09

最新评论