Next.js中的 Client Components
前言
什么时候用 Client Components
这种组件, 既可以在服务端做一次预渲染, 又可以在客户端运行。
- 需要处理 event listener
- 需要调用
useState
,useReducer
,useEffect
- 调用客户端 API, 比如
window
- 使用 React Class Component 的时候
如何区分
- 如果该组件是在带有 ‘use client’ 指令的模块中定义的,或者该组件是在 ClientComponent 中导入和调用的,则该组件使用是一个 ClientComponent。
use client
不代表只在客户端运行
- javascript - ReferenceError: window is undefined even when “use client” is used in Next.js (v13.4.13) - Stack Overflow
- Client Component doesn’t work · vercel/next.js · Discussion #42319
the “use client” only means that it also runs on the client. You can use useEffect to access the window object without any errors.
组件还是会被 static rendered
, 那么就会走服务端做一次预渲染,走服务端渲染的时候,就无法确保获取 window
对象了。这也就是为什么很多组件, 需要适配支持 app route
模式了。
不支持 Client Components 中导入 Server Components
相反,每个 page 默认是 RSC 的,它是可以加载 Client Components 的。
什么时候渲染
一定会被做一次预渲染。
常见问题
Text content does not match server-rendered HTML
通过动态加载,避免组件 SSG
, 对 client 组件, 可以强制 Optimizing: Lazy Loading | Next.js
- suppressHydrationWarning 可以避免时间戳导致的报错