关于一个按需引入的疑问

2022-10-20 19:47:40 +08:00
caisanli  caisanli

RT

现在前端这边很多采用按需引用模块

但是这样其它模块的资源就没被加载到

如果这时发布了新版本

用户又没刷新页面

并点击了其它模块

这时可能就遇到其它模块的资源文件 404

从而加载失败


目前公司微前端的子系统是 vite 项目

最近和测试在扯这个问题

也做了些优化

监听如果是要加载 js 文件却加载了 html

就提示用户刷新页面

1946 次点击
所在节点   JavaScript  JavaScript
20 条回复
chenluo0429
chenluo0429
2022-10-20 20:26:50 +08:00
线上环境有 CDN ,没有预热就再次更新版本的概率不高,真的命中也没办法,为这种 edge case 做优化总感觉怪怪的
chenluo0429
chenluo0429
2022-10-20 20:27:37 +08:00
真的有需要我们也会向客户端推送事件,触发客户端自刷新的
icySoda
icySoda
2022-10-20 20:35:01 +08:00
为什么会 404 ,难道不是加载到上一个版本的 js 文件吗?
caisanli
caisanli
2022-10-20 20:39:48 +08:00
@chenluo0429 自刷新有点突兀,想着有提示会好些。主要是测试阶段 更新很频繁。 突然想到 应该存一份旧的包在那里...好像也解决不了根本问题
caisanli
caisanli
2022-10-20 20:40:57 +08:00
@icySoda 上一个版本的 js 已经被新的替换了 浏览器也没有缓存 所以会 404
rabbbit
rabbbit
2022-10-20 20:43:31 +08:00
加配置让生成的 js 文件名带 hash
然后旧的 js 文件不要删
caisanli
caisanli
2022-10-20 20:46:45 +08:00
@rabbbit 默认都会加 hash 。旧的包不删倒是能解决,只是发版多了后就会有占空间(虽然不多)。
rabbbit
rabbbit
2022-10-20 20:51:12 +08:00
留着没啥问题,实在讨厌可以隔几年再删。
很多后端也不会清理冗余文件,这些东西才更占地方。
caisanli
caisanli
2022-10-20 20:54:51 +08:00
@rabbbit 哈哈哈可以和运维商量一下
icySoda
icySoda
2022-10-20 21:06:28 +08:00
@caisanli 为啥要删,就这点文件体积,积累到公司倒闭都没多少空间。
aaronlam
aaronlam
2022-10-20 21:07:28 +08:00
一般会采取增量发布的方式的啊,肯定不会直接把上一版本的直接干掉把。而且资源 hash 是文件名的一部分
aaronlam
aaronlam
2022-10-20 21:08:55 +08:00
@caisanli

相比于线上用户用着用着报错,这点占用真的不算什么吧,而且可以采取半年一清的方式来清楚旧的资源。
caisanli
caisanli
2022-10-20 21:21:54 +08:00
@aaronlam
@icySoda
焕然大悟!🤣🤣🤣我们现在测试和生产部署都是干掉之前的包,明天和运维商量下。
aaronlam
aaronlam
2022-10-20 21:24:53 +08:00
jarven123
jarven123
2022-10-21 10:28:43 +08:00
我们为了让用户尽快使用新版,会在打包的时候生成一个 json 记录当前的版本信息,并且在 html 打上标记,然后每次切换路由的时候拿当前 html 标记的版本和生成的 json 中的版本信息对比,如果需要更新就直接 reload 页面
caisanli
2022-10-21 11:33:51 +08:00
@jarven123 这样会写兼容代码 而且不一定是路由 一个弹窗组件也会引起
jarven123
2022-10-21 14:40:32 +08:00
@caisanli 那就上 CDN 缓存就好了
daysv
2022-10-21 15:51:13 +08:00
这有啥的, 每次打包资源名称都是根据内容的 hash 值, 发版本先发资源, 后发 index.html.
发版不删除, 无脑覆盖.
over
daysv
2022-10-21 15:52:22 +08:00
```js
router.onError((error) => {
const isChunkLoadFailed = /Loading (\w| )*?chunk (\d)+ failed/.test(error.message)
if (isChunkLoadFailed) {
window.location.reload()
}
})
```
我这还写过一个粗暴的代码在懒加载路由里, 虽然现在没啥用.
bebop
2022-10-21 18:18:39 +08:00
加版本号

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

https://www.v2ex.com/t/888518

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

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

© 2021 V2EX