NextJS 13 服务器组件与复杂 UI 中的客户端组件

NextJS 13 Server Components vs Client components in complex UI

提问人:Chris 提问时间:10/24/2023 最后编辑:Chris 更新时间:10/25/2023 访问量:60

问:

我对复杂的、数据驱动的 UI 的整体架构有一些疑问。以通常的博客页面为例,带有侧边栏、标题和徽标,其想法是:

  • 标头和徽标是静态的,可以是服务器端组件
  • 侧边栏是静态的,可以是服务器端组件
  • 页脚是静态的,可以是服务器端组件
  • 博客文章是静态的,可以是服务器端组件
  • 只有搜索函数和点赞按钮可能是交互式的,并且是客户端组件

在现实世界中,当我构建它时,它宁愿是这样的:

  • 我的侧边栏是可折叠的。因此,它具有用户操作,需要根据用户的选择显示或隐藏。因此,我需要将其包装在响应状态的客户端组件中
  • 我的博客文章位于选项卡或手风琴中。我需要将我的博客内容包装在客户端组件中,因为同样,内容会根据用户交互和状态显示或隐藏
  • 我的博客文章组件将有一个带有布局选项的切换器,例如在网格和列表之间。我需要将它们包装在客户端布局组件中,该组件响应用户输入和状态
  • 我的徽标取决于设备/窗口大小。我需要访问 window 对象来决定我是想要移动版还是桌面版的徽标。为此,我需要客户端。
  • 我的页脚有桌面或移动布局,我需要决定加载哪一个。同样,我需要访问窗口对象或使用钩子的第三方库
  • 如果我添加了一个表格来显示数据,我可能希望使其可排序或可过滤 - 同样,内容或内容的呈现将受到用户交互的影响

最后,我页面上的所有内容都受制于某种用户交互或用户诱导状态。我无法想象我在过去几年中构建的 UI 只是以隔离的方式加载静态内容。

我唯一想到的是,对于 SEO,我可以通过服务器端组件加载一些数据驱动的 HTML 作为骨架,以便 SE Bots 可以立即读取数据,然后在准备好后与交互式客户端等效项一起显示。不确定这是否可行,我可能需要做一些阅读。<Suspense />

否则,在上述用例中,我是否遗漏了什么?除了数据获取之外,我根本想不出服务器端组件的真实用例,因为我页面上的每个项目都将始终受到用户交互(因此:用户界面)的约束。

感谢您:)的任何澄清

下一个.js 服务器端 客户端

评论


答:

2赞 A F 10/25/2023 #1

NextJs 应用程序路由器文档中有一篇关于此的精彩文章

顶级域名:你是对的。在您描述的基于博客的系统中,服务器组件的大多数用例都是数据获取。

就个人而言,我们构建的系统具有大量的依赖项和数据获取令牌,我们将其保留在服务器端。这大大减少了客户端的加载时间,并提高了安全性。在某些情况下,它还允许我们绕过编写 REST API,转而直接查询我们的数据。

切换侧边栏的简单状态管理似乎不会真正从服务器端受益。它不会出现很大的依赖性问题,也不会出现最好保持私有的私有令牌/等。正如我之前所说,我同意你的分析,即你的用例不会从 SSR 组件中受益匪浅。

话虽如此,平行路线有很大的潜力。这将允许您仅使用 SSR 组件在同一 URL 上切换布局、徽标或其他内容。如果应用结构正确,则只有“控制器/切换器”组件需要是客户端,其余组件可能是 SSR。(目前尚不清楚这是否真的会带来很大的性能优势,除非您静态地预渲染了所有 SSR 并使用了缓存)

我相信你已经意识到了这一点,但你也可以选择将 SSR 组件渲染为 CSR 组件的子组件,这将允许你更动态地选择如何构建你的项目。

评论

1赞 Chris 10/26/2023
这一切都是有道理的,非常感谢您抽出宝贵时间回复并分享您的经验/见解!