Vigia

将 next 从 14.x 升级到 15.x

根据 TypeScript 类型自动比较 next 14.2.35 与 15.5.27 的公开 API。签名变化表示可能存在不兼容变更,并非确定结论。

概要

已删除的导入路径0
已删除的导出4
已修改的签名10
已删除的类或接口成员6
已修改的类或接口成员10
新增弃用5
要求变化(engines、peer 依赖)5
新增导出25

已删除的导出

importexportkind之前
next/constantsGOOGLE_FONT_PROVIDERvariable"https://fonts.googleapis.com/"
next/constantsDEV_MIDDLEWARE_MANIFESTvariable"_devMiddlewareManifest.json"
next/constantsOPTIMIZED_FONT_PROVIDERSvariable{ url: string; preconnect: string; }[]
next/constantsAUTOMATIC_FONT_OPTIMIZATION_MANIFESTvariable"font-manifest.json"

已修改的签名

export之前之后
next · default(options: NextServerOptions): NextServer(options: Omit<Options | Options, "conf"> & Partial<Pick<Options | Options, "conf">> & { turbo?: boolean | undefined; turbopack?: boolean | undefined; }): NextWrapperServer
next · PageConfig{ amp?: boolean | "hybrid" | undefined; api?: { responseLimit?: ResponseLimit | undefined; bodyParser?: false | { sizeLimit?: SizeLimit | undefined; } | undefined; externalResolver?: true | undefined; } | undefined; env?: string[] | undefined; maxDuration?: number | undefined; runtime?: ServerRuntime; unstable_runtimeJS?: false | undefined; unstable_JsPreload?: false | undefined; unstable_includeFiles?: string[] | undefined; unstable_excludeFiles?: string[] | undefined; }{ amp?: boolean | "hybrid" | undefined; api?: { responseLimit?: ResponseLimit | undefined; bodyParser?: false | { sizeLimit?: SizeLimit | undefined; } | undefined; externalResolver?: true | undefined; } | undefined; env?: string[] | undefined; maxDuration?: number | undefined; runtime?: ServerRuntime; unstable_runtimeJS?: false | undefined; unstable_JsPreload?: false | undefined; }
next · GetStaticPathsResult{ paths: (string | { params: Params; locale?: string | undefined; })[]; fallback: boolean | "blocking"; }{ paths: (string | { params: Params; locale?: string | undefined; })[]; fallback: GetStaticPathsFallback; }
next/link · LinkProps{ href: any; as?: any; replace?: boolean | undefined; scroll?: boolean | undefined; shallow?: boolean | undefined; passHref?: boolean | undefined; prefetch?: boolean | null | undefined; locale?: string | false | undefined; legacyBehavior?: boolean | undefined; onMouseEnter?: any; onTouchStart?: any; onClick?: any; }interface
next/error · ErrorProps{ statusCode: number; title?: string | undefined; withDarkMode?: boolean | undefined; }{ statusCode: number; hostname?: string | undefined; title?: string | undefined; withDarkMode?: boolean | undefined; }
next/dynamic · DynamicOptionsLoadableGeneratedOptions & { loading?: ((loadingProps: DynamicOptionsLoadingProps) => any) | undefined; loader?: LoaderMap | Loader<P> | undefined; loadableGenerated?: LoadableGeneratedOptions | undefined; ssr?: boolean | undefined; suspense?: boolean | undefined; }LoadableGeneratedOptions & { loading?: ((loadingProps: DynamicOptionsLoadingProps) => React.ReactNode) | undefined; loader?: LoaderMap | Loader<P> | undefined; loadableGenerated?: LoadableGeneratedOptions | undefined; ssr?: boolean | undefined; }
next/dynamic · LoadableOptionsLoadableGeneratedOptions & { loading?: ((loadingProps: DynamicOptionsLoadingProps) => any) | undefined; loader?: LoaderMap | Loader<P> | undefined; loadableGenerated?: LoadableGeneratedOptions | undefined; ssr?: boolean | undefined; suspense?: boolean | undefined; }LoadableGeneratedOptions & { loading?: ((loadingProps: DynamicOptionsLoadingProps) => React.ReactNode) | undefined; loader?: LoaderMap | Loader<P> | undefined; loadableGenerated?: LoadableGeneratedOptions | undefined; ssr?: boolean | undefined; }
next/headers · cookies(): ReadonlyRequestCookies(): Promise<ReadonlyRequestCookies>
next/headers · headers(): ReadonlyHeaders(): Promise<ReadonlyHeaders>
next/headers · draftMode(): DraftMode(): Promise<DraftMode>

已删除的类或接口成员

memberimport之前
NextConfig.swcMinifynextboolean | undefined
NextConfig.analyticsIdnextstring | undefined
NextConfig.optimizeFontsnextboolean | undefined
NextConfig.outputFileTracingnextboolean | undefined
Router._getFlightDatanext/router(dataHref: string): Promise<{ data: string; }>
Head.makeStylesheetInertnext/document(node: ReactNode[]): ReactNode[]

已修改的类或接口成员

member之前之后
NextConfig.logging{ fetches?: { fullUrl?: boolean | undefined; } | undefined; } | undefinedfalse | LoggingConfig | undefined
NextConfig.rewrites(() => Promise<Rewrite[] | { beforeFiles: Rewrite[]; afterFiles: Rewrite[]; fallback: Rewrite[]; }>) | undefined(() => Promise<Rewrite[] | { beforeFiles?: Rewrite[] | undefined; afterFiles?: Rewrite[] | undefined; fallback?: Rewrite[] | undefined; }>) | undefined
NextConfig.sassOptions{ [key: string]: any; } | undefined{ [key: string]: any; implementation?: string | undefined; } | undefined
NextConfig.devIndicators{ buildActivity?: boolean | undefined; buildActivityPosition?: "bottom-right" | "bottom-left" | "top-right" | "top-left" | undefined; } | undefinedfalse | { appIsrStatus?: boolean | undefined; buildActivity?: boolean | undefined; buildActivityPosition?: "top-left" | "top-right" | "bottom-left" | "bottom-right" | undefined; position?: "top-left" | "top-right" | "bottom-left" | "bottom-right" | undefined; } | undefined
NextApiRequest.previewDataanyPreviewData
NextPageContext.localesstring[] | undefinedreadonly string[] | undefined
default.static getInitialProps({ res, err, }: NextPageContext): ErrorProps | Promise<ErrorProps>({ req, res, err, }: NextPageContext): ErrorProps | Promise<ErrorProps>
default.static origGetInitialProps({ res, err, }: NextPageContext): ErrorProps | Promise<ErrorProps>({ req, res, err, }: NextPageContext): ErrorProps | Promise<ErrorProps>
Router.localesstring[] | undefinedreadonly string[] | undefined
Router.domainLocalesDomainLocale[] | undefinedreadonly DomainLocale[] | undefined

新增弃用

export@deprecated
next · NextConfig.ampbuilt-in amp support will be removed in Next 16
next · NextConfig.publicRuntimeConfigRuntime config is deprecated and will be removed in Next.js 16.
next · NextConfig.serverRuntimeConfigRuntime config is deprecated and will be removed in Next.js 16.
next/config · defaultRuntime config is deprecated and will be removed in Next.js 16.
next/config · setConfigRuntime config is deprecated and will be removed in Next.js 16.

要求变化(engines、peer 依赖)

之前之后
engines.node>=18.17.0^18.18.0 || ^19.8.0 || >= 20.0.0
peerDependencies.react^18.2.0^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
peerDependencies.react-dom^18.2.0^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
peerDependencies.@playwright/test^1.41.2^1.51.1
peerDependencies.babel-plugin-react-compiler—*
新增导出 (25)
importexportkind
nextNextAdapterinterface
nextInstrumentationnamespace
next/linkuseLinkStatusvariable
next/cacheunstable_cacheTagvariable
next/cacheunstable_cacheLifefunction
next/cacheunstable_expireTagvariable
next/cacheunstable_expirePathvariable
next/serveraftervariable
next/serverconnectionvariable
next/serverunstable_rootParamsvariable
next/serverUnsafeUnwrappedParamsvariable
next/serverUnsafeUnwrappedSearchParamsvariable
next/headersUnsafeUnwrappedCookiestype
next/headersUnsafeUnwrappedHeaderstype
next/headersUnsafeUnwrappedDraftModetype
next/constantsWEBPACK_STATSvariable
next/constantsAdapterOutputTypeenum
next/constantsDYNAMIC_CSS_MANIFESTvariable
next/constantsDEV_CLIENT_MIDDLEWARE_MANIFESTvariable
next/constantsTURBOPACK_CLIENT_BUILD_MANIFESTvariable
next/constantsTURBOPACK_CLIENT_MIDDLEWARE_MANIFESTvariable
next/navigationforbiddenfunction
next/navigationunauthorizedfunction
next/navigationunstable_rethrowvariable
next/navigationunstable_isUnrecognizedActionErrorfunction

常见问题

将 next 从 14 升级到 15 有哪些不兼容变更?

在 next 14.2.35 与 15.5.27 之间,Vigia 发现 4 个已删除的导出、10 个已修改的签名,以及 16 个已删除或修改的类或接口成员。

next 15 中弃用了哪些内容?

next 15.5.27 中有 5 个导出或成员新被标记为弃用。

供智能体使用

GET https://vigia.coredls.cloud/v1/packages/npm/next/upgrade?from=14.2.35&to=15.5.27