--- title: Avoid Duplicate Serialization in RSC Props impact: LOW impactDescription: reduces network payload by avoiding duplicate serialization tags: server, rsc, serialization, props, client-components --- ## 在 RSC Props 中避免重复序列化 **影响程度:LOW(通过避免重复序列化减少网络负载)** RSC→client 序列化按对象引用去重,而非按值去重。相同引用 = 序列化一次;新引用 = 再次序列化。将转换操作(`.toSorted()`、`.filter()`、`.map()`)放在客户端执行,而不是服务端。 **错误做法(数组重复):** ```tsx // RSC:发送 6 个字符串(2 个数组 × 3 个元素) ``` **正确做法(发送 3 个字符串):** ```tsx // RSC:只发送一次 // 客户端:在客户端进行转换 'use client' const sorted = useMemo(() => [...usernames].sort(), [usernames]) ``` **嵌套去重行为:** 去重是递归进行的。影响程度因数据类型而异: - `string[]`、`number[]`、`boolean[]`:**HIGH 影响** - 数组及所有基本类型值完全重复 - `object[]`:**LOW 影响** - 数组结构重复,但嵌套对象按引用去重 ```tsx // string[] - 全部重复 usernames={['a','b']} sorted={usernames.toSorted()} // 发送 4 个字符串 // object[] - 仅数组结构重复 users={[{id:1},{id:2}]} sorted={users.toSorted()} // 发送 2 个数组 + 2 个唯一对象(而非 4 个) ``` **破坏去重的操作(创建新引用):** - 数组:`.toSorted()`、`.filter()`、`.map()`、`.slice()`、`[...arr]` - 对象:`{...obj}`、`Object.assign()`、`structuredClone()`、`JSON.parse(JSON.stringify())` **更多示例:** ```tsx // ❌ 错误做法 u.active)} /> // ✅ 正确做法 // 在客户端进行过滤/解构 ``` **例外情况:** 当转换操作开销较大,或者客户端不需要原始数据时,可以传递派生数据。