Files
order_site/apps/frontend/tests/chunk-load-error.test.ts
T
zhaoxing d8793db593 fix(worker): 修复寄卖页分片加载失败导致的白屏
- 新增全局/页面级错误边界,页面渲染异常不再整页白屏
- 监听 vite:preloadError,部署后旧分片加载失败自动刷新一次
- 修复长会话 setTimeout 2^31 溢出导致立即登出
- 寄卖页资料接口失败给出重试态,不再误报未开通
2026-11-13 16:19:17 +08:00

72 lines
2.2 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import {
CHUNK_RELOAD_GUARD_MS,
isChunkLoadError,
shouldAutoReloadChunkFailure,
} from '../src/utils/chunk-load-error.ts'
function createStorage(initial: Record<string, string> = {}) {
const values = new Map(Object.entries(initial))
return {
getItem(key: string) {
return values.get(key) ?? null
},
setItem(key: string, value: string) {
values.set(key, String(value))
},
}
}
test('识别浏览器动态 import 失败文案', () => {
assert.equal(
isChunkLoadError(
new TypeError(
'Failed to fetch dynamically imported module: https://worker.khhao.com/assets/WorkerConsignmentPage-abc.js',
),
),
true,
)
assert.equal(isChunkLoadError(new Error('Importing a module script failed.')), true)
assert.equal(isChunkLoadError(new Error('Load failed')), true)
assert.equal(
isChunkLoadError({ name: 'ChunkLoadError', message: 'Loading chunk 12 failed' }),
true,
)
})
test('不把普通业务错误当成分片失败', () => {
assert.equal(isChunkLoadError(new Error('接口请求失败')), false)
assert.equal(isChunkLoadError(null), false)
assert.equal(isChunkLoadError(undefined), false)
})
test('首次分片失败允许自动刷新,窗口内再次失败不再刷新', () => {
const storage = createStorage()
const now = 1_700_000_000_000
assert.equal(shouldAutoReloadChunkFailure(storage, now), true)
assert.equal(shouldAutoReloadChunkFailure(storage, now + 1_000), false)
assert.equal(shouldAutoReloadChunkFailure(storage, now + CHUNK_RELOAD_GUARD_MS - 1), false)
})
test('超过防抖窗口后允许再次自动刷新', () => {
const storage = createStorage()
const now = 1_700_000_000_000
assert.equal(shouldAutoReloadChunkFailure(storage, now), true)
assert.equal(shouldAutoReloadChunkFailure(storage, now + CHUNK_RELOAD_GUARD_MS), true)
})
test('存储不可用时不做自动刷新,避免无限循环', () => {
const storage = {
getItem() {
throw new Error('denied')
},
setItem() {
throw new Error('denied')
},
}
assert.equal(shouldAutoReloadChunkFailure(storage), false)
assert.equal(shouldAutoReloadChunkFailure(null), false)
})