Next.js 公共图像未在生产构建中显示

Posted

技术标签:

【中文标题】Next.js 公共图像未在生产构建中显示【英文标题】:Next.js public images not showing in production build 【发布时间】:2021-05-31 07:39:34 【问题描述】:

我有一个要部署到 Heroku 的 Next.js 应用程序。当我在本地开发时,我看到了图像,但是当我推送到 Heroku 并检查站点时,图像有 404。我有一个公用文件夹,其中我的文件夹中有图像(.png),以及我引用的代码像这样的图片

<Image
    src="/wb_blue_white.png"
    
    
    
    className=navStyles.logo
/>

本地和产品中,如果我查看图像源,它们是相同的src="/_next/image?url=%2Fwb_blue_white.png&amp;w=256&amp;q=75",但我在产品中得到 404。什么可能导致图像显示在 localhost 但在 Heroku prod build 中不显示?

package.json

"scripts": 
    "dev": "next dev",
    "build": "next build",
    "start": "next start -p $PORT"
,

文件结构

components
pages
public

【问题讨论】:

你是如何部署到heroku的?也许服务器阻止了该流量? @Hiro 通过 cli。我在该公用文件夹中也有一个正在工作的网站图标。只是 .png 图像不是 你用了什么buildpack?可能自动检测为节点应用程序?那么似乎 nextjs 使用内置(?)快速服务器来提供内容。在那种情况下,是否配置了快速静态服务?像这样:github.com/vercel/next.js/discussions/14121 @Hiro 我在想是这样的。我使用可能使用内置快速服务器的 create-next-app 创建了项目?我不确定。非常新的下一个尝试学习它,因为我继续。所以不确定我会在哪里添加引用以使用 path.join。我认为接下来会在您构建项目时生成服务器文件。 在下面添加了一些(有点)具体的说明。 【参考方案1】:

查看next custom server doc 及其example repo。

在这个用于配置服务器的快速代码中,app.render() 似乎正在为 nextjs page 设置路由,即/apages/a。我不确定每条路径是否都需要这样做,或者是否出于演示目的而这样做。试着摆弄一下。

无论如何,如果它类似于基本快递服务器,我怀疑,use() 快递实例上的方法将添加一个“中间件”,1. 接受请求,2. 将其传递给下一个中间件,或发送响应给客户。

使用server.use(express.static(path.join(__dirname, 'public')));,其中server 是本例中的 express 实例,幸运的是(实际上是约定)在示例 repo 中,您可以添加处理静态文件服务的中间件。

我忘记了配置 express 的确切方法,但我猜是:

就在express() 实例化之后,或者 就在listen()之前

应该可以解决问题。把server.use(express.static(path.join(__dirname, 'public')))放在那里。

【讨论】:

您为使用 firbase 功能和托管服务的人提供了哪些解决方案,这些天来一直在与这个问题作斗争 @vincentO 创建另一个帖子并在此处参考。 @vincentO 你找到解决办法了吗?刚碰到这个问题,不知道怎么解决。 将图片保存到另一个目录 另一个目录@skyridertk 是什么意思【参考方案2】:

在根文件夹中为图像创建一个目录,然后从那里相对导入。行得通。

【讨论】:

【参考方案3】:

我遇到了同样的问题。对我来说,问题根本不是组件。我在 Netlify 上托管我的网站,但我没有意识到默认情况下 Netlify 会构建 devDependencies。因此,用于开发/测试的节点包意外地被编译用于生产。

我将 NODE_ENV(在 Netlify 中)更改为 production 并重新组织了 dependenciesdevDependencies 之间的包...并且错误消失了。

我认为组件触发了这个问题,因为初始请求导致它们在服务器端生成/优化。所以即使构建成功。远程图像请求导致开发包在错误的上下文中运行。

我希望有一天这可以帮助其他人。

【讨论】:

我还是没听懂你说什么。对我来说,在 yarn build 图像消失后运行 yarn start 如果这仅在您运行build 时发生,但在您运行yarn dev 时不发生,那么它可能是同样的问题。我认为 build 只捆绑dependencies 下的包,而不是devDependencies。我不是 nextjs 专家,但作为临时快速测试,您可以尝试将所有 devDependencies 移动到依赖项中并测试它是否有效。 (这只是为了测试。不是一个很好的生产解决方案) 嗯,即使它有效,但为生产捆绑开发依赖项并不是一件好事,对吧? > 作为临时快速测试...(这仅用于测试。不是生产的好解决方案)【参考方案4】:

上面有severalarticles,但基本上Sharp是必须的,应该安装。 NextJS 文档中的措辞使它听起来是可选的,但使用默认加载器Sharp is required。

【讨论】:

以上是关于Next.js 公共图像未在生产构建中显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 next.js 中获取图像宽度/高度?

Next.Js 图像组件不会在 localhost 上加载图像

服务器端渲染不适用于生产构建 Next.js

Nextjs:无法从静态文件夹加载图像

React 组件道具未在 Next.js 页面中呈现

Next js 在生产环境中不使用 cookie