大佬们关于这种前端容器滚动更新的问题有什么解决方案吗?

123 天前
 2Nfree

服务是内部服务,没有 CDN, 前端容器用 K8S 托管 现在发现一个问题: 前端滚动发布后,用户侧没关闭旧页面,还是指向之前的 js ,就会报错 Failed to loadmodule script: Expected JavaScriptmodule script but the server responded with a MIME type of "text/htmi".Strict MIME type checking is enforcedfor module scripts per HTML spec.

现在想的解决办法就是更新后通知用户刷新,还有什么其他的方案吗?

3187 次点击
所在节点    程序员
33 条回复
shenyuzhi
123 天前
index.html 文件 每次更新的时候覆盖
js 和 css 文件,打包的时候生成 hash ,也就是生成这种文件名 my-module-1.4494a73d5ba8bad5.js
保留以前的 js 和 css 文件
Ghrhrrv146
123 天前
碰到过这个问题,我的解决方案是捕获全局路由错误,如果错误为”Failed to loadmodule script: Expected JavaScriptmodule...“,自动刷新后,跳转至用户目标地址。
molvqingtai
123 天前
使用 SSE 推送事件,强制刷新
2Nfree
123 天前
@ZZITE #20 了解了,感谢大佬
Ghrhrrv146
123 天前
@Ghrhrrv146 自动刷新后,跳转至用户目标地址 -> 自动刷新并跳转至用户目标地址
2Nfree
123 天前
@Ghrhrrv146 #25 但是我感觉这种方式不能错误保证一定是因为 JS 更新导致的吧,万一有其他的问题导致了相同的报错是不是就会反复刷新
2Nfree
123 天前
@2Nfree #26 现在我们的临时解决办法就是告诉用户更新了让他们自己刷新了,虽然感觉有点怪怪的,但是也还好
rubbishmod
123 天前
无感自动刷新应该也只能通过 js 轮训请求 version 对比吧?评论区说的通过协商缓存的方案,nginx 只能命中某个 index.**hash**.js 重定向到 404 吧,所以没办法做到浏览器层面的刷新
wu00
123 天前
你这个问题是 index.html 缓存了,容器/滚动更新不背这个锅
按道理来说你用户侧没关闭页面,他加载的是本地磁盘的 js 缓存,不会从服务器重新下载 js ,就算你设置了不缓存每次从服务器获取最新 js ,那为什么你的 html 不获取最新的呢,html 获取了最新的就不会去价值旧的 js 文件
gausszhou
122 天前
js css 加哈希,index.html 开协商缓存就可以了
julyclyde
122 天前
@2Nfree 先选了错误的方案,然后“架构这一块我们不去折腾了”
那你就忍着吧
pursuer
122 天前
现在前端都直接发布 es module 了吗?感觉 es module 还是灵活性比较差
leokun
119 天前
目前用的非常简单的方法:

vite 插件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1123087

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX