Server/Client 边界

page 保持 Server Component 预渲染,交互(搜索/添加)下沉到 Client Component;初始数据以 props 跨越边界

什么能跨过这条边界

序列化按值走。下面的 Promise 是活的:刷新后会重新等一次

值能否交给 Client
string / number / boolean / null / undefined、可序列化的普通对象与数组Flight 原生支持。上面的用户列表就是这样传进去的
Date、Map、Set、BigInt、TypedArray / ArrayBuffer、RegExpFlight 原生支持。Date 能传,但跨时区序列化后语义要留心,团队约定传 ISO 字符串也常见
PromiseFlight 原生支持。Client 用 use() 解开,必须有 Suspense
普通函数、类实例、Symbol、WeakMap / WeakSet真的不能。要动作就改成 Server Action,或把交互留在客户端

服务端的 Promise 还没完成…

什么时候别把边界往上推

'use client' 写在哪一层,直接决定客户端 bundle 大小

  • 只有叶子需要交互时,不要把整个页面标成 "use client"——那会把本可静态化的内容全部送进客户端 bundle
  • 跨边界传参必须是可序列化数据;想传函数,改用 Server Actions 或把交互整体下移
  • Server Component 可以 import Client Component;反过来不行(Client 想嵌 Server,走 children 槽)