You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

next build报错pages/404不可用getInitialProps但实际未使用该属性如何解决

问题描述

我尝试多方搜索,没有找到遇到同类问题的用户。运行next build时收到报错,提示不能使用getInitialProps/getServerSideProps,但我的404.tsx文件中完全没有使用这两个属性。

错误信息

错误信息:
    Error: `pages/404` can not have getInitialProps/getServerSideProps
    at /Users/myuser/.nvm/versions/node/v15.5.0/lib/node_modules/next/dist/build/index.js:15:5606
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:93:5)
    at async /Users/myuser/.nvm/versions/node/v15.5.0/lib/node_modules/next/dist/build/tracer.js:3:470
    at async Promise.all (index 0)
    at async /Users/myuser/.nvm/versions/node/v15.5.0/lib/node_modules/next/dist/build/index.js:15:2910
    at async /Users/myuser/.nvm/versions/node/v15.5.0/lib/node_modules/next/dist/build/tracer.js:3:470
    at async /Users/myuser/.nvm/versions/node/v15.5.0/lib/node_modules/next/dist/build/index.js:15:2147
    at async /Users/myuser/.nvm/versions/node/v15.5.0/lib/node_modules/next/dist/build/tracer.js:3:470

404页面代码

import * as React from 'react';

import Head from 'next/head';
import Layout from '../components/Layout';

const Error = () => {
  return (
    <Layout>
      <Head>
        <title>TM</title>
      </Head>
      <h1>Error 404</h1>
      <h2>Page not found</h2>
    </Layout>
  );
};

export default Error;

引用的Layout组件代码

import * as React from 'react';

import Footer from './Footer';
import Head from 'next/head';
import Header from './Header';
import styles from '../styles/main.module.css';

type Props = {
  showFooter?: boolean;
  showHeader?: boolean;
  title?: string;
};

const Layout: React.FC<Props> = ({
  showFooter,
  showHeader,
  title,
  children,
}) => {
  showFooter = showFooter || true;
  showHeader = showHeader || true;
  title = title || 'title';
  return (
    <div>
      <Head>
        <title>{title}</title>
      </Head>
      {showHeader && <Header />}
      <div className={styles.content}>{children}</div>
      {showFooter && <Footer />}
    </div>
  );
};

// Layout.defaultProps = {
//   showFooter: true,
//   showHeader: true,
//   title: 'title',
// };

export default Layout;
原因说明

该报错是Next.js 12.1以前版本的已知构建bug:当页面引用的自定义组件声明了defaultProps属性时,Next.js的构建校验逻辑会误将组件的defaultProps判定为页面导出的getInitialProps,进而触发404页面不能使用服务端渲染属性的校验规则。

解决方案
  • 删除组件的defaultProps声明,直接在参数解构时赋值默认值,可省略内部的二次赋值逻辑,写法更简洁:
const Layout: React.FC<Props> = ({
  showFooter = true,
  showHeader = true,
  title = 'title',
  children,
}) => {
  return (
    <div>
      <Head>
        <title>{title}</title>
      </Head>
      {showHeader && <Header />}
      <div className={styles.content}>{children}</div>
      {showFooter && <Footer />}
    </div>
  );
};
  • 升级Next.js到12.1.0及以上版本,该版本已修复此误判问题,无需修改现有代码即可正常构建。
  • 若使用Next.js 13及以上版本,可将404页面迁移到App Router下的app/not-found.tsx,App Router下的404页面无此校验限制。

内容的提问来源于stack exchange,提问作者Patrick Rutherford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:27:03