独立的 Next.js 服务器对于静态内容返回 404,除非至少调用一次 next start

Ade*_*ial 1 node.js next.js pnpm

我正在尝试将以下项目部署到生产中:https://github.com/saleor/apps 有问题的子模块: https: //github.com/saleor/apps/tree/main/apps/slack

这是我正在采取的步骤。

  • cd /应用程序/slack
  • 即插即用安装
  • pmpm 构建(这将运行 graphql-codegen && 下一个构建)

我已经output: "standalone"在 next.config.js 中设置了

问题是当我尝试使用以下命令运行独立服务器时:

node .next/standalone/apps/slack/server.js
Run Code Online (Sandbox Code Playgroud)

我收到 404: chrome 检查器中的 404s

直到我这样做:

  • pnpm start(下次启动时运行)
  • 打开浏览器并转到localhost:3000
  • 杀死 pnpm 启动

然后 404 就消失了...即使在运行时node .next/standalone/apps/slack/server.js 在此输入图像描述

我问是因为这似乎与 Next.js 有关,而不是与应用程序本身有关?但我没有 Next.js 或 Node 开发经验,所以我不确定。

这对我来说是一个问题,因为我想制作一个 docker 镜像。我在将此工作流程转换为 Dockerfile 时遇到问题。

编辑:

我尝试使用https://github.com/vercel/next.js/tree/canary/examples/with-docker中的 Dockerfile 但是它们不包含start在构建过​​程中。

编辑2:

通过运行diff -qr working/ broken/我发现运行后没有任何差异pnpm start。这可能是 Chrome 缓存造成的吗?

编辑3:

这似乎是一个缓存问题,因为在运行 pnpm start 并从 chrome 访问页面后,使用独立 server.js 时,问题在 Firefox 中仍然存在,但是我不知道为什么在使用时加载页面,而next start不是在使用时加载页面node server.js

谢谢。

Ade*_*ial 5

在 pnpm monorepo 中,使用 Next.js 独立输出时,您必须手动复制静态文件夹和公共文件夹。

此外,还会输出一个最小的 server.js 文件,可用于代替下次启动。默认情况下,这个最小的服务器不会复制 public 或 .next/static 文件夹,因为理想情况下这些文件夹应该由 CDN 处理,尽管可以手动将这些文件夹复制到standalone/public 和standalone/.next/static 文件夹,然后server.js 文件将自动提供这些服务。

然而我将它们复制到了错误的目的地,导致了 404 错误。

复制到standalone/apps/slack/.next而不是standalone/.next,对公众来说也是一样。

https://nextjs.org/docs/app/api-reference/next-config-js/output#automatically-copying-traced-files