<?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>《开源健身数据集：1324条多语言结构化运动数据与开发者脚手架》</title><link>https://channel.meo-ai.com/posts/675</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/675</guid><pubDate>Mon, 13 Jul 2026 06:04:17 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《开源健身数据集：1324条多语言结构化运动数据与开发者脚手架》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6&quot; title=&quot;#数据科学&quot;&gt;#数据科学&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%81%A5%E8%BA%AB&quot; title=&quot;#健身&quot;&gt;#健身&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90%E6%95%B0%E6%8D%AE%E9%9B%86&quot; title=&quot;#开源数据集&quot;&gt;#开源数据集&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%A4%9A%E8%AF%AD%E8%A8%80&quot; title=&quot;#多语言&quot;&gt;#多语言&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7&quot; title=&quot;#开发者工具&quot;&gt;#开发者工具&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这是一个面向开发者的健身运动结构化数据集，收录1324条运动记录，涵盖部位、器械、目标肌群等元数据，并提供英语、西班牙语、意大利语、土耳其语、俄语和中文六种语言的步骤说明。仓库还附带开箱即用的交互式浏览器和开发者配置向导（含SQL建表、API代码模板、LLM提示词），可快速搭建健身类应用后端。运动媒体文件（图片/GIF）因版权争议未包含，仅保留原始媒体ID引用。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 数据规模很扎实：一共1324条运动记录，覆盖从手臂、腿部到背部、核心等10个身体部位，器械类型也多达12种，其中约25%是自重训练，居家健身App也能直接用&lt;br /&gt;2. 多语言支持很贴心：每条运动都配了英、西、意、土、俄、中六种语言的步骤说明，做国际化健身产品不用自己翻译了&lt;br /&gt;3. 开发者体验拉满：仓库里塞了一个纯前端的运动浏览器（index.html）和一个配置向导（setup.html），能直接生成SQL建表语句、多语言API调用代码，还能一键复制LLM提示词让AI帮你搭后端&lt;br /&gt;4. 版权处理很谨慎：图片和GIF动画因为存在多方权属争议，仓库里故意没打包，只留了media_id，需要的话可以通过原始CDN地址自行获取，避免法律风险&lt;br /&gt;5. 数据结构很规范：JSON格式，字段包含ID、名称、部位、器械、目标肌群、协同肌群、六语说明、媒体引用等，还提供了TypeScript类型定义，类型安全直接拿捏&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/hasaneyldrm/exercises-dataset&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/hasaneyldrm/exercises-dataset&quot;&gt;https://github.com/hasaneyldrm/exercises-dataset&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/hasaneyldrm/exercises-dataset&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;1,324-exercise fitness dataset — animation GIFs, 180×180 thumbnails, muscle-group &amp;amp; equipment data, and step-by-step instructions in 6 languages. The exercise data layer behind the LogPress...&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 - hasaneyldrm/exercises-dataset: 1,324-exercise fitness dataset — animation GIFs, 180×180 thumbnails, muscle-group &amp;amp; equipment…&quot; src=&quot;/static/https://cdn4.telesco.pe/file/n9rxu4qFJCQrBzWiw9vJEttIpNmmhYuRvzhByUsBjNjjB3mcdS3iSauUcrHYRVRXLglPJJ9_8OR-bK0esD8L-CNWNBwn1p9CeuyPINTSvBjGB9IuNrHzi5KYOA69xOwUwGfMtD1LfQ_bGN8lh3ptjSwDQr30BgwaWvKp2VBf68rPFphYtRhGRSz_CWYXBRud72vXWVFUcG81fjOVumOgbyk1k9Ncs9NDVosjJFymkE_DqiET0AhDyaxI7x_WOaqFQ3X0d9twvu3-HANBLG_JKT0rzKkw-R3KChxLrLWNkIeJwQ9cGjPKYJ5ytzySdKpUelxv2eL59pDrUUOB-uVg1w.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 - hasaneyldrm/exercises-dataset: 1,324-exercise fitness dataset — animation GIFs, 180×180 thumbnails, muscle-group &amp;amp; equipment…&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;1,324-exercise fitness dataset — animation GIFs, 180×180 thumbnails, muscle-group &amp;amp; equipment data, and step-by-step instructions in 6 languages. The exercise data layer behind the LogPress...&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>《利用浏览器Canvas进行数据压缩》</title><link>https://channel.meo-ai.com/posts/565</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/565</guid><pubDate>Fri, 27 Feb 2026 02:29:12 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《利用浏览器Canvas进行数据压缩》&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=%23JavaScript&quot; title=&quot;#JavaScript&quot;&gt;#JavaScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CanvasAPI&quot; title=&quot;#CanvasAPI&quot;&gt;#CanvasAPI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9&quot; title=&quot;#数据压缩&quot;&gt;#数据压缩&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23PNG%E7%BC%96%E7%A0%81&quot; title=&quot;#PNG编码&quot;&gt;#PNG编码&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7&quot; title=&quot;#浏览器兼容性&quot;&gt;#浏览器兼容性&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SPA&quot; title=&quot;#SPA&quot;&gt;#SPA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：本文介绍了一种利用浏览器Canvas API将任意数据压缩为PNG图像格式的技术方案。通过将字节数据编码为像素颜色值并生成PNG图像，可以间接调用浏览器内置的压缩算法，实现无需外部依赖的数据压缩。该方法特别适用于需要在旧版浏览器中压缩数据、或需要将SPA状态序列化到URL中的场景，提供了Compression Streams API不可用时的替代方案。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- 背景需求：在静态网站和SPA中，有时需要将状态数据序列化到URL hash中，因此需要前端数据压缩方案；虽然2023年5月后Compression Streams API已普及，但旧版浏览器仍需替代方案&lt;br /&gt;- 核心原理：浏览器内置了优化的压缩库用于HTTP请求和图片处理，通过将数据编码为PNG像素数据，可间接利用浏览器的无损压缩能力&lt;br /&gt;- 技术实现：将Uint8Array数据按RGB通道编码到Canvas像素中（首字节存储最后一像素的有效字节数），Alpha通道固定为255以确保跨浏览器一致性，最终通过toDataURL(&quot;image/png&quot;)获取base64编码的压缩数据&lt;br /&gt;- 解压流程：异步加载生成的PNG图片，读取像素数据后过滤Alpha通道，根据首字节指示的有效长度提取原始字节数据&lt;br /&gt;- 方案特点：即使考虑PNG格式开销，压缩后的数据通常仍小于原始数据；完全基于浏览器原生API，无需外部库依赖&lt;br /&gt;- 应用场景：旧浏览器兼容性支持、URL状态序列化、纯前端数据压缩需求&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://jstrieb.github.io/posts/canvas-compress/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://jstrieb.github.io/posts/canvas-compress/&quot;&gt;https://jstrieb.github.io/posts/canvas-compress/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://jstrieb.github.io/posts/canvas-compress&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Old browsers don’t have JavaScript compression APIs, so we store data in pixel color channels and export to PNG to compress data.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;jstrieb.github.io&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Using the Browser’s &amp;lt;canvas&amp;gt; for Data Compression&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Old browsers don’t have JavaScript compression APIs, so we store data in pixel color channels and export to PNG to compress data.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>