系统状态页需用 Promise.allSettled 并行请求各服务健康端点,HEAD 方法+3秒超时,CSS Grid 响应式布局,防抖+可见性判断轮询,失败指数退避,卡片隔离渲染。
系统状态页不是普通展示页,它得扛住高并发轮询、快速识别异常、支持多服务维度聚合,同时不能因某个服务挂掉就整页白屏。用传统 div 堆叠 + 手动刷新根本撑不住。
fetch + Promise.allSettled 获取多服务状态,避免单点失败拖垮整页状态页最常踩的坑是:一个接口超时或 500,整个页面卡死或空白。必须放弃 Promise.all,改用 Promise.allSettled —— 它不因某一项 reject 就中断,而是返回每个请求的 { status: 'fulfilled' | 'rejected', value | reason } 结构。
/api/health/db、/api/health/cache、/api/health/api-gateway
fetch(url, { method: 'HEAD', cache: 'no-cache' }),HEAD 比 GET 更轻量,且多数服务健康检查已支持signal 超时(建议 3s),避免某服务长期无响应阻塞后续逻辑status === 'fulfilled' 和响应头中的 X-Health-Status: ok | degraded | down 决定颜色和文案Flexbox 是一维的,当服务数量动态变化(比如从 6 个扩到 12 个)、又需在小屏上自动换行时,容易出现高度错位或列宽崩塌。display: grid 配合 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)) 才能真正响应式对齐。
min-height: 120px 保底,防止内容过少时高度不一致grid-auto-flow: dense,否则状态异常的服务卡片可能被“插队”到顶部,干扰视觉焦点gap: 16px 控制间距,别用 margin —— margin 在网格中不可靠,尤其涉及跨列时::before + 字体图标,比 <img alt="HTML怎么做系统状态页_HTML系统服务状态页面布局【纯干货】" > 减少 HTTP 请求默认每 10 秒轮询一次,但用户切到其他 Tab 时还在发请求,既浪费资源又可能触发后端限流。得结合 document.hidden 和 setTimeout 防抖。
立即学习“前端免费学习笔记(深入)”;
if (document.hidden) return
visibilitychange 事件监听),而不是等下一个周期<small>Updated: <span id="last-updated"></span></small>,并用 Date.now() 更新,不依赖服务器时间真正难的不是画出几个绿红卡片,而是让这张页在凌晨三点数据库主从延迟 20 秒、CDN 缓存失效、监控告警轰炸的同时,依然能准确告诉你哪一块真坏了、哪一块只是网络抖动 —— 这要求每个 fetch 都带 timeout,每张卡片都隔离渲染,每次更新都可追溯时间戳。