import type { NextConfig } from "next"; // 后端地址:开发可兜底 localhost:3001;生产构建必须显式 BACKEND_URL(禁止静默烤进 localhost) const isProd = process.env.NODE_ENV === "production"; const API_TARGET = process.env.BACKEND_URL || process.env.NEXT_PUBLIC_API_URL || (isProd ? "" : "http://localhost:3001"); if (!API_TARGET) { throw new Error( "生产构建必须设置 BACKEND_URL(例如 Docker 内 http://api:3001),禁止回落 localhost" ); } const nextConfig: NextConfig = { // 官方 Docker 运行时:最小产物,不含完整 node_modules。next dev 忽略此项。 output: "standalone", images: { minimumCacheTTL: 14400, // 4 小时 remotePatterns: [ { protocol: "http", hostname: "localhost" }, ], }, experimental: { // rewrite/proxy 默认只缓冲 10MB;附件上限由 Go 站点设置决定,此处留足余量(含 multipart 开销) proxyClientMaxBodySize: "512mb", }, async rewrites() { return [ { source: "/api/:path*", destination: `${API_TARGET}/api/:path*`, }, // 用户上传文件(头像等,全部 WebP) { source: "/uploads/:path*", destination: `${API_TARGET}/uploads/:path*`, }, ]; }, async headers() { return [ { // 构建后抽取的 Noto Sans SC 字体声明(异步加载,见 scripts/extract-font-css.mjs)。 // 引用的 woff2 在 /_next/static/media/ 已 immutable;CSS 本身文件名固定、内容随 // 字体版本变,用 1 天中等 TTL 稳妥。 source: "/fonts/:path*", headers: [{ key: "Cache-Control", value: "public, max-age=86400" }], }, ]; }, }; export default nextConfig;