<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>React19 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《修复 React 中的 Hydration Mismatch 错误与 UI 闪烁》</title><link>https://channel.meo-ai.com/posts/731</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/731</guid><pubDate>Thu, 29 Oct 2026 22:20:12 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《修复 React 中的 Hydration Mismatch 错误与 UI 闪烁》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NextJS&quot; title=&quot;#NextJS&quot;&gt;#NextJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HydrationMismatch&quot; title=&quot;#HydrationMismatch&quot;&gt;#HydrationMismatch&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23LocalStorage&quot; title=&quot;#LocalStorage&quot;&gt;#LocalStorage&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SSR&quot; title=&quot;#SSR&quot;&gt;#SSR&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23UI%E9%97%AA%E7%83%81&quot; title=&quot;#UI闪烁&quot;&gt;#UI闪烁&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React19&quot; title=&quot;#React19&quot;&gt;#React19&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;文章以 Next.js 全栈电影应用为例，系统讲解了服务端渲染（SSR）中 Hydration Mismatch 错误的成因与多种修复方案：包括挂载前渲染 null/骨架屏、用 &lt;code&gt;useEffect&lt;/code&gt; 读取 localStorage 保持 SSR、用内联脚本在 hydration 前同步状态以避免闪烁，以及 React 19.3 新增的 &lt;code&gt;use(browser())&lt;/code&gt; API。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. Hydration 是水合过程：React 用 SSR 时的同一组件树在客户端内存中重新渲染，并校验其输出与服务端 HTML 是否一致，不一致就报 Hydration Mismatch 错误。&lt;br /&gt;2. 错误常见诱因是渲染依赖了仅客户端可用的信息，比如 localStorage——服务端拿不到，导致两端输出不同。&lt;br /&gt;3. 通用解法一：&lt;code&gt;useEffect&lt;/code&gt; 中设置 &lt;code&gt;isClient&lt;/code&gt;，挂载前返回 &lt;code&gt;null&lt;/code&gt; 或骨架屏，保证两端输出一致；代价是真实内容不进服务端 HTML，对 SEO 和大型布局不友好。&lt;br /&gt;4. 通用解法二：给元素加 &lt;code&gt;suppressHydrationWarning&lt;/code&gt;，但它只压警告不修问题，且仅一层有效，不宜滥用。&lt;br /&gt;5. 在侧边栏场景中，作者改用 &lt;code&gt;useEffect&lt;/code&gt; 里读 localStorage 并 &lt;code&gt;setState&lt;/code&gt;，先用默认值 &lt;code&gt;false&lt;/code&gt; 完成 SSR，挂载后再更新状态，既保留 SSR 又消除不匹配（但会有短暂闪烁）。&lt;br /&gt;6. 防闪烁的进阶方案：用 &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; 注入内联脚本，在 hydration 前直接把 localStorage 状态应用到 DOM，并把值挂到 &lt;code&gt;window&lt;/code&gt; 上供 React 初始渲染读取，保证脚本和 React 修改同一批 class。&lt;br /&gt;7. 主题切换用 &lt;code&gt;useIsClient&lt;/code&gt; 延迟渲染（官方推荐做法，小控件可接受）；移动端遮罩层则用 CSS &lt;code&gt;group-[.left-0]:block&lt;/code&gt; 跟随侧边栏 class，避免条件渲染造成的不匹配。&lt;br /&gt;8. React 19.3 引入的 &lt;code&gt;use(browser())&lt;/code&gt; 可以跳过组件的服务端渲染并留下最近的 &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; 兜底，是 &lt;code&gt;useEffect&lt;/code&gt; 方案的替代写法。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://www.gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://www.gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&quot;&gt;https://www.gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Understanding hydration mismatch errors and what to do about them.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Gmoniava&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;What Is a Hydration Mismatch Error and How Do You Fix It?&quot; src=&quot;/static/https://cdn4.telesco.pe/file/qmMf-k8xSJajmqkr2p5SzyaN5xBif4nPyK_mUjzV2mOGaho7_JF3xRmgxC71y0tLeeaSA8kVb5iWz6GciEdPPZ2gzV5629YN-uDIIDgIfJHeWvSvDaQA1pTvfcjOaIMTyHpV5vg8DDMtwGyXQXFq8V1RCIvhevyFPEHWNguZZki6BexABOUUsb7iYBfkfvpjAyppwgmOr6oSwfVs_TYbeVyk4uzEn-QbSAHGwpkoSOW7sIoG0oTD30GoXDhxFoIJO8toAOlVvppiELv3IsIgGekpDQj3nFJq9qNVdaSHWXUH4R1SJydZDSG9J9MSFRpiTXqNb_CiiONmx9NkEXQ3ig.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;What Is a Hydration Mismatch Error and How Do You Fix It?&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Understanding hydration mismatch errors and what to do about them.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《React Router v8 发布：最&quot;无聊&quot;的一次大版本升级》</title><link>https://channel.meo-ai.com/posts/666</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/666</guid><pubDate>Sun, 21 Jun 2026 08:48:50 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《React Router v8 发布：最&quot;无聊&quot;的一次大版本升级》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React_Router&quot; title=&quot;#React_Router&quot;&gt;#React_Router&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Remix&quot; title=&quot;#Remix&quot;&gt;#Remix&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vite&quot; title=&quot;#Vite&quot;&gt;#Vite&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React19&quot; title=&quot;#React19&quot;&gt;#React19&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SPA_SSR&quot; title=&quot;#SPA_SSR&quot;&gt;#SPA_SSR&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%A1%86%E6%9E%B6%E5%8D%87%E7%BA%A7&quot; title=&quot;#框架升级&quot;&gt;#框架升级&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;React Router v8 正式发布，主打&quot;最无聊的大版本升级&quot;理念。v7 引入的 Framework Mode 已成熟，v8 在此基础上将多个 future flags 转正为默认行为，带来 40+ 项改进，包括中间件增强、路由模块拆分、类型安全的 href、Link 遮罩等。破坏性变更极少，升级路径平滑。团队同时宣布采用年度大版本发布节奏，并正式将 React Router v6 和 Remix v2 标记为生命周期结束（EOL）。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 升级超省心：v8 的破坏性变更极少，大部分改动在 v7 中就能提前完成，团队的目标是&quot;让大版本升级尽可能无聊&quot;&lt;br /&gt;2. 基线要求更新：最低支持 Node 22.22+、React 19.2.7+、Vite 7+，且改为纯 ESM 发布，tsconfig 目标更新至 ES2022&lt;br /&gt;3. Future Flags 转正：v8 移除了多个 future flags，其对应功能现在默认启用，比如中间件、透传请求、Vite Environment API 支持等&lt;br /&gt;4. Remix 走向新方向：Remix v0.x-2.x 的功能已合并回 React Router，Remix 3 将转型为真正的全栈零依赖 JS 框架，与 React Router 并行发展&lt;br /&gt;5. 年度发布节奏：从 v8 开始采用每年一次大版本发布，让升级更可预测、更稳定&lt;br /&gt;6. v6/v7 生命周期：v6 和 Remix v2 正式 EOL，不再接收安全更新；v7 继续接收安全补丁&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://remix.run/blog/react-router-v8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://remix.run/blog/react-router-v8&quot;&gt;https://remix.run/blog/react-router-v8&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://remix.run/blog/react-router-v8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;React Router v8 is available now.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;remix.run&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;React Router v8&quot; src=&quot;/static/https://cdn4.telesco.pe/file/spAB9WMv1R2jc0yUDNKpBSo2kkzNekzbhKlhZQMlGXdoF19Yksj4x8eroj1oQrdimTd312ZI0sejk7H9-J9M1UeKaLQsLJw-RTSmF5yjxQr6dK9W3cuFkTzsVDAABR8_VTxbOF56Ij_fuZF-27gkkgM3I2meCzsKHuwIk8aDMk4aIbOszBgCcLO3CPooMcCyTJCbLlL0yeENiI9Po6qnv2EUSi_EcPxC3jyp_fmawCrDV9pVey93yXYv7SQO7NYkXyforBPgRKcTNbgHbG8NVzq1xwkDf4yy4aUFRaUcAe6AczappwewUGzl4kjdzfQoMyVRXqyLeSBfcaSWVtGbhw.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;React Router v8&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;React Router v8 is available now.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>