前端页面脚本更新,并且部署到服务器时,如何让用户端,使用最新脚本?
假如用户一直在a页面,使用的index.js,并且没有刷新浏览器,如何让用户刷新浏览器,加载新的index.js?
有什么方案吗?
前端页面脚本更新,并且部署到服务器时,如何让用户端,使用最新脚本?
假如用户一直在a页面,使用的index.js,并且没有刷新浏览器,如何让用户刷新浏览器,加载新的index.js?
有什么方案吗?
有几种常见的方法可以确保用户在前端页面脚本更新时能够加载最新的脚本。以下是几种常见的方案:
版本号控制:
在引入脚本时,通过添加版本号或时间戳来确保浏览器加载最新的脚本。例如:
<script src="index.js?v=1.0.1"></script>
或者,使用当前时间戳:
<script>
document.write('<script src="index.js?' + new Date().getTime() + '"><\/script>');
</script>
每次部署新版本时,更新版本号或确保时间戳变化,这样浏览器会加载新的脚本文件。
利用 Cache-Control 头部:
配置服务器的 Cache-Control 头部,确保浏览器不会缓存脚本文件,或者设置较短的缓存时间。这样每次请求脚本时,浏览器都会向服务器验证缓存是否有效。
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
对于确保用户加载最新的前端脚本,最常见和有效的方法是使用版本号控制。这种方法简单且易于实现,可以确保每次部署新版本时,用户都能加载到最新的脚本。其他方法如 Service Worker、WebSocket 轮询等,虽然功能更强大,但实现起来相对复杂。根据具体需求选择合适的方法即可。
每次打包的时候把当前打包的最新版本/时间戳打包成一个静态文件,然后在前端轮询,用get请求拿到这个静态文件的内容,对比正在运行版本的版本/时间戳,要是不一样就弹窗告诉用户要刷新,然后把最新的版本/时间戳存到浏览器
理论上使用sse 、websocket 、 轮询都行,如果系统有其他业务已经接入 websocket 就使用websocket, 没有的话,就强烈推荐使用轮询,这个性价比最高,你可以使用一个版本信息的静态文件放在一个文件中,客户端定时轮询请求,一旦发现出现修改,就刷新页面
8 回答5.8k 阅读✓ 已解决
9 回答9.2k 阅读
6 回答4.7k 阅读✓ 已解决
5 回答3.5k 阅读✓ 已解决
3 回答10.3k 阅读✓ 已解决
4 回答7.9k 阅读✓ 已解决
7 回答9.8k 阅读
方案一:如果停留当前页面,用户没有任何操作,更新js文件,可以通过socket向客户端发送消息,客户端接收到消息后主动刷新页面
方案二:nginx配置不缓存js文件,文件过期时间设置为0,一般会返回304状态码,304缓存是浏览器需要向服务器询问一次,如果服务器端认为没有内容更新,直接返回304状态码,无需返回body内容,浏览器就会直接取缓存内容输出,这样省掉了没必要的数据传输,也就提升了访问速度。
方案三:js文件打包时后面添加时间戳
这个插件可以使用一下:https://npm.io/package/version-polling