来自第 3 方的 nextjs 图像问题
issues with nextjs images from 3rd party
所以我 运行 分为 2 期。首先,我使用 Firebase 授权 GitHub 和 Google 登录,所以我在我的导航栏中将人物头像显示为个人资料图片。现在在我的代码中一切正常,直到我将 <img>
切换为 <Image>
- 然后我收到以下两个错误:
这是我使用头像的片段:
import Image from 'next/image'
import { useAuth } from '@/lib/auth';
const DashboardShell = ({ children }) => {
const { user, signout } = useAuth();
return (
<Link href="/account" passHref>
<a>
<Image
src={user?.photoUrl ?? ''}
width="96"
height="96"
alt="profile avatar"
/>
</a>
</Link>
)
}
现在,当我使用 img
而不是 Image
时,头像会显示并起作用。当我将它切换到 Image
时,我得到了错误,我 console.log 了 user?.photoUrl
,它显示为 undefined
,所以我保留了 console.log并切换回 img
,我注意到控制台日志在页面加载后立即显示未定义,然后立即记录 URL,因此其日志记录未定义和 url.
这几乎就像在检索头像 URL 之前尝试加载下一张图片。
所以我的问题是,有没有办法告诉 next/image 等待加载直到 user?.photoUrl
为 retrieved/populated?
还有,我的 next.config.js
文件中列出了图像域:
const path = require('path')
module.exports = {
trailingSlash: true,
sassOptions: {
includePaths: [path.join(__dirname, 'styles')]
},
images: {
domains: ['lh3.googleusercontent.com', 'avatars.githubusercontent.com'],
},
}
我在 "next": "12.1.0",
我在 Vercel 运行。
您可以显示占位符图像直到加载头像
<Image
src={user?.photoUrl || '/public/static/placeholderImg'}
width="96"
height="96"
alt="profile avatar"
/>
我认为您的图像主机名问题已通过 next.config.js
中的最新配置得到解决
解决第二个问题,即 next/image
上的 undefined
图片。你可以有一个单独的图像来源检查
import NextImage from 'next/image'
import { useAuth } from '@/lib/auth';
const Image = (props) => {
if(props.src) {
return <NextImage {...props}/>
}
//TODO: if the image source is not there, you can set a default source
//const defaultSrc = "something"
return <img {...props} src={defaultSrc}/>
}
const DashboardShell = ({ children }) => {
const { user, signout } = useAuth();
return (
<Link href="/account" passHref>
<a>
<Image
src={user?.photoUrl}
width="96"
height="96"
alt="profile avatar"
/>
</a>
</Link>
)
}
所以我 运行 分为 2 期。首先,我使用 Firebase 授权 GitHub 和 Google 登录,所以我在我的导航栏中将人物头像显示为个人资料图片。现在在我的代码中一切正常,直到我将 <img>
切换为 <Image>
- 然后我收到以下两个错误:
这是我使用头像的片段:
import Image from 'next/image'
import { useAuth } from '@/lib/auth';
const DashboardShell = ({ children }) => {
const { user, signout } = useAuth();
return (
<Link href="/account" passHref>
<a>
<Image
src={user?.photoUrl ?? ''}
width="96"
height="96"
alt="profile avatar"
/>
</a>
</Link>
)
}
现在,当我使用 img
而不是 Image
时,头像会显示并起作用。当我将它切换到 Image
时,我得到了错误,我 console.log 了 user?.photoUrl
,它显示为 undefined
,所以我保留了 console.log并切换回 img
,我注意到控制台日志在页面加载后立即显示未定义,然后立即记录 URL,因此其日志记录未定义和 url.
这几乎就像在检索头像 URL 之前尝试加载下一张图片。
所以我的问题是,有没有办法告诉 next/image 等待加载直到 user?.photoUrl
为 retrieved/populated?
还有,我的 next.config.js
文件中列出了图像域:
const path = require('path')
module.exports = {
trailingSlash: true,
sassOptions: {
includePaths: [path.join(__dirname, 'styles')]
},
images: {
domains: ['lh3.googleusercontent.com', 'avatars.githubusercontent.com'],
},
}
我在 "next": "12.1.0",
我在 Vercel 运行。
您可以显示占位符图像直到加载头像
<Image
src={user?.photoUrl || '/public/static/placeholderImg'}
width="96"
height="96"
alt="profile avatar"
/>
我认为您的图像主机名问题已通过 next.config.js
解决第二个问题,即 next/image
上的 undefined
图片。你可以有一个单独的图像来源检查
import NextImage from 'next/image'
import { useAuth } from '@/lib/auth';
const Image = (props) => {
if(props.src) {
return <NextImage {...props}/>
}
//TODO: if the image source is not there, you can set a default source
//const defaultSrc = "something"
return <img {...props} src={defaultSrc}/>
}
const DashboardShell = ({ children }) => {
const { user, signout } = useAuth();
return (
<Link href="/account" passHref>
<a>
<Image
src={user?.photoUrl}
width="96"
height="96"
alt="profile avatar"
/>
</a>
</Link>
)
}