全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-23 6 分钟 ✍️ juanwangdev

SSR 错误处理与降级

SSR 渲染可能失败,需实现降级机制保证页面可用。

SSR 错误类型

错误原因
渲染超时数据预取耗时过长
内存溢出大量并发渲染
API 错误数据预取失败
组件错误渲染过程异常

错误处理流程

JavaScript
SSR 请求 → 尝试渲染 → 失败? → 降级 CSR → 返回空壳页面
                      ↓ 成功
                    返回完整 HTML

基本降级实现

HTML
async function handleRequest(url) {
  try {
    // 尝试 SSR 渲染
    const html = await renderSSR(url)
    return html
  } catch (error) {
    console.error('SSR failed:', error)

    // 降级到 CSR
    return renderCSR(url)
  }
}

注意:降级 CSR 返回空壳 HTML,客户端动态渲染。

CSR 降级页面

JavaScript
<!DOCTYPE html>
<html>
<head>
  <title>Loading...</title>
</head>
<body>
  <div id="app"></div>
  <script type="module" src="/src/entry-client.js"></script>
</body>
</html>

超时降级

vue
async function renderWithTimeout(url, timeout = 3000) {
  const renderPromise = renderSSR(url)
  const timeoutPromise = new Promise((_, reject) =>
    setTimeout(() => reject(new Error('SSR timeout')), timeout)
  )

  try {
    return await Promise.race([renderPromise, timeoutPromise])
  } catch (error) {
    // 超时降级 CSR
    return renderCSR(url)
  }
}

错误边界处理

JavaScript
<script setup>
import { onErrorCaptured } from 'vue'

// 捕获渲染错误
onErrorCaptured((error) => {
  console.error('Render error:', error)
  // 显示错误页面
  return false  // 阻止错误传播
})
</script>

API 错误降级

JavaScript
async function fetchData() {
  try {
    return await fetchAPI()
  } catch (error) {
    // API 失败,返回默认数据
    return getDefaultData()
  }
}

降级策略对比

策略适用场景
完全降级渲染彻底失败
部分降级部分组件失败
数据降级API 数据失败
超时降级渲染耗时过长

监控与告警

text
// SSR 失败记录
function reportSSRFailure(error, url) {
  // 上报错误信息
  console.error('SSR failure:', { error, url, timestamp: Date.now() })
}

要点总结

  • SSR 失败时降级到 CSR
  • 超时使用 Promise.race 控制
  • API 错误返回默认数据
  • 错误边界捕获渲染异常

📝 发现内容有误?点击此处直接编辑

← 上一篇 SSR 数据预取策略
下一篇 → Module Federation 集成
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库