阻止白屏死亡:精通 Next.js 错误边界 🛡️

发布: (2026年5月11日 GMT+8 13:13)
4 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for Stop the White Screen of Death: Master Next.js Error Boundaries 🛡️

React 树的脆弱性

React 应用最危险的行为之一是它对未处理的 JavaScript 异常的处理方式。默认情况下,如果单个组件抛出错误(例如,对未定义的 API 响应调用 .map()),React 会立即卸载整个组件树。对于查看复杂仪表盘的 B2B SaaS 用户来说,天气小部件出错会导致整个屏幕完全空白——这就是令人恐惧的 白屏死亡(White Screen of Death)

在 Smart Tech Devs,我们为前端架构设计了弹性。非关键组件的故障绝不应导致核心应用崩溃。我们通过在 Next.js App Router 中利用 错误边界(Error Boundaries) 来实现这一点。

使用 error.tsx 构建隔离

Next.js 13+ 引入了基于文件系统的路由约定,使错误边界的实现变得极其优雅。只需在特定路由段创建一个 error.tsx 文件,就会自动为该段及其子组件包裹一个 React 错误边界。

步骤 1:创建细粒度错误边界

如果发票小部件出错,我们只想让发票部分显示错误状态。侧边栏、页眉和其他小部件必须保持正常。

// app/dashboard/invoices/error.tsx
"use client"; // Error components MUST be Client Components

import { useEffect } from "react";

export default function InvoicesError({
  error,
  reset,
}: {
  error: Error & { digest?: string };
  reset: () => void;
}) {
  useEffect(() => {
    // Log the error to an external service like Sentry
    console.error("Invoice Widget Failed:", error);
  }, [error]);

  return (
    <div className="p-4">
      <h2 className="text-xl font-bold">Failed to load invoices.</h2>
      <p>We encountered a network issue.</p>

      {/* The 'reset' function attempts to re‑render the failed segment */}
      <button
        onClick={() => reset()}
        className="bg-red-600 text-white px-4 py-2 rounded shadow"
      >
        Try Again
      </button>
    </div>
  );
}

回退层级

App Router 的美妙之处在于它的嵌套层级。如果 app/dashboard/invoices/page.tsx 中出现错误,Next.js 会寻找最近的 error.tsx 文件。如果在 invoices 文件夹中找到,它只会用错误 UI 替换该页面组件

对于全局、灾难性的故障,你应始终在根 app/ 目录下放置一个 global-error.tsx 文件。这相当于最后一道防线,确保即使根布局崩溃,用户也会看到带有品牌标识的专业 “Something went wrong” 页面,而不是原始的浏览器错误。

结论

在企业软件中,故障是不可避免的,但灾难性的 UI 崩溃是可以避免的。通过在复杂或风险较高的数据获取组件周围有策略地放置 Next.js 错误边界,你可以将错误隔离,保护用户体验,并构建一个在压力下能够优雅降级的 SaaS 平台。

0 浏览
Back to Blog

相关文章

阅读更多 »