为何React RSC的两个示例中,一个用'use server'另一个不用?
为什么两个React示例对
'use server'的需求不同? 示例1的核心逻辑
示例1里的db.comments.get(note.id)是在服务器组件(Server Component)内部直接执行的:
- 服务器组件本身就只在服务器端运行,所有代码都不会被发送到客户端。调用数据库的逻辑从始至终都在服务器上完成,只是把未完成的Promise传递给客户端组件,让客户端通过
use()钩子等待结果而已。 - 整个过程没有“客户端触发服务器执行代码”的需求,所以根本不需要
'use server'标记——服务器组件的代码天生就在服务器跑,不需要额外声明。
示例2的核心逻辑
示例2里的createNoteAction是要在客户端触发执行的:
- 这个函数是作为按钮点击事件传递给客户端组件的,客户端本身不能直接操作数据库(既不安全也没有数据库连接)。
- 加上
'use server'标记后,React会把这个函数转换成一个“服务器引用”(你可以看客户端组件里打印的onClick值),客户端点击按钮时,会通过RPC调用触发服务器端的这个函数执行数据库操作。 - 如果不加这个标记,函数会被序列化到客户端执行,要么因为没有数据库连接报错,要么直接把敏感的数据库操作暴露给客户端,完全不符合安全要求。
本质区别总结
- 示例1:服务器主动执行数据读取,全程在服务器环境,无需跨环境触发,所以不用
'use server'。 - 示例2:客户端触发服务器执行操作,需要明确告诉React“这段逻辑必须在服务器跑”,所以必须加
'use server'。
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

