字节笔记本

2026年2月22日

解决 Next.js 预渲染错误:Error occurred prerendering page '/'

本文介绍如何解决 Next.js 项目中常见的 "Error occurred prerendering page '/'" 错误,帮助开发者快速定位和修复预渲染问题。

错误概述

在构建 Next.js 应用时,你可能会遇到以下错误信息:

Error occurred prerendering page "/". Read more: https://nextjs.org/docs/messages/prerender-error

这个错误表示 Next.js 在静态生成(SSG)页面时失败了。由于 Next.js 默认会尝试预渲染所有页面,任何在构建时执行的代码出现问题都会导致此错误。

常见原因

1. 使用了浏览器专属 API

在预渲染期间,代码在 Node.js 环境中运行,无法访问 windowdocument 等浏览器对象。

错误示例:

javascript
// pages/index.js
export default function Home() {
  // ❌ 这会报错,因为构建时没有 window 对象
  const width = window.innerWidth;
  
  return <div>Width: {width}</div>;
}

解决方案:

javascript
import { useEffect, useState } from 'react';

export default function Home() {
  const [width, setWidth] = useState(0);
  
  useEffect(() => {
    // ✅ 在客户端执行
    setWidth(window.innerWidth);
  }, []);
  
  return <div>Width: {width}</div>;
}

2. 数据获取失败

使用 getStaticPropsgetServerSideProps 时,API 请求失败会导致预渲染错误。

错误示例:

javascript
export async function getStaticProps() {
  // ❌ 如果 API 失败,构建会中断
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();
  
  return { props: { data } };
}

解决方案:

javascript
export async function getStaticProps() {
  try {
    const res = await fetch('https://api.example.com/data');
    
    if (!res.ok) {
      throw new Error(`HTTP error! status: ${res.status}`);
    }
    
    const data = await res.json();
    return { props: { data } };
  } catch (error) {
    console.error('Failed to fetch data:', error);
    
    // 返回空数据或默认值,让构建继续
    return { 
      props: { 
        data: [],
        error: 'Failed to load data'
      } 
    };
  }
}

3. 动态路由参数缺失

使用 getStaticPaths 时,如果返回的 paths 数组为空或格式不正确,会导致预渲染失败。

错误示例:

javascript
export async function getStaticPaths() {
  // ❌ 返回空数组会导致所有动态路由 404
  return {
    paths: [],
    fallback: false
  };
}

解决方案:

javascript
export async function getStaticPaths() {
  const posts = await fetchPosts();
  
  const paths = posts.map((post) => ({
    params: { id: post.id.toString() },
  }));
  
  return {
    paths,
    fallback: 'blocking' // 或 true,允许增量静态生成
  };
}

4. 环境变量缺失

构建时依赖的环境变量未设置,导致代码执行失败。

检查方法:

javascript
// 确保必需的环境变量已设置
const apiKey = process.env.API_KEY;

if (!apiKey) {
  throw new Error('API_KEY environment variable is required');
}

解决方案:

  • .env.local 或 CI/CD 环境中设置所有必需的环境变量
  • 使用默认值处理可选变量

调试技巧

1. 查看完整错误堆栈

运行构建命令时添加更多日志:

bash
next build 2>&1 | tee build.log

2. 使用 development 模式测试

bash
npm run dev

在开发模式下,错误信息通常更详细。

3. 逐步排查

  1. 注释掉页面中的部分代码
  2. 重新构建
  3. 定位具体出错的代码行

4. 禁用预渲染(临时方案)

如果某个页面确实无法在构建时渲染,可以禁用静态生成:

javascript
export async function getStaticProps() {
  return {
    props: {},
    // 启用 ISR,每 1 秒重新验证
    revalidate: 1
  };
}

或使用客户端数据获取:

javascript
import useSWR from 'swr';

export default function Page() {
  const { data, error } = useSWR('/api/data', fetcher);
  
  if (error) return <div>Failed to load</div>;
  if (!data) return <div>Loading...</div>;
  
  return <div>{data.title}</div>;
}

最佳实践

  1. 分离服务端和客户端代码:使用 useEffect 处理浏览器 API
  2. 添加错误边界:使用 React Error Boundary 捕获渲染错误
  3. 验证外部数据:始终检查 API 响应状态
  4. 使用 TypeScript:类型检查可以在构建前发现潜在问题
  5. 渐进式采用 SSG:对复杂页面先使用 SSR,再优化为 SSG

相关资源

分享: