<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>数据可视化 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《Microcharts：一句话里就能塞下的React微图表库》</title><link>https://channel.meo-ai.com/posts/688</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/688</guid><pubDate>Sat, 01 Aug 2026 09:20:15 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Microcharts：一句话里就能塞下的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&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96&quot; title=&quot;#数据可视化&quot;&gt;#数据可视化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%9B%BE%E8%A1%A8%E5%BA%93&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=%23%E6%97%A0%E9%9A%9C%E7%A2%8D&quot; title=&quot;#无障碍&quot;&gt;#无障碍&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ServerComponents&quot; title=&quot;#ServerComponents&quot;&gt;#ServerComponents&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Microcharts是一个专为React设计的微图表库，提供106种图表类型，单个图表gzip后仅2.18-7KB（中位数5.25KB），零依赖。它主打&quot;词级图表&quot;理念——图表小到可以嵌入句子、表格单元格和KPI卡片中，无需坐标轴和图例，由上下文文字承载含义。支持服务端组件静态渲染（0KB客户端JS）、自动生成无障碍alt文本、单色系主题系统，并能在错误数据下优雅降级。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 小到离谱：中位数图表仅5.25KB gzip，最大7KB，零运行时依赖，React只是peer dependency，比通用图表库（如Recharts 106KB共享内核）轻了整整101KB&lt;br /&gt;2. 一句话装得下：图表设计为&quot;词级尺寸&quot;，可以直接嵌入正文、表格单元格、KPI卡片甚至打印报告，读者不用离开句子就能理解数字&lt;br /&gt;3. 106种图表统一API：传一个data数组就搞定，domain、color、title在每个图表里含义一致，TypeScript类型完备，编辑器能自动补全&lt;br /&gt;4. 静态渲染零负担：在Server Component里渲染时完全不产生客户端JS，hydrate成本为0，对性能敏感场景极其友好&lt;br /&gt;5. 坏数据也能优雅处理：NaN、空数组、单一数值都不会报错，会自动渲染成点、空白或水平线，不用写try/catch兜底&lt;br /&gt;6. 无障碍开箱即用：自动生成alt文本（如&quot;趋势上升27%，范围128到163&quot;），每个图表一个tab焦点，支持方向键浏览，色盲安全配色和RTL都内置&lt;br /&gt;7. 单色系主题系统：给一个accent主色就能自动推导出完整配色（包括正负色、分类色、暗色模式），整个页面一键换肤&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://microcharts.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://microcharts.dev/&quot;&gt;https://microcharts.dev/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://microcharts.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Word-sized React charts — tiny sparklines, micro charts &amp;amp; inline SVG trend lines. Zero runtime deps, ~2–7 kB interactive · ~1–4 kB static, accessible by default, RSC-safe. Sit in a sentence, table cell, KPI card, or AI reply.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;microcharts&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;microcharts — Word-sized charts for React.&quot; src=&quot;/static/https://cdn4.telesco.pe/file/HL18sZBYJ6CmXzfv4FiWPiCXLBU9IBJLeT2-o3a8_fvGEka3eFREc06UBbL3YE3_HEyaiShzH4bZ0qgcAuh_QGGoHiZraOY1QiXTwFno5Ts5hgTfpph-wxi5-ETIdnLizAKWXjxaHGFpxsh-8a1bFrHytH-9_TQ5P9xB_cIvzokDamofEFCg03eK-Ay8zVNrTmNZCWZ9RH2Z7cTaFvsakImItcQNQGMWvUauWUBqEshnp2TubuiPUebSqvV77UQxPcsA8NhOzgld7JB-GmY4ibFVO9zd6hEgaLwrfS3MtyAbJ7gjM9XUdmHQiqU5-rX1thQU1laoQaLMSvc087RLTw.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;microcharts — Word-sized charts for React.&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Word-sized React charts — tiny sparklines, micro charts &amp;amp; inline SVG trend lines. Zero runtime deps, ~2–7 kB interactive · ~1–4 kB static, accessible by default, RSC-safe. Sit in a sentence, table cell, KPI card, or AI reply.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><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><item><title>《Datatype：用字体把文字变成图表的魔法》</title><link>https://channel.meo-ai.com/posts/619</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/619</guid><pubDate>Thu, 30 Apr 2026 07:32:52 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Datatype：用字体把文字变成图表的魔法》&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=%23OpenType&quot; title=&quot;#OpenType&quot;&gt;#OpenType&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%8F%AF%E5%8F%98%E5%AD%97%E4%BD%93&quot; title=&quot;#可变字体&quot;&gt;#可变字体&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96&quot; title=&quot;#数据可视化&quot;&gt;#数据可视化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AD%97%E4%BD%93%E8%AE%BE%E8%AE%A1&quot; title=&quot;#字体设计&quot;&gt;#字体设计&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;Datatype 是一款开源可变字体，利用 OpenType 连字替换技术，将纯文本表达式（如 &lt;code&gt;{b:30,70,50,90}`）实时渲染为条形图、折线图和饼图，无需任何 JavaScript 或图片资源。它通过 CSS 的 `font-variation-settings&lt;/code&gt; 控制字宽和字重，WOFF2 仅 73KB，兼容所有现代浏览器，为网页和桌面应用提供了一种零依赖、高性能的轻量级数据可视化方案。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;- **纯字体驱动，零 JS 依赖**：利用 OpenType 的 &lt;code&gt;calt`（上下文替换）和 `liga`（标准连字）特性，把 &lt;/code&gt;{b:1,3,7}` 这类文本直接变成条形图，不需要加载任何图表库或图片&lt;br /&gt;- **三种图表，一句话搞定**：支持条形图 &lt;code&gt;{b:...}`、折线图 &lt;/code&gt;{l:...}&lt;code&gt; 和饼图 &lt;/code&gt;{p:...}`，每种最多支持 20 个数据点，数值范围 0–100，语法简单得像在聊天&lt;br /&gt;- **可变字体，随意调节**：通过 `wdth`（字宽 50–150）和 `wght`（字重 100–900）两个轴，可以像调音量一样控制图表的间距和线条粗细，适配不同排版场景&lt;br /&gt;- **轻到不可思议**：WOFF2 格式仅 73KB，TTF 4MB，覆盖 Google Fonts Latin Core 字符集，对网页性能几乎零负担&lt;br /&gt;- **开箱即用，跨平台友好**：Web 端一行 `&lt;a href=&quot;https://t.me/font&quot; target=&quot;_blank&quot; title=&quot;@font&quot;&gt;@font&lt;/a&gt;-face` 即可；桌面端安装 TTF 后，在 Adobe 等支持 OpenType 连字的软件里直接粘贴文本就能出图&lt;br /&gt;- **开源可定制**：基于 Python + fontTools 构建，提供完整的构建脚本和开发服务器，方便开发者二次修改或扩展新的图表类型&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://github.com/franktisellano/datatype&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/franktisellano/datatype&quot;&gt;https://github.com/franktisellano/datatype&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/franktisellano/datatype&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Datatype is a variable font that turns text into charts. - franktisellano/datatype&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;GitHub&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;GitHub - franktisellano/datatype: Datatype is a variable font that turns text into charts.&quot; src=&quot;/static/https://cdn4.telesco.pe/file/LX9OoJtVUqxgEkIhAo9DueKezUMtxM7LxHgtR14vZR0OMMvmgS17fJaq_JMa7V92BwhL5GufSzQuvRXrCF-Q7UXwOMCheeXghonWfj1IlpFmJGHQ0VcC1RZPqPgmrIuhtGcqYUGjD2O0662Ko4n-A5TNTKeK00KTxua3q9vjGXYjkhMyi9YSII-3R20d4WrP_tlIuK-OjCrjvsLHqCnDYZfjk-ph1Aolvq7SOsFZrC_EsqCTzN4IFOVH54nBCwkxQNbhCH4HBfz_kuAQZtSwnH6g6HkTJNAaNhBK_jm1919alkvGUWJILGL-ndrtdStGsKJwCncKKR7th_ltsrPb5A.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;GitHub - franktisellano/datatype: Datatype is a variable font that turns text into charts.&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Datatype is a variable font that turns text into charts. - franktisellano/datatype&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>