<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>React 专题：从核心概念到生产级应用开发 on PlumePHP</title><link>https://plumephp.com/posts/frontend/react/</link><description>Recent content in React 专题：从核心概念到生产级应用开发 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 21 Nov 2025 16:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/frontend/react/index.xml" rel="self" type="application/rss+xml"/><item><title>React 19 新特性完全指南：Actions、use() Hook、服务器组件、编译器与自动记忆化</title><link>https://plumephp.com/react-19-new-features/</link><pubDate>Fri, 21 Nov 2025 16:00:00 +0800</pubDate><guid>https://plumephp.com/react-19-new-features/</guid><description>&lt;p&gt;&lt;strong&gt;React 19 是 React 自 Hooks 以来最重要的版本更新&lt;/strong&gt;。它不仅让 Server Components 脱离实验阶段，还引入了 Actions、use() Hook 和备受期待的 React Compiler（前身为 React Forget），将从根本上改变 React 的性能优化范式——开发者不再需要手动写 &lt;code&gt;useMemo&lt;/code&gt;、&lt;code&gt;useCallback&lt;/code&gt; 和 &lt;code&gt;React.memo&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>React 构建工具深度对比：Vite、SWC、Turbopack、Rspack、esbuild 与生产优化策略</title><link>https://plumephp.com/react-build-tools-guide/</link><pubDate>Fri, 21 Nov 2025 15:00:00 +0800</pubDate><guid>https://plumephp.com/react-build-tools-guide/</guid><description>&lt;p&gt;&lt;strong&gt;构建工具直接决定了 React 应用的开发体验和生产性能&lt;/strong&gt;。从 Create React App（CRA）被标记为 deprecated 起，前端构建工具经历了从 webpack 到原生 ESM、从 Babel 到 Rust/SWC 编译器的范式转移。本文系统对比当前主流方案，给出明确的选型建议和生产优化策略。&lt;/p&gt;</description></item><item><title>React Router 完全指南：v6 路由模式、嵌套路由、Loader/Action、权限守卫与生产实践</title><link>https://plumephp.com/react-router-guide/</link><pubDate>Fri, 21 Nov 2025 14:00:00 +0800</pubDate><guid>https://plumephp.com/react-router-guide/</guid><description>&lt;p&gt;&lt;strong&gt;路由是现代单页应用（SPA）的骨架&lt;/strong&gt;。React Router 是 React 生态中最流行的路由库，从 v6 开始彻底重构了 API，引入了 loader/action、嵌套路由、错误边界等现代模式。本文覆盖从基础到生产级的完整路由实践。&lt;/p&gt;</description></item><item><title>React 测试完全指南：单元测试、组件测试、E2E、Mock API、视觉回归与 CI/CD 集成</title><link>https://plumephp.com/react-testing-guide/</link><pubDate>Fri, 21 Nov 2025 13:00:00 +0800</pubDate><guid>https://plumephp.com/react-testing-guide/</guid><description>&lt;p&gt;&lt;strong&gt;测试是 React 应用质量的最后防线，也是重构的信心来源&lt;/strong&gt;。本文构建了从单元测试到 E2E 的完整测试体系，涵盖工具选型、代码规范、CI/CD集成全流程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一测试金字塔投入比例与策略"&gt;一、测试金字塔：投入比例与策略&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ┌──────────┐
 │ E2E │ ← 5% 投入，验证关键用户流程 (Playwright/Cypress)
 │ (~20个) │
 ├──────────┤
 │ 集成 │ ← 15% 投入，组件间交互 (RTL + Mock API)
 │ (~200个) │
 ├──────────┤
 │ 单元 │ ← 80% 投入，纯函数、工具逻辑 (Vitest/Jest)
 │ (~2000个)│
 └──────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键原则&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>React + TypeScript 深度实战：泛型组件、Hook 类型、API 数据契约、设计模式与严格配置</title><link>https://plumephp.com/react-typescript-guide/</link><pubDate>Fri, 21 Nov 2025 12:00:00 +0800</pubDate><guid>https://plumephp.com/react-typescript-guide/</guid><description>&lt;p&gt;&lt;strong&gt;TypeScript 已成为 React 项目的标配&lt;/strong&gt;。本文不是基础教程，而是覆盖生产环境中最常用的类型模式、设计规范和常见陷阱的深度指南。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一基础但关键的类型模式"&gt;一、基础但关键的类型模式&lt;/h2&gt;
&lt;h3 id="11-props-类型设计原则"&gt;1.1 Props 类型设计原则&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ✅ 使用 interface（可扩展，merge 友好）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ButtonProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;children&lt;/span&gt;: &lt;span class="kt"&gt;React.ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 通用子元素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;primary&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;secondary&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ghost&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 字面量联合（有限选项）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sm&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;md&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;disabled?&lt;/span&gt;: &lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;: &lt;span class="kt"&gt;React.MouseEvent&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;className?&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 允许外部 className 覆盖
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ✅ HTML 原生属性继承（避免重复声明）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;InputProps&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InputHTMLAttributes&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;label&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;error?&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InputProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;...rest&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="na"&gt;aria-invalid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;alert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Props 命名规范&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>React 状态管理完全指南：Context、Zustand、Jotai、Redux Toolkit、TanStack Query 深度选型与生产级实践</title><link>https://plumephp.com/react-state-management/</link><pubDate>Fri, 21 Nov 2025 11:00:00 +0800</pubDate><guid>https://plumephp.com/react-state-management/</guid><description>&lt;p&gt;&lt;strong&gt;React 状态管理是前端开发中争议最多、选择最丰富的领域&lt;/strong&gt;。从内置的 &lt;code&gt;useState&lt;/code&gt; 到遍布社区的几十个状态库，选择困难的根本原因是状态本身具有多种形态，不同形态需要不同的管理方案。本文构建完整的 React 状态管理知识体系，从底层原理到生产实践，按项目规模给出明确的选型路径。&lt;/p&gt;</description></item><item><title>React 性能优化深度指南：React.memo、useMemo、虚拟列表与渲染剖析</title><link>https://plumephp.com/react-performance-optimization/</link><pubDate>Fri, 21 Nov 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/react-performance-optimization/</guid><description>&lt;p&gt;&lt;strong&gt;React 的声明式模型让开发体验极佳，但&amp;quot;自动决定如何更新&amp;quot;也意味着性能问题容易被忽视&lt;/strong&gt;：不必要的重渲染、过大的 Bundle、低效的数据流都可能让应用在高负载下卡顿。本文从渲染瓶颈定位到具体优化手段，建立系统性的 React 性能调优方法论。&lt;/p&gt;</description></item><item><title>React Server Components 深度解析：服务端渲染边界、流式传输与混合架构</title><link>https://plumephp.com/react-server-components/</link><pubDate>Fri, 21 Nov 2025 09:00:00 +0800</pubDate><guid>https://plumephp.com/react-server-components/</guid><description>&lt;p&gt;&lt;strong&gt;React Server Components（RSC）是 React 18+ 最具架构性的一次变革&lt;/strong&gt;：它允许组件在服务端执行，直接访问数据库和文件系统，渲染结果以序列化格式发送到客户端，大幅减少 JavaScript Bundle 体积。Next.js 的 App Router、Remix、Gatsby 5 等框架都已经深度集成 RSC。本文从原理到落地，完整拆解 RSC 的执行模型和应用策略。&lt;/p&gt;</description></item><item><title>React Hooks 完全指南：从 useState 到自定义 Hook 的系统性掌握</title><link>https://plumephp.com/react-hooks-complete-guide/</link><pubDate>Fri, 21 Nov 2025 08:00:00 +0800</pubDate><guid>https://plumephp.com/react-hooks-complete-guide/</guid><description>&lt;p&gt;&lt;strong&gt;Hooks（React 16.8 引入）是 React 现代开发的核心&lt;/strong&gt;：它让函数组件拥有了状态管理、副作用处理、上下文消费、引用保存等全部能力，彻底终结了类组件的生命周期混乱。本文从每个内置 Hook 的深度用法，到自定义 Hook 设计模式，再到性能陷阱与最佳实践，帮你建立对 Hooks 的系统性理解。&lt;/p&gt;</description></item><item><title>React vs Vue vs Svelte vs Solid（2025）：四大前端框架选型决策指南</title><link>https://plumephp.com/react-vs-vue-vs-svelte-vs-solid/</link><pubDate>Fri, 21 Nov 2025 07:00:00 +0800</pubDate><guid>https://plumephp.com/react-vs-vue-vs-svelte-vs-solid/</guid><description>&lt;p&gt;&lt;strong&gt;React、Vue、Svelte、Solid 是当前前端生态的四大主流框架&lt;/strong&gt;：React 统治企业级市场，Vue 在中国市场独步天下，Svelte 以&amp;quot;编译时优化&amp;quot;席卷独立开发者，Solid 则凭借&amp;quot;细粒度响应式&amp;quot;挑战性能天花板。本文从架构范式到生产落地，帮你为具体项目选出正确的框架——而不是寻找&amp;quot;最好的&amp;quot;框架。&lt;/p&gt;</description></item><item><title>React 详解：声明式 UI 与组件化开发的现代前端基石</title><link>https://plumephp.com/react/</link><pubDate>Fri, 21 Nov 2025 06:00:00 +0800</pubDate><guid>https://plumephp.com/react/</guid><description>&lt;p&gt;&lt;strong&gt;React 是由 Meta（原 Facebook）开发和维护的、用于构建用户界面的 JavaScript 库&lt;/strong&gt;。2013 年开源以来，React 通过引入组件化、虚拟 DOM、JSX 和单向数据流等概念，彻底改变了前端开发的范式。无论是小型组件还是大型企业级应用（如 Facebook、Instagram、Netflix、Airbnb），React 都是当今 Web 开发的核心基础设施之一。本文从设计理念到现代特性，完整拆解 React 的核心能力。&lt;/p&gt;</description></item></channel></rss>