使用场景介绍
哈喽,大家好,我是Fine。页面白屏是前端开发中最严重的问题之一,直接影响用户体验和业务转化。作为前端工程师,快速定位和解决白屏问题是核心技能。一次白屏可能造成用户流失和业务损失,因此需要建立系统的排查方法。白屏原因与排查方法
1. JavaScript执行错误(最常见)
典型场景 :SPA应用中未捕获的异常导致整个应用崩溃。// 常见错误类型
// 1. 空值引用
const userInfo = null;
console.log(userInfo.name); // TypeError: Cannot read property 'name' of null
// 2. 异步错误未捕获
asyncfunction loadData() {
const response = await fetch('/api/user');
const data = await response.json();
// 如果接口返回格式异常,下面代码会报错
document.getElementById('username').textContent = data.user.name;
}
排查方法 : 2. 资源加载失败
典型场景 :CDN故障、网络不稳定导致关键CSS/JS文件加载失败。 排查方法 : 预防方案 :// 资源加载容错
function loadCriticalResource(primaryUrl, fallbackUrl) {
returnnewPromise((resolve, reject) => {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = primaryUrl;
link.onload = resolve;
link.onerror = () => {
// 主资源失败,加载备用资源
link.href = fallbackUrl;
link.onerror = reject;
};
document.head.appendChild(link);
});
}
3. 接口异常
典型场景 :关键数据接口超时或返回异常,页面无法获取必要数据。 排查方法 : 预防方案 :// 统一接口错误处理
asyncfunction apiRequest(url, options = {}) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 10000);
try {
const response = await fetch(url, {
...options,
signal: controller.signal
});
clearTimeout(timeoutId);
if (!response.ok) {
thrownewError(`HTTP ${response.status}: ${response.statusText}`);
}
returnawait response.json();
} catch (error) {
if (error.name === 'AbortError') {
thrownewError('请求超时,请稍后重试');
}
throw error;
}
}
4. CSS样式问题
典型场景 :样式异常导致内容不可见,造成视觉白屏。/* 可能导致白屏的CSS */
.content {
color: white;
background: white; /* 白色文字配白色背景 */
}
.container {
position: absolute;
left: -9999px; /* 内容移出可视区域 */
}
排查方法 : 5. 移动端特殊问题
排查工具 :// 移动端vConsole集成
import VConsole from 'vconsole';
if (process.env.NODE_ENV === 'development' || window.location.search.includes('debug=1')) {
new VConsole();
}
预防与监控
1. 错误边界处理
// React错误边界
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// 上报错误
console.error('页面错误:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return<p className="error-fallback">页面出现错误,请刷新重试p>;
}
returnthis.props.children;
}
}
2. 错误监控系统
// Sentry错误监控
import * as Sentry from"@sentry/browser";
Sentry.init({
dsn: "YOUR_DSN_HERE",
environment: process.env.NODE_ENV,
});
// 全局错误捕获
window.addEventListener('error', (event) => {
Sentry.captureException(event.error);
});
window.addEventListener('unhandledrejection', (event) => {
Sentry.captureException(event.reason);
});
3. 兼容性检测
// 关键特性检测
function checkCompatibility() {
const requiredFeatures = ;
const unsupported = requiredFeatures.filter(check => !check());
if (unsupported.length > 0) {
document.body.innerHTML = `
浏览器版本过低
请升级浏览器以获得最佳体验
`;
returnfalse;
}
returntrue;
}