<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>TanStack | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《TanStack AI 进入 RC 阶段：从 humble chat() 到完整 AI 生态》</title><link>https://channel.meo-ai.com/posts/699</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/699</guid><pubDate>Fri, 28 Aug 2026 01:09:36 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《&lt;/span&gt;&lt;mark class=&quot;highlight&quot;&gt;&lt;span class=&quot;post-title-source&quot;&gt;TanStack&lt;/span&gt;&lt;/mark&gt;&lt;span class=&quot;post-title-source&quot;&gt; AI 进入 RC 阶段：从 humble chat() 到完整 AI 生态》&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=%23AI%E6%A1%86%E6%9E%B6&quot; title=&quot;#AI框架&quot;&gt;#AI框架&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack&quot; title=&quot;#TanStack&quot;&gt;#TanStack&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90&quot; title=&quot;#开源&quot;&gt;#开源&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; AI 正式从早期原型迈入 RC（Release Candidate）阶段，标志着其从一个简单的 LLM 聊天方法，成长为覆盖聊天、媒体生成、MCP、沙箱、Agent 编排等全场景的 AI 开发框架。核心设计哲学是&quot;不锁定用户&quot;——在传输层、提供商、前后端技术栈上都保持中立，同时通过极致的类型安全和统一的 API 模式降低学习成本。项目由三人业余时间维护，完全开源，无商业路线图。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 从小 chat() 到大生态 — 最初只有 4 个提供商和一个自定义协议，如今已支持 24+ 提供商，采用 AG-UI 官方协议（被 20+ Agent 框架跨语言支持），并扩展到媒体生成、MCP、沙箱、Agent Harness 等领域。&lt;br /&gt;&lt;br /&gt;2. 中间件是架构的核心超能力 — 几乎所有高级功能（持久化、沙箱 Agent、内存、遥测）都以中间件形式接入 chat() 方法，Durability 则通过适配器插入流式响应。Lazy Tool Calling 用一个布尔标志就能降低 Token 成本。&lt;br /&gt;&lt;br /&gt;3. 传输层零锁定 — 提供 SSE、WebSocket、HTTP Stream、Cap&apos;n Web 等原生传输原语，客户端通过自定义连接适配器消费流，让你对传输层有端到端的完全控制权。&lt;br /&gt;&lt;br /&gt;4. 一套 API 模式打遍所有模态 — 无论是文本生成、图像生成、视频生成、音频生成、转录还是实时音频，API 结构几乎完全相同。学一次模式，换适配器即可，不用学 20 套不同 API。&lt;br /&gt;&lt;br /&gt;5. 类型安全是 DNA 级别 — 不支持的模型选项、缺少必填属性、把某提供商专属工具传给不支持的模型……统统在编译期报错。目标是让你在再复杂的应用里也能自信上线。&lt;br /&gt;&lt;br /&gt;6. chat() 方法是全能核心 — 支持直接对话 LLM 和沙箱 Agent Harness；内置持久化与 Durability（刷新页面、切换对话后能从断点实时续流）；支持 Codex 等 Agent 在远程/本地沙箱中运行；还有 Code Mode（Agent 在 isolate 中写代码并执行，优化性能和成本）。&lt;br /&gt;&lt;br /&gt;7. 媒体生成是一等公民 — 实时音频、TTS、图像/视频/音频/音乐生成、转录等全部稳定可用，覆盖 100+ 模型。支持流式直传客户端或一次性生成，两者切换无缝。&lt;br /&gt;&lt;br /&gt;8. RAG 与记忆 — 通过 Cohere、OpenRouter 等提供商支持嵌入和重排序；支持所有主流厂商的 Agent 记忆，让 Agent 跨对话记住用户偏好和关键事实。&lt;br /&gt;&lt;br /&gt;9. 沙箱与 Agent Harness 不挑提供商 — 不强制你用 Daytona、E2B 或 Vercel Sandboxes，基础设施随你选。支持 Codex、Claude Code、Grok、OpenCode 等 20+ ACP 兼容 Agent，甚至能自建本地编码 Agent。&lt;br /&gt;&lt;br /&gt;10. MCP 支持带类型生成 — 不仅能连接外部 MCP 服务器，还能通过 CLI 为远程 MCP 暴露的工具生成类型，保持端到端类型安全。支持连接池和生命周期管理。&lt;br /&gt;&lt;br /&gt;11. 持久化与 Durability 是亮点 — 提供存储原语，你只需实现 Store 并通过一致性测试套件验证，接入持久化中间件后，用户一个月后回来也能从断点续聊。Durability 适配器可将流块持久化到内存、Durable Streams 等，用户重连后不会漏掉任何内容——全部配置约 20 行代码。&lt;br /&gt;&lt;br /&gt;12. 未来路线图 — 核心架构已锁定，接下来重点在 Agent 工作流与编排（并行运行、定时任务、复杂工作流协调），以及继续补齐提供商生态。完全开源，无商业 upsell，欢迎社区贡献。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://tanstack.com/blog/tanstack-ai-rc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://tanstack.com/blog/tanstack-ai-rc&quot;&gt;https://tanstack.com/blog/tanstack-ai-rc&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://tanstack.com/blog/tanstack-ai-rc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TanStack AI enters the release candidate phase. The architecture is locked in, with 24 providers, AG-UI, media generation, MCP, sandboxes, and persistence.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;TanStack&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;TanStack AI Enters the RC Phase | TanStack Blog&quot; src=&quot;/static/https://cdn4.telesco.pe/file/WQe3VBUr3GnLhe6EisewlH9jLGS2iJFLD4PG_9iXtzUs5TXWOCOh3KflQsRIJZuCaI1VmCZ9qpHHjnQZLcRGxXi1g7pn3DcCYdySG16D0J4Eczr36dNOaEevbrfhhZ-SxbR9yC7_x8QmVqBM_CJrVrhHVRqLjaJHHjlzd-I5ll3yKgtVp7lcT2Gt5tyHMrq9dg_GFZNoIw8MlVhhvqfhMSPMDEthwebTk_81dcau-vGlFb-I7T9k3h8MQkbA6ywEUZm8jjRFF5Fpu6c9tHFdT6wtHanTVa5OL8N6Q9_5yZSfkHzDrvOKt7CitsNn_xFc1M-lx-uelUaDqoGXkwGlnQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; AI Enters the RC Phase | &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Blog&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; AI enters the release candidate phase. The architecture is locked in, with 24 providers, AG-UI, media generation, MCP, sandboxes, and persistence.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《TanStack_Markdown与TanStack_Highlight发布：让技术文档渲染回归轻量》</title><link>https://channel.meo-ai.com/posts/687</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/687</guid><pubDate>Sat, 01 Aug 2026 09:15:00 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TanStack_Markdown与TanStack_Highlight发布：让技术文档渲染回归轻量》&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=%23TanStack&quot; title=&quot;#TanStack&quot;&gt;#TanStack&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Markdown%E6%B8%B2%E6%9F%93&quot; title=&quot;#Markdown渲染&quot;&gt;#Markdown渲染&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE&quot; title=&quot;#语法高亮&quot;&gt;#语法高亮&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96&quot; title=&quot;#性能优化&quot;&gt;#性能优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;TanStack发布两个新库：Markdown解析器与Highlight语法高亮，专为技术博客、文档和AI流式输出设计。通过将Markdown解析与语法高亮解耦，采用轻量级AST和语义化CSS类，将文档页脚本体积从1.1MiB大幅缩减至约27KiB，彻底摆脱了对React_Server_Components的依赖，实现了&quot;让内容回归内容&quot;的极简渲染理念。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 痛点很真实：原来tanstack.com的文档页光是语法高亮就占了358KiB，加上Shiki、WASM、主题等，读个页面像下载小型出版系统，不得不靠RSC把负担藏到服务器端&lt;br /&gt;2. 两个库分工明确：Markdown负责把内容解析成可序列化的普通数据树，Highlight负责把已知语言转成带语义CSS类的HTML，互不依赖，按需组合&lt;br /&gt;3. 体积真的小：Markdown解析器仅4.9KB(gzipped)，HTML渲染器约6.7KB，Highlight核心才1.7KB，25种语言全包也才8KB，零运行时依赖&lt;br /&gt;4. 暗色模式超优雅：Highlight输出一套带th-语义类的HTML，主题通过CSS变量切换，不用重新高亮，明暗切换只是一次CSS操作&lt;br /&gt;5. AI流式输出有新招：不用维护复杂的增量解析状态，每次收到新文本就同步重新解析，已完成块保持稳定，未完成的标题列表不会留空占位&lt;br /&gt;6. 已经扛住实战考验：这两个库已全面替换tanstack.com的文档和博客渲染，测试覆盖333个真实文档fixtures，不是玩具是生产力工具&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://tanstack.com/blog/introducing-tanstack-markdown-and-highlight&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://tanstack.com/blog/introducing-tanstack-markdown-and-highlight&quot;&gt;https://tanstack.com/blog/introducing-tanstack-markdown-and-highlight&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://tanstack.com/blog/introducing-tanstack-markdown-and-highlight&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TanStack Markdown and TanStack Highlight are two tiny, synchronous libraries for turning technical content into deterministic, themeable webpages without shipping a general-purpose publishing system.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;TanStack&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Introducing TanStack Markdown and TanStack Highlight | TanStack Blog&quot; src=&quot;/static/https://cdn4.telesco.pe/file/UGIat6DB6OtQorR_7WxHpJzzGnXMNP4Rt2qGKjT9anm6BXOifi8Kcva8lwvQ2Dced1laZFWF15tbUvWBgejyUyV762v6DYd428J6Tg5LBshWtiXceQa_sw4UqS9RdZJrxIz59BApdziCXiiXNPZIRXBjCGq7c3ozUky2kdDt14UdfHQuz9ArvM5in554bxhhiovljoAQQS3Aj0Vbrd-LnPbHUrBLp6cAOAz4sB3vCtCRKUfji_c2ftLHQJ1O1_rDKIKNV4eRT5EKPqzHRRhhPaIJDDWqw3JH87UVTIf2Bv5sAi0qv2Wo4rHlk0Da2A23egGUApiNn4C6eQAnvoKIWg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Introducing &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Markdown and &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Highlight | &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Blog&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Markdown and &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Highlight are two tiny, synchronous libraries for turning technical content into deterministic, themeable webpages without shipping a general-purpose publishing system.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《TanStack Start 心智模型：给 Next.js 开发者的迁移指南》</title><link>https://channel.meo-ai.com/posts/667</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/667</guid><pubDate>Sun, 21 Jun 2026 09:59:34 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《&lt;/span&gt;&lt;mark class=&quot;highlight&quot;&gt;&lt;span class=&quot;post-title-source&quot;&gt;TanStack&lt;/span&gt;&lt;/mark&gt;&lt;span class=&quot;post-title-source&quot;&gt; Start 心智模型：给 Next.js 开发者的迁移指南》&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=%23TanStack_Start&quot; title=&quot;#TanStack_Start&quot;&gt;#TanStack_Start&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Next&quot; title=&quot;#Next&quot;&gt;#Next&lt;/a&gt;.js &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=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%85%A8%E6%A0%88%E6%A1%86%E6%9E%B6&quot; title=&quot;#全栈框架&quot;&gt;#全栈框架&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;文章从一位资深 Next.js 开发者的视角，系统对比了 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 与 Next.js App Router 的核心差异。核心心智模型翻转在于：Next.js 默认服务端优先、隐式约定驱动；&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 默认同构 React、显式声明边界。作者逐一对比了路由类型系统、数据获取、服务端函数、缓存策略、渲染模式、认证防护等关键维度，指出 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 更适合高交互 SaaS 类应用，而 Next.js 在内容型站点和成熟生态上仍有优势。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 心智模型大翻转：Next.js 默认组件跑在服务端，需要显式标注 &lt;code&gt;&quot;use client&quot;&lt;/code&gt; 才能上客户端；&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 默认组件同构（服务端+客户端都能跑），只有需要纯服务端逻辑时才用 &lt;code&gt;createServerFn&lt;/code&gt; 显式声明，边界更清晰，不容易踩坑&lt;br /&gt;2. 路由类型系统碾压：Next.js 的文件路由是约定驱动，TypeScript 对参数无能为力；&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Router 会在构建时自动生成完全类型化的路由树，路径参数、搜索参数、loader 返回值全部类型推断，拼写错误直接编译报错&lt;br /&gt;3. 数据获取的&quot;陷阱&quot;：Next.js 的 Server Component 只在服务端执行，天然安全；&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 的 loader 是同构的——SSR 时跑在服务端，客户端导航时跑在浏览器里，所以直接写数据库查询会泄露环境变量，必须用 &lt;code&gt;createServerFn&lt;/code&gt; 包裹&lt;br /&gt;4. 缓存哲学更简单：Next.js 历史上有复杂的四层缓存模型，v16 改为 &lt;code&gt;&apos;use cache&apos;&lt;/code&gt; 显式 opt-in；&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 只有路由 loader 缓存 + 可选的 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Query，没有隐式魔法，哪里缓存、哪里失效一目了然&lt;br /&gt;5. 认证防护双层设计：&lt;code&gt;beforeLoad&lt;/code&gt; 负责 UI 层面的重定向（用户体验），&lt;code&gt;createServerFn&lt;/code&gt; 中间件负责数据层面的安全校验（真正的安全边界），两层职责分离，比 Next.js 把 edge middleware 和 action 内校验混在一起的方案更不容易遗漏&lt;br /&gt;6. Remix 与 RSC 现状：&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 的 RSC 支持仍处于实验阶段，实现方式也与 Next.js 不同（更像客户端获取 Flight payload 后组装），如果生产环境重度依赖 RSC，Next.js 目前更成熟&lt;br /&gt;7. 选型建议：内容型/营销站点选 Next.js；高交互 SaaS 后台、需要强类型安全、讨厌隐式缓存魔法的团队，&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 值得认真评估&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://www.adarsha.dev/blog/tanstack-mental-model-for-nextjs-developers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://www.adarsha.dev/blog/tanstack-mental-model-for-nextjs-developers&quot;&gt;https://www.adarsha.dev/blog/tanstack-mental-model-for-nextjs-developers&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://adarsha.dev/blog/tanstack-mental-model-for-nextjs-developers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Understand TanStack Start from a Next.js developer’s perspective: its router-first architecture, explicit server boundaries, typed routing, caching, rendering, and server functions.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Adarsha Acharya&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;TanStack Start: A Mental Model for Next.js Developers&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Ja3_PLOYCdk_ef6YOzQimki-laVzYQKPWscgPmZVkfjz7dJvyVktlBPYjr0fz-r-XAbor1EWUAJJNcyggHiG0FZZe0VUxcREOqzVZqtUI6kwB771dWmk4swUzl_Oz5TzIpz-FxNLy2vT86ybEurfETg2ReU9ZeESH6jXHKw3Dg6KNLgpxKWmJ0lfkgXKP8Biom9MzNlGHfAiKlVipcNSSmzTWh1lC-147ID8LoseQdKaMtmwxRFIeQZJrnSFR0fiEmHe0F6AmO3fO4nx3yS42vROCGF4EcbrzO6QCrIt9g84djfexf-9do1w-T1zmrPwV_yxzAOwF3OglTbp_karFA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start: A Mental Model for Next.js Developers&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Understand &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start from a Next.js developer’s perspective: its router-first architecture, explicit server boundaries, typed routing, caching, rendering, and server functions.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《为什么我放弃Next.js和RSC，回归传统SPA与独立后端》</title><link>https://channel.meo-ai.com/posts/654</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/654</guid><pubDate>Mon, 01 Jun 2026 00:06:54 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《为什么我放弃Next.js和RSC，回归传统SPA与独立后端》&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=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&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=%23React_Server_Components&quot; title=&quot;#React_Server_Components&quot;&gt;#React_Server_Components&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SPA&quot; title=&quot;#SPA&quot;&gt;#SPA&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1&quot; title=&quot;#架构设计&quot;&gt;#架构设计&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AE%89%E5%85%A8&quot; title=&quot;#安全&quot;&gt;#安全&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack&quot; title=&quot;#TanStack&quot;&gt;#TanStack&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Hono&quot; title=&quot;#Hono&quot;&gt;#Hono&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;作者回顾了自己从Next.js忠实用户到拥抱App Router/RSC，最终回归传统SPA+独立后端的完整历程。文章深入分析了RSC架构带来的心智负担、序列化开销和安全风险，结合2025-2026年多起严重CVE漏洞，论证了将渲染框架与安全边界解耦的必要性，并分享了当前基于React Router+Vite+Hono的简洁技术栈。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;Next.js的黄金时代&lt;/b&gt;：Pages Router时期心智模型清晰，服务端/客户端边界一目了然，文件路由简单易懂，部署零成本&lt;br /&gt;2. &lt;b&gt;App Router带来的混乱&lt;/b&gt;：Server/Client Component区分成为负担，&quot;use client&quot;指令传染性强，开发/构建/生产环境缓存行为不一致，服务端客户端边界变得不可见&lt;br /&gt;3. &lt;b&gt;安全漏洞敲响警钟&lt;/b&gt;：2025年CVE-2025-29927中间件绕过(CVSS 9.1)、2025年底RSC核心包10分满分漏洞CVE-2025-55182、2026年初多起Server Function DoS漏洞，攻击面集中在服务端渲染和反序列化环节&lt;br /&gt;4. &lt;b&gt;TanStack并非避风港&lt;/b&gt;：2026年5月TanStack遭遇供应链攻击，42个包被投毒，说明换框架不能免疫风险，减少依赖面才是关键&lt;br /&gt;5. &lt;b&gt;序列化是根本原因&lt;/b&gt;：RSC的&quot;无缝&quot;本质是分布式系统的序列化问题，函数、类实例、错误栈都无法透明穿越边界，反序列化不可信输入成为高危攻击面&lt;br /&gt;6. &lt;b&gt;当前架构选择&lt;/b&gt;：React Router框架模式+Vite纯SPA（仅营销页预渲染）+ Hono独立后端，API通过显式HTTP调用，无RSC负载，无服务端序列化&lt;br /&gt;7. &lt;b&gt;安全设计原则&lt;/b&gt;：认证授权在API层强制执行，前端中间件只做UX跳转，CORS/CSRF/验证码/限流全部在可控的后端实现，与渲染框架彻底解耦&lt;br /&gt;8. &lt;b&gt;核心收获&lt;/b&gt;：架构清晰可指认、无序列化税、前端攻击面趋近于零、后端语言自由选型、依赖更少爆炸半径更小——&quot;无聊&quot;在软件工程里是赞美&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p&quot;&gt;https://dev.to/zulikram/why-i-walked-back-from-nextjs-and-rsc-to-a-plain-spa-and-a-separate-backend-4k8p&lt;/a&gt;</content:encoded></item><item><title>《TanStack中的React服务端组件》</title><link>https://channel.meo-ai.com/posts/636</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/636</guid><pubDate>Wed, 20 May 2026 23:43:43 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TanStack中的React服务端组件》&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_Server_Components&quot; title=&quot;#React_Server_Components&quot;&gt;#React_Server_Components&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack_Start&quot; title=&quot;#TanStack_Start&quot;&gt;#TanStack_Start&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=%23Bundle_Optimization&quot; title=&quot;#Bundle_Optimization&quot;&gt;#Bundle_Optimization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start实现了与Next.js截然不同的React服务端组件方案，通过显式API将组件渲染保留在服务端，避免将繁重代码发送至客户端。文章以应用外壳为例，展示RSC如何将客户端Bundle从308KB缩减至203KB，并说明其适合大型非交互式组件树的场景，同时澄清RSC并非数据加载或SSR的替代品，而是针对性的性能优化工具。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. RSC是只在服务端运行的React组件，可以直接在组件里写await查数据，而且组件代码不会发送到浏览器，不用担心数据库密码暴露给前端&lt;br /&gt;2. TanStack实现RSC的方式特别直白，通过renderServerComponent这类API就能显式声明，作者认为比Next.js的实现更好懂&lt;br /&gt;3. 别误会，RSC不是用来替代数据加载或SSR的，TanStack的loader和原有的服务端渲染已经做得很好了，RSC真正的价值是帮浏览器&quot;减肥&quot;&lt;br /&gt;4. 文章举了个生动的例子：故意引入整个图标库来模拟大型组件树，结果RSC把客户端JS从308KB砍到了203KB，省了不少流量&lt;br /&gt;5. 更妙的是RSC还能接收客户端组件当&quot;插槽&quot;传进来，配合Suspense实现流式渲染，让页面边加载边呈现，体验很丝滑&lt;br /&gt;6. 不过作者也提醒，RSC不是银弹，如果你的组件树不大、依赖不多，用它带来的收益可能微乎其微，得看场景取舍&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://frontendmasters.com/blog/react-server-components-in-tanstack/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://frontendmasters.com/blog/react-server-components-in-tanstack/&quot;&gt;https://frontendmasters.com/blog/react-server-components-in-tanstack/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://frontendmasters.com/blog/react-server-components-in-tanstack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;This post is about React Server Components (or RSC) in TanStack Start. The implementation is radically different, and in my opinion, better than the RSC implementation you’ve likely seen in Next.js.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Frontend Masters&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;React Server Components in TanStack&quot; src=&quot;/static/https://cdn4.telesco.pe/file/m1SWDG4eNI3zo5DWGvvpwHAqaR5dJaqpFfkb0QMP3mx8b2aWSytphloQUUHun9jb9M8pwvQi_VVMtdXB-8rKX3Z1G11jx6HI0lso3dTK8uHisnfWhOjTsxEuMZFONZWlLgQKCln5satRGo2QmOupH8zKf1tJjZmRajcGNGJ5RrVBnyR8dWxa2HqYsRyWz70Bcyo7zquRetf7HTnpF7Yqx3MEmzw2zUnMlhn2m8Q-08cnNeKJ9tMX7GE9eFcinvzKIY9K4mTyr1qVMMracH5h0DOj_RTcJfrvehT8vfTJGR8KUgkI7E-A2qG3k1U-Ur3e5bq0nHdVvIreHFmwymf85A.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 Server Components in &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt;&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;This post is about React Server Components (or RSC) in &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start. The implementation is radically different, and in my opinion, better than the RSC implementation you’ve likely seen in Next.js.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《用TanStack_Start构建博客（上篇）》</title><link>https://channel.meo-ai.com/posts/601</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/601</guid><pubDate>Sat, 18 Apr 2026 08:38:00 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《用TanStack_Start构建博客（上篇）》&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=%23TanStack_Start&quot; title=&quot;#TanStack_Start&quot;&gt;#TanStack_Start&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack_Router&quot; title=&quot;#TanStack_Router&quot;&gt;#TanStack_Router&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Server_Functions&quot; title=&quot;#Server_Functions&quot;&gt;#Server_Functions&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9D%99%E6%80%81%E9%A2%84%E6%B8%B2%E6%9F%93&quot; title=&quot;#静态预渲染&quot;&gt;#静态预渲染&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Markdown%E5%8D%9A%E5%AE%A2&quot; title=&quot;#Markdown博客&quot;&gt;#Markdown博客&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E9%AB%98%E4%BA%AE&quot; title=&quot;#代码高亮&quot;&gt;#代码高亮&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文通过实战案例演示如何使用 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 框架构建一个 Markdown 博客系统。文章重点介绍了 Server Functions 解决同构加载器无法访问文件系统的问题、动态路由参数处理、以及使用 markdown-it 和 Shiki 实现带行号的高亮代码块，为开发者提供了完整的技术实现路径。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 是基于 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Router 的轻量级服务端框架，支持 SSR、API 端点和 Server Functions&lt;br /&gt;- 使用 &lt;code&gt;import.meta.glob&lt;/code&gt; 动态扫描 Markdown 文件，配合 &lt;code&gt;gray-matter&lt;/code&gt; 解析文章元数据&lt;br /&gt;- Server Functions 是同构应用的关键——无论 loader 在服务端还是客户端运行，都能保证文件读取逻辑始终在服务端执行&lt;br /&gt;- 动态路由通过 &lt;code&gt;$slug.tsx&lt;/code&gt; 文件命名实现，配合 &lt;code&gt;createFileRoute&lt;/code&gt; 和 &lt;code&gt;head&lt;/code&gt; 函数设置页面标题&lt;br /&gt;- 使用 markdown-it + Shiki 实现代码高亮，通过自定义 transformer 支持 &lt;code&gt;line-numbers&lt;/code&gt; 语法标记，结合 CSS counter 渲染行号&lt;br /&gt;- 文章预告下篇将介绍静态生成和部署策略&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/&quot;&gt;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TanStack Start is one of the newest web frameworks, and its popularity is rising quickly. Start is a thin server-side layer that sits atop TanStack Router and provides features like server functions, API endpoints, and server-side rendering. I wrote a three…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Frontend Masters&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Building a Blog in TanStack (Part 1 of 2)&quot; src=&quot;/static/https://cdn4.telesco.pe/file/SdcbHy_4OJWiubsSxzCgJ8NcIYv3G7kH2N2jNrB8t3TbMqiok_ID_AkaDmpPliaU4mXl1YiJIt3X3zT5g_gp8XQIkHth8B2EEC2I6G6apJbHqmdP2u2Iq-PnmtOwfh1fZkB1rppS9zlgzO9GOVVvwO0zRR2yAlmLqAU9C7EOxHZhSNDPt17w8I2KFUxv3OSj56leWB3dwsNJFepmI9N7zNXorIyCzBwmT7GCZHtrwEnltgmCDIt4nT8mhUDinBDAZx9s5sWD59uA5puezmNjeqKksJ_7mhc2d6iqHJLkaLTwRw1kfBYYT_nZECaijRBLRkP0cOM2iq8MiPqUgxhZeg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Building a Blog in &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; (Part 1 of 2)&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;&lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start is one of the newest web frameworks, and its popularity is rising quickly. Start is a thin server-side layer that sits atop &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Router and provides features like server functions, API endpoints, and server-side rendering. I wrote a three…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>TypeScript 泛型趣味实践</title><link>https://channel.meo-ai.com/posts/560</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/560</guid><pubDate>Thu, 19 Feb 2026 16:47:31 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;TypeScript 泛型趣味实践&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B3%9B%E5%9E%8B&quot; title=&quot;#泛型&quot;&gt;#泛型&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%87%BD%E6%95%B0%E9%87%8D%E8%BD%BD&quot; title=&quot;#函数重载&quot;&gt;#函数重载&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack&quot; title=&quot;#TanStack&quot;&gt;#TanStack&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%9D%A1%E4%BB%B6%E7%B1%BB%E5%9E%8B&quot; title=&quot;#条件类型&quot;&gt;#条件类型&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;文章深入探讨了如何利用 TypeScript 泛型、条件类型和函数重载，为 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 的 Server Function 构建一个完全类型安全的查询选项封装函数。通过一个真实的场景——确保带参数和不带参数的 Server Function 都能被正确推断返回类型和参数类型——展示了从基础泛型约束到复杂类型体操的完整实现路径，最终解决了可选参数与类型推断的冲突问题。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- 通过为 &lt;mark class=&quot;highlight&quot;&gt;TanStack&lt;/mark&gt; Start 的 Server Function 封装 &lt;code&gt;refetchedQueryOptions&lt;/code&gt; 工具函数，解决查询数据返回类型为 &lt;code&gt;any&lt;/code&gt; 的类型安全问题&lt;br /&gt;- 初始方案使用泛型约束 &lt;code&gt;&amp;lt;T extends (arg: { data: any }) =&amp;gt; Promise&amp;lt;any&amp;gt;&amp;gt;&lt;/code&gt; 提取参数和返回类型，但无法处理无参函数的可选参数场景&lt;br /&gt;- 利用条件类型 &lt;code&gt;infer&lt;/code&gt; 关键字创建类型工具 &lt;code&gt;ServerFnArgs&lt;/code&gt; 来提取函数参数类型，并判断函数是否有参数&lt;br /&gt;- 通过 TypeScript 函数重载（Overloading）定义两个签名：一个用于带参数的 Server Function，一个用于无参函数，从而精确控制参数的可选性&lt;br /&gt;- 展示了泛型、条件类型与函数重载结合使用的高级技巧，实现编译时严格的类型检查和完美的类型推断&lt;br /&gt;&lt;br /&gt;链接：&lt;a href=&quot;https://frontendmasters.com/blog/fun-with-typescript-generics/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://frontendmasters.com/blog/fun-with-typescript-generics/&quot;&gt;https://frontendmasters.com/blog/fun-with-typescript-generics/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://frontendmasters.com/blog/fun-with-typescript-generics&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Generics are an incredibly powerful feature of TypeScript. There’s endless content on TypeScript in general, and generics in particular. This post will differ a bit and cover things more deeply.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Frontend Masters&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Fun with TypeScript Generics&quot; src=&quot;/static/https://cdn4.telesco.pe/file/XjKsqASVIPZubaS1SRvhWI-aVKLZ1mrqRpsKq2Bca4mqyvd3fKXLprre6_AAHD8S49QxR3G7g5BMm29-PlLOpTWo2nafclL0xMrKOjGOAOteQdWWcGB4LCZ_cwQUHf_Hn4bFaC5iOtnK8n7N9QT1Q1nxEGHdZ_OsYf5sJGn8dvF36MakPu2AUAJM--na1AElfo3fLwD5POgFzT009gC6Ua0rMP6_Aqe7VSPQ2HwPWg66rlZWRq-LTsVhbvLAY0NIDcgp2PQUPMP5dLRYR4VS0_7EAZPbkE0ohMNBRkbXOAQDkeuQ5pMdqseQkQVSI2TKp8DIIjmveza-6p3k4EsTjA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Fun with TypeScript Generics&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Generics are an incredibly powerful feature of TypeScript. There’s endless content on TypeScript in general, and generics in particular. This post will differ a bit and cover things more deeply.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>