提问人:Chris 提问时间:10/24/2023 最后编辑:Chris 更新时间:10/25/2023 访问量:60
NextJS 13 服务器组件与复杂 UI 中的客户端组件
NextJS 13 Server Components vs Client components in complex UI
问:
我对复杂的、数据驱动的 UI 的整体架构有一些疑问。以通常的博客页面为例,带有侧边栏、标题和徽标,其想法是:
- 标头和徽标是静态的,可以是服务器端组件
- 侧边栏是静态的,可以是服务器端组件
- 页脚是静态的,可以是服务器端组件
- 博客文章是静态的,可以是服务器端组件
- 只有搜索函数和点赞按钮可能是交互式的,并且是客户端组件
在现实世界中,当我构建它时,它宁愿是这样的:
- 我的侧边栏是可折叠的。因此,它具有用户操作,需要根据用户的选择显示或隐藏。因此,我需要将其包装在响应状态的客户端组件中
- 我的博客文章位于选项卡或手风琴中。我需要将我的博客内容包装在客户端组件中,因为同样,内容会根据用户交互和状态显示或隐藏
- 我的博客文章组件将有一个带有布局选项的切换器,例如在网格和列表之间。我需要将它们包装在客户端布局组件中,该组件响应用户输入和状态
- 我的徽标取决于设备/窗口大小。我需要访问 window 对象来决定我是想要移动版还是桌面版的徽标。为此,我需要客户端。
- 我的页脚有桌面或移动布局,我需要决定加载哪一个。同样,我需要访问窗口对象或使用钩子的第三方库
- 如果我添加了一个表格来显示数据,我可能希望使其可排序或可过滤 - 同样,内容或内容的呈现将受到用户交互的影响
最后,我页面上的所有内容都受制于某种用户交互或用户诱导状态。我无法想象我在过去几年中构建的 UI 只是以隔离的方式加载静态内容。
我唯一想到的是,对于 SEO,我可以通过服务器端组件加载一些数据驱动的 HTML 作为骨架,以便 SE Bots 可以立即读取数据,然后在准备好后与交互式客户端等效项一起显示。不确定这是否可行,我可能需要做一些阅读。<Suspense />
否则,在上述用例中,我是否遗漏了什么?除了数据获取之外,我根本想不出服务器端组件的真实用例,因为我页面上的每个项目都将始终受到用户交互(因此:用户界面)的约束。
感谢您:)的任何澄清
答:
NextJs 应用程序路由器文档中有一篇关于此的精彩文章。
顶级域名:你是对的。在您描述的基于博客的系统中,服务器组件的大多数用例都是数据获取。
就个人而言,我们构建的系统具有大量的依赖项和数据获取令牌,我们将其保留在服务器端。这大大减少了客户端的加载时间,并提高了安全性。在某些情况下,它还允许我们绕过编写 REST API,转而直接查询我们的数据。
切换侧边栏的简单状态管理似乎不会真正从服务器端受益。它不会出现很大的依赖性问题,也不会出现最好保持私有的私有令牌/等。正如我之前所说,我同意你的分析,即你的用例不会从 SSR 组件中受益匪浅。
话虽如此,平行路线有很大的潜力。这将允许您仅使用 SSR 组件在同一 URL 上切换布局、徽标或其他内容。如果应用结构正确,则只有“控制器/切换器”组件需要是客户端,其余组件可能是 SSR。(目前尚不清楚这是否真的会带来很大的性能优势,除非您静态地预渲染了所有 SSR 并使用了缓存)
我相信你已经意识到了这一点,但你也可以选择将 SSR 组件渲染为 CSR 组件的子组件,这将允许你更动态地选择如何构建你的项目。
评论