Polaris CI / verify (push) Successful in 1m47s
将 Next.js 构建切换为 standalone,新增多阶段 Docker 镜像和非 root 运行。 CI 改为启动服务检查页面与静态资源,并移除静态导出校验。 BREAKING CHANGE: 不再生成 out/ 静态产物,部署需运行 Node 服务容器。
Next.js Windows 静态导出历史补丁
原因与范围
next@16.3.3 的静态导出器将 path.relative() 产生的文件系统路径直接用于 RSC segment 文件名编码。Windows 的反斜杠不会被编码器转换为点号,导致浏览器请求扁平文件名、实际文件却落在嵌套目录。
- 上游问题:https://github.com/vercel/next.js/issues/85374
- Windows 根因复现:https://github.com/vercel/next.js/issues/92339
- 2026-09-13 核对:
16.3.5的相应导出逻辑仍未包含路径标准化。
补丁只修改导出器的 CommonJS / ESM 两份入口,在文件名编码前用系统路径分隔符拆分并以 / 连接。读取源文件仍使用原始文件系统路径。Linux/macOS 的 / 路径保持不变,浏览器运行时代码不变。
安装与验证
补丁通过 pnpm-workspace.yaml 的精确版本 patchedDependencies 和锁文件登记,正常安装会自动应用,无需手动编辑 node_modules。
corepack pnpm install --frozen-lockfile
corepack pnpm build
当前项目使用 standalone 服务端输出,不再生成 out/ 或执行静态导出检查。补丁暂时保留以维持锁文件中的安装约定;服务端产物和 HTTP 路由由 Gitea CI 验证。
后续升级
补丁仅绑定 next@16.3.3,不会自动迁移到其他版本。升级 Next.js 时先评估能否移除这个不再服务当前部署方式的补丁;如果恢复静态导出,再单独验收 Windows 路径与浏览器导航。
决定移除时,同步清理 pnpm 的补丁登记和补丁文件,更新锁文件,并保留服务端 HTTP 回归检查。