Next.js 13 App目录下服务端组件加载状态不显示问题排查
Next.js 13 App目录下Suspense+loading.tsx不生效问题排查
核心问题:错误使用了loading.tsx
Next.js 13 App目录里的loading.tsx是路由段专属的加载组件,它会自动绑定当前路由段的加载状态,不需要你手动用Suspense组件去包裹并指定它为fallback。你现在的写法完全搞错了它的用法,这就是加载状态不显示的根本原因。
正确的实现步骤
- 保留
[slug]/loading.tsx(骨架屏组件),不需要修改它。 - 修改
[slug]/page.tsx,去掉手动包裹的Suspense,直接正常使用Image组件:// [slug]/page.tsx import Image from 'next/image'; export default function Page({ params }: { params: { slug: string } }) { // 假设这里根据slug获取图片地址 const imageUrl = `/images/${params.slug}.jpg`; return ( <div> <Image src={imageUrl} alt="内容图片" width={800} height={600} // 如果是远程图片,确保next.config.js里配置了对应域名 /> </div> ); } - 检查Image组件的配置:
- 本地图片:确保路径正确,要么放在
public目录下,要么通过import导入。 - 远程图片:必须在
next.config.js的images.domains数组里添加对应域名,比如:// next.config.js module.exports = { images: { domains: ['example.com'], }, };
- 本地图片:确保路径正确,要么放在
补充说明
- 不需要在根
layout.tsx里包裹Suspense,除非你要做全局的应用级加载状态,这和单个路由段的加载无关。 - 当你切换到
/share/xxx路由时,只要该路由段的内容(包括图片、服务器组件的异步数据)还在加载,loading.tsx就会自动显示,直到内容加载完成后替换。
内容的提问来源于stack exchange,提问作者anshul
相关产品推荐
相关产品推荐

