/** * Next.js 配置(v2.1 M8 + v0.2 Tailwind v4 + Next 16 Turbopack + P1-4 next-intl) * * 角色:插件化仪表盘宿主(单 Next.js App Router · 单 Docker) * - output:standalone(单容器部署) * - transpilePackages: @edu/* workspace 包 * - 反向代理:/api/v1/* → api-gateway :8080(JWT 校验 + 注入 x-user-id/x-user-role) * - GraphQL 查询走 apollo-router :3000(M8 验收点,由 Apollo Client 直连) * - next-intl:无 i18n 路由模式(locale 由 cookie 决定,ARCHITECTURE.md §3.4 V3-A6) * * Next 16 默认 Turbopack: * - turbopack.resolveExtensions 处理 ESM 包 .js 后缀导入源码 TS 文件的映射 * - webpack 配置保留作为 fallback(--webpack flag 时生效) * * 关联:portal-shell ARCHITECTURE.md §3.4 V3-A6、spec §2、project_rules §3.2 */ import createNextIntlPlugin from "next-intl/plugin"; const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts"); /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, output: "standalone", transpilePackages: [ "@edu/ui-components", "@edu/ui-tokens", "@edu/hooks", "@edu/contracts", "@edu/shared-ts", ], experimental: { serverActions: { bodySizeLimit: "2mb" }, }, // Turbopack 配置(Next 16 默认):处理 ESM 包 .js 后缀导入源码 .ts/.tsx 文件 turbopack: { resolveExtensions: [ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".json", ], }, // Webpack 配置(fallback,使用 --webpack flag 时生效) webpack(config) { config.resolve = config.resolve || {}; config.resolve.extensionAlias = { ...config.resolve.extensionAlias, ".js": [".ts", ".tsx", ".js"], }; return config; }, async rewrites() { const gateway = process.env.API_GATEWAY_URL || "http://localhost:8080"; return [ { source: "/api/v1/:path*", destination: `${gateway}/api/v1/:path*`, }, { source: "/api/auth/:path*", destination: `${gateway}/api/v1/iam/:path*`, }, ]; }, }; export default withNextIntl(nextConfig);