Files
jiang13-forum/frontend/src/utils/softRefresh.ts
freefire 37d14a22d5 fix: 发版后软刷新检测入口壳并在 chunk 404 时硬刷新
避免 Logo/下拉刷新仍跑旧 index.js,以及站内消息预取失败弹出英文 toast。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 07:53:39 +08:00

39 lines
1.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { isChunkLoadError, reloadForStaleChunk, reloadIfShellStale } from './chunkLoad';
import { prefetchLayoutShell, prefetchRoute } from './prefetchRoute';
import { doneTransition, startTransition } from './spaTransition';
/** 软刷新齐套后的单一提交:各组件同一拍从 cache/快照同步 UI,禁止分批闪烁 */
export const PAGE_SOFT_REFRESH_COMMIT_EVENT = 'page-soft-refresh-commit';
export type SoftRefreshOpts = {
/** 是否显示顶栏进度条(Logo 刷新开;下拉关) */
progress?: boolean;
};
/**
* 软刷新当前页:先检测入口壳是否过期,再预热齐套后派发一次 commit。
* `progress: true` 时走顶栏进度条。
*/
export async function softRefreshCurrentPage(to?: string, opts?: SoftRefreshOpts): Promise<void> {
const path = to ?? `${window.location.pathname}${window.location.search}`;
const id = opts?.progress ? startTransition() : undefined;
try {
// 发版后旧壳仍在内存:先对比入口 script,过期则硬刷新
if (await reloadIfShellStale()) {
return;
}
await Promise.all([
prefetchRoute(path, { force: true }),
prefetchLayoutShell({ force: true }),
]);
} catch (e: unknown) {
if (isChunkLoadError(e) && reloadForStaleChunk()) {
return;
}
// 其它错误仍派发 commit,让界面有机会用已有缓存自愈
} finally {
if (id != null) doneTransition(id);
}
window.dispatchEvent(new Event(PAGE_SOFT_REFRESH_COMMIT_EVENT));
}