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

Next.js 13中next-swagger-doc预渲染/api-doc页面失败求助

问题描述

我用next-swagger-doc集成Swagger文档,本地能正常渲染使用,但在Docker容器或Vercel部署时构建失败,代码完全复刻自官方「Usage Case 1」。

渲染时出现如下警告:

- warn ./node_modules/swagger-jsdoc/src/utils.js
Critical dependency: the request of a dependency is an expression

Import trace for requested module:
./node_modules/swagger-jsdoc/src/utils.js
./node_modules/swagger-jsdoc/src/specification.js
./node_modules/swagger-jsdoc/src/lib.js
./node_modules/swagger-jsdoc/index.js
./node_modules/next-swagger-doc/dist/index.js
./swagger.ts
./app/api-doc/page.tsx

有两个疑问:

  1. 我们使用Node 16,选择npm还是Yarn会有影响吗?
  2. 如何解决部署时出现的TypeError?

完整错误日志:

41.42 TypeError: Class extends value undefined is not a constructor or null
41.42     at /app/.next/server/chunks/334.js:28855:816054
41.42     at /app/.next/server/chunks/334.js:28855:1386511
41.42     at /app/.next/server/chunks/334.js:28855:1386527
41.42     at webpackUniversalModuleDefinition (/app/.next/server/chunks/334.js:28855:70)
41.42     at Object.20404 (/app/.next/server/chunks/334.js:28855:76)
41.42     at __webpack_require__ (/app/.next/server/webpack-runtime.js:25:43)
41.42     at Object.93670 (/app/.next/server/chunks/334.js:34301:69)
41.42     at __webpack_require__ (/app/.next/server/webpack-runtime.js:25:43)
41.42     at Module.6054 (/app/.next/server/app/api-doc/page.js:336:74)
41.42     at __webpack_require__ (/app/.next/server/webpack-runtime.js:25:43)
41.42 
41.42 Error occurred prerendering page "/api-doc". Read more: https://nextjs.org/docs/messages/prerender-error
41.42 TypeError: Class extends value undefined is not a constructor or null
41.42     at /app/.next/server/chunks/334.js:28855:816054
41.42     at /app/.next/server/chunks/334.js:28855:1386511
41.42     at /app/.next/server/chunks/334.js:28855:1386527
41.42     at webpackUniversalModuleDefinition (/app/.next/server/chunks/334.js:28855:70)
41.42     at Object.20404 (/app/.next/server/chunks/334.js:28855:76)
41.42     at __webpack_require__ (/app/.next/server/webpack-runtime.js:25:43)
41.42     at Object.93670 (/app/.next/server/chunks/334.js:34301:69)
41.42     at __webpack_require__ (/app/.next/server/webpack-runtime.js:25:43)
41.42     at Module.6054 (/app/.next/server/app/api-doc/page.js:336:74)
41.42     at __webpack_require__ (/app/.next/server/webpack-runtime.js:25:43)
41.42 - info Generating static pages (24/33)
解答

1. Node 16下npm/Yarn的影响

包管理器本身(npm或Yarn)不会直接导致构建失败,但有两点需要注意:

  • 依赖版本一致性:如果本地用Yarn、部署用npm(或反之),锁文件(yarn.lock/package-lock.json)不匹配会导致安装的依赖版本差异,可能触发兼容性问题。建议统一使用同一种包管理器,并提交锁文件到代码仓库,确保部署环境和本地依赖完全一致。
  • Node 16兼容性:Node 16已进入维护期,next-swagger-doc的依赖(如swagger-jsdoc)新版本可能不再支持Node 16,这才是核心风险,和包管理器无关。

2. 解决TypeError的方案

这个错误是预渲染时类继承的父类未定义,结合swagger-jsdoc的动态依赖警告,本质是swagger-jsdoc在Next.js SSR/静态生成环境下的兼容性问题,可按以下步骤解决:

方案1:降级swagger-jsdoc版本

新版本的swagger-jsdoc(如v7+)可能依赖更高Node版本,或使用了Next.js打包不兼容的动态导入逻辑。降级到v6.x版本(比如6.2.8),执行命令:

# npm
npm install swagger-jsdoc@6.2.8 --save

# Yarn
yarn add swagger-jsdoc@6.2.8

方案2:禁用Swagger页面的SSR

Swagger UI仅需客户端渲染,不需要预渲染。修改app/api-doc/page.tsx,用Next.js的dynamic导入禁用SSR:

import dynamic from 'next/dynamic';
import { getSwaggerDoc } from '../../swagger';

// 动态导入swagger-ui-react,禁用SSR
const SwaggerUI = dynamic(() => import('swagger-ui-react'), { ssr: false });

export default function APIDocPage() {
  const swaggerDoc = getSwaggerDoc();
  return <SwaggerUI spec={swaggerDoc} />;
}

方案3:升级Node版本(推荐)

Node 16已停止维护,升级到Node 18或20(LTS版本),可解决大部分依赖兼容性问题,同时获得更好的性能和安全性。

方案4:确保部署环境依赖一致

提交package-lock.json或yarn.lock到代码仓库,部署时不要忽略锁文件,确保安装的依赖版本和本地完全一致,避免因依赖版本差异导致的构建失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:05:54