”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么客户端组件在nextjs中渲染为SSR,将组件标记为“使用客户端”仍然将其html渲染为SSR为什么?

为什么客户端组件在nextjs中渲染为SSR,将组件标记为“使用客户端”仍然将其html渲染为SSR为什么?

发布于2024-11-04
浏览:918

Why do client components render as SSR in nextjs, marking components as \

Next.js中,客户端组件(“使用客户端”)与SSR(服务器端渲染)一起工作的方式有时会令人困惑。让我们来分解一下:

客户端和服务器组件如何在 Next.js 中工作:

  • 服务器组件:这些是 Next.js 中的默认组件,它们在服务器上预渲染。它们不会以 JavaScript 的形式发送到客户端,而只会以 HTML 的形式发送到客户端。
  • 客户端组件:当你将组件标记为“use client”时,意味着该组件需要运行在客户端,因为它可能具有交互性(如useState、useEffect),或依赖于在服务器环境中不起作用的浏览器 API。

为什么客户端组件仍然在服务器上呈现 HTML:

即使组件被标记为“使用客户端”,该组件的初始 HTML 仍然可以在 服务器 (SSR) 上生成,但仅用于静态 HTML 目的。这意味着:

  • 初始渲染:服务器生成页面的 HTML,包括客户端组件,以获得更好的性能和 SEO。这是静态 HTML,不是交互式的。
  • Hydration:当此 HTML 到达浏览器时,Next.js 使用 JavaScript 来水合客户端组件,从而实现其交互性。

为什么会发生这种情况:

  • 性能:通过服务器渲染初始 HTML,用户可以更快地查看内容(更快的首字节时间或 TTFB),而无需等待客户端 JavaScript 加载。
  • SEO:预渲染 HTML 对于 SEO 很重要,因为它确保搜索引擎可以抓取内容并为其建立索引。
  • Hydration:提供 HTML 后,Next.js 将 JavaScript 包发送到客户端,客户端“水合”静态 HTML,附加事件侦听器并使其具有交互性。

“使用客户端”会发生什么?

  • 服务器端 HTML 渲染:即使组件是客户端,Next.js 仍然会为初始视图生成 HTML。因此,虽然它不在服务器上运行交互式 JavaScript,但它确实将 HTML 标记发送到客户端。
  • 客户端水合:交互所需的 JavaScript 被发送到客户端,一旦页面加载,Next.js 就会水合组件,使其完全发挥作用。

误解:

用“使用客户端”标记组件并不意味着它不会生成任何 HTML 服务器端。它只是意味着交互式 JavaScript 只会在客户端加载,但服务器仍可能生成初始静态 HTML 进行渲染。

总结一下:

  • 客户端组件的 SSR:客户端组件的 HTML 可能会在服务器上预渲染(用于初始加载),但它们在客户端上水合之前不具有交互性。
  • “使用客户端”:该指令确保客户端交互性的 JavaScript 仅在浏览器中执行,但不会停止服务器上的静态 HTML 生成。

如果您想确保组件的行为不同,您可能需要重新考虑在何处以及如何加载某些动态内容,特别是如果您期望客户端特定的行为(例如访问窗口或文档)。

版本声明 本文转载于:https://dev.to/shanu001x/why-do-client-components-render-as-ssr-in-nextjs-marking-components-as-use-client-still-render-its-html-as-ssr-why-1e70?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-04-16
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-04-16
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-04-16
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-04-16
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-04-16
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-16
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-04-16
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-16
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-04-16
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-04-16
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-04-16
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-04-16
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-04-16
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3