作者花时间构建了一套基于浏览器的硬件诊断工具,并总结出 Web 平台在硬件检测上的真实边界。核心结论:出于反指纹追踪的考虑,几乎所有硬件相关 API 都被刻意削弱,浏览器能给出的只是相对测量值,而非真实硬件规格。
刷新率:没有 screen.refreshRate 这类 API,唯一办法是用 requestAnimationFrame 回调计时,取帧间隔的中位数推算。注意必须用中位数而非平均值,一次掉帧就会毁掉平均值;且后台标签页会节流 rAF,测量前需检查 document.visibilityState。
屏幕尺寸:screen.width、window.innerWidth、devicePixelRatio、screen.availWidth 测量的是不同东西。通常想要的原生面板分辨率是 screen.width * devicePixelRatio,但这也是基于 CSS 像素推导的,缩放显示下可能与物理面板不一致。浏览器根本不暴露真实硬件分辨率。
键盘:event.key 依赖布局,event.code 是物理位置,硬件测试应使用后者。PrintScreen 常不触发 keydown,Meta 组合键被系统吞掉,Fn 在多数笔记本上不可见。N-key rollover 测试效果不错,跟踪当前按住的 Set 大小即可,廉价键盘在 3-4 键同按时丢输入会很明显。
指针事件:pointerdown/pointerup 统一了鼠标、触摸和笔,pointerId 可正确追踪多点触控。检测磨损开关的双击故障,只需测量同一按钮连续 pointerdown 的间隔,低于约 80ms 且无移动,基本可判定为硬件故障。注意 preventDefault() 会杀掉后续的兼容鼠标事件。
Gamepad:轴移动没有事件,只能在 rAF 循环里轮询 navigator.getGamepads()。控制器在用户按键前不会出现,数组里全是 null。摇杆漂移表现为静止时轴值不为 0,超过约 0.08 即为电位器磨损。
媒体设备:enumerateDevices() 在授权前能列出设备但标签全为空字符串,只有 getUserMedia() 成功后才有可读名称。麦克风电平用 AnalyserNode 的 getByteTimeDomainData 计算 RMS 比频域数据更稳定。
坏点检测:没有 API,唯一可行方案是用 Fullscreen API 填充纯色让肉眼观察。不是所有问题都需要程序化答案,全屏渲染 #ff0000 本身就是工具。
所有十个诊断 demo 均在客户端运行、不上传任何数据。作者认为,诚实的工具应测量行为而非声称读取规格,并欢迎对刷新率测量方案的改进建议。
#开发者 #工具 #JavaScript #硬件诊断 #浏览器API #WebAPI #性能测试
@DevToolboxHub