<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>TanStackQuery | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《TanStack Router 与 Query 的最佳实践》</title><link>https://channel.meo-ai.com/posts/647</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/647</guid><pubDate>Fri, 29 May 2026 23:44:47 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TanStack Router 与 Query 的最佳实践》&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&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStackQuery&quot; title=&quot;#TanStackQuery&quot;&gt;#TanStackQuery&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStackRouter&quot; title=&quot;#TanStackRouter&quot;&gt;#TanStackRouter&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96&quot; title=&quot;#数据获取&quot;&gt;#数据获取&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SSR&quot; title=&quot;#SSR&quot;&gt;#SSR&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文详解了 TanStack Router 与 TanStack Query 的集成方案，核心思路是将 Router 的 Loader 视为&quot;预取触发器&quot;，让 Query 接管全局缓存。通过关闭 Router 内置缓存、在 Loader 中预取 Query、组件中使用 useSuspenseQuery 或 useQuery 的组合策略，实现数据尽早获取、避免请求瀑布，同时兼容 SSR 流式渲染。作者强调始终使用 Query Hooks 而非 useLoaderData 获取数据，以维持自动重取、缓存失效和垃圾回收的正常运作。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. Router 自带缓存仅限单路由，Query 缓存全局可跨路由共享，更适合多路由共用数据场景&lt;br /&gt;2. 在 Loader 中预取 Query 能让请求在组件渲染前甚至 JS 加载前就开始，配合 prefetch:&apos;intent&apos; 还能实现悬停预加载&lt;br /&gt;3. 关闭 Router 缓存（defaultPreloadStaleTime: 0）避免与 Query 缓存冲突，让 Query 独掌缓存策略&lt;br /&gt;4. 推荐用 useSuspenseQuery 配合 Router 的默认 Error/Pending 边界，组件只需专注&quot;阳光路径&quot;&lt;br /&gt;5. Loader 中不 await 更灵活：useSuspenseQuery 实现阻塞加载，useQuery 实现延迟加载，由组件自主决定&lt;br /&gt;6. SSR 场景下 useSuspenseQuery 更友好，支持流式渐进渲染；useQuery 需在 Loader 中 await 否则服务端无 markup&lt;br /&gt;7. 切勿用 useLoaderData 替代 Query Hooks，否则会导致自动重取、失效刷新和垃圾回收全部失效&lt;br /&gt;8. 将 Loader 视为&quot;事件处理器&quot;——只负责触发预取、不返回数据，是渐进优化性能的好心智模型&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://tkdodo.eu/blog/tan-stack-router-and-query&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://tkdodo.eu/blog/tan-stack-router-and-query&quot;&gt;https://tkdodo.eu/blog/tan-stack-router-and-query&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://tkdodo.eu/blog/tan-stack-router-and-query&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TanStack Router has a built-in cache, so why would we need TanStack Query? There are, of course, reasons ...&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;tkdodo.eu&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;TanStack Router and Query&quot; src=&quot;/static/https://cdn4.telesco.pe/file/btImzWDCsgmkqJ3KaJOgX-Bea9HEVbTjgGD2m7VH9P3_OJYSOfVsHCNhl8ZmvhLoLfhFHPs6oe89aM1Sf26XGRX4h6PPyhTBKSmcqHEjAHmLCCOrQGOsbjib7hzeVb7zfvX85tL0k7NpAaKMTLpeW2InaBPh1zwjO-XJcYjFFscQw4og0qBKMbbw6r_xd1kYbUooDKQgy2aobNQbxC2Y6oyiRNqjYuoQXygbXYITQLm35ff8C3lHvYfTpCih6PXkV-3bzp1MgVyttjjLC8MwGdmXklMsQ3UOU2KRUN6bK3XrRsKXlT_ivGlSS6mcEokiW3IepbCToSDo_i18-Eqr6g.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;TanStack Router and Query&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;TanStack Router has a built-in cache, so why would we need TanStack Query? There are, of course, reasons ...&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>