<?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>《程序员的音乐理论：从零推导乐理系统》</title><link>https://channel.meo-ai.com/posts/698</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/698</guid><pubDate>Fri, 28 Aug 2026 01:06:54 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《程序员的音乐理论：从零推导乐理系统》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E9%9F%B3%E4%B9%90%E7%90%86%E8%AE%BA&quot; title=&quot;#音乐理论&quot;&gt;#音乐理论&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BC%96%E7%A8%8B&quot; title=&quot;#编程&quot;&gt;#编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web_Audio_API&quot; title=&quot;#Web_Audio_API&quot;&gt;#Web_Audio_API&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%A3%B0%E5%AD%A6%E7%89%A9%E7%90%86&quot; title=&quot;#声学物理&quot;&gt;#声学物理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E5%AD%A6%E5%8E%9F%E7%90%86&quot; title=&quot;#数学原理&quot;&gt;#数学原理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6&quot; title=&quot;#计算机科学&quot;&gt;#计算机科学&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文从物理和算术的第一性原理出发，用 JavaScript 代码逐步推导出整个西方音乐理论体系。作者不依赖记忆，而是通过编程和听觉验证，解释了为什么音乐有十二个音、为什么大调音阶是那个形状、为什么和弦听起来和谐，以及乐谱本质上是一种序列化格式。核心洞察是：音乐理论并非 arbitrary 的约定，而是物理（泛音列）和数学（简单整数比）的自然结果。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 声音的本质是随时间变化的数字 — 音频就是每秒 44,000 次描述扬声器位置的数字列表，频率即音高，440Hz 只是人为约定的基准。&lt;br /&gt;&lt;br /&gt;2. 音色来自你没要求的频率 — 任何乐器发出的都不是单一频率，而是基频的整数倍（泛音列）。不同波形（正弦、三角、方波、锯齿波）本质上是泛音配方的差异，这解释了为什么小提琴和小号音色不同。&lt;br /&gt;&lt;br /&gt;3. 八度是频率翻倍，音高是乘法关系 — 220Hz、440Hz、880Hz 听起来是&quot;同一个音&quot;，因为高八度的所有泛音都包含在低八度的泛音列中。因此整个音高问题简化为&quot;如何把倍频区间分割&quot;。&lt;br /&gt;&lt;br /&gt;4. 简单整数比听起来和谐 — 2:1（八度）、3:2（五度）、4:3（四度）、5:4（大三度）听起来协和，是因为它们的泛音列有大量重叠；而复杂比例（如 √2）产生拍频和粗糙感。协和的本质是耳朵能快速找到重复模式。&lt;br /&gt;&lt;br /&gt;5. 十二音律是数学妥协 — 纯五度（3:2）叠 12 次不等于 7 个八度（2^7），这个无法修复的误差叫&quot;毕达哥拉斯音差&quot;。现代十二平均律将八度均分为 12 份（每份是 2 的 12 次方根），虽然除了八度都不纯，但让所有调都能用。12 之所以被选中，是因为它是第一个能把五度误差控制在约 0.1% 以内的数字。&lt;br /&gt;&lt;br /&gt;6. 音阶是间隔数组 — 大调音阶 &lt;code&gt;[2,2,1,2,2,2,1]&lt;/code&gt; 只是一个七元素数组，加起来为 12。自然小调是它的旋转（从第 5 位开始），七种调式则是同一数组的 7 种循环移位，这让作者感叹&quot;音乐理论终于不再像 arbitrary 的 trivia&quot;。&lt;br /&gt;&lt;br /&gt;7. 和弦是隔一个音取的堆叠 — 三和弦 &lt;code&gt;[0,2,4]&lt;/code&gt; 取音阶中每隔一个的音，大三和弦 &lt;code&gt;[0,4,7]&lt;/code&gt; 与小三和弦 &lt;code&gt;[0,3,7]&lt;/code&gt; 只差一个半音，却代表了西方音乐两大情感极。七和弦加入第四个音后，音乐开始从&quot;圣咏&quot;变成&quot;爵士&quot;。&lt;br /&gt;&lt;br /&gt;8. 调内七和弦是自然涌现的 — 在一个大调音阶上，从七个音级分别构建三和弦，会自动得到：I（大三）、ii（小三）、iii（小三）、IV（大三）、V（大三）、vi（小三）、vii°（减三）。罗马数字标记是相对寻址，移调只需加一个常数。&lt;br /&gt;&lt;br /&gt;9. 张力与解决有物理基础 — V7 → I 是最强的解决感，因为 V 和弦中的 B（导音）距 I 的根音只差半音，且 V7 包含三全音（B-F，√2 比例，最不稳定），这两个音分别向相反方向移动半音到达稳定位置。&lt;br /&gt;&lt;br /&gt;10. 乐谱是带 header 的序列化格式 — 五线谱本质是针对&quot;实时阅读、手在忙&quot;场景优化的数据格式：纵轴是音阶度数（非线性频率），谱号定义坐标原点，升降号是 escape hatch，调号是 DRY 原则（常量提升），时值是 2 的负幂次，附点是二进制分数，速度（BPM）把拍子映射到秒。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://runjs.app/blog/music-theory-for-programmers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://runjs.app/blog/music-theory-for-programmers&quot;&gt;https://runjs.app/blog/music-theory-for-programmers&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://runjs.app/blog/music-theory-for-programmers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;I can&apos;t play an instrument, so I worked out music theory in JavaScript instead. Twelve notes, scales and chords, derived from scratch with code you can hear.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;runjs.app&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Music theory for programmers&quot; src=&quot;/static/https://cdn4.telesco.pe/file/dz3NPuInGrWEmApN3KKN_MaOP3khOyacifcUMswzUC7pgERZA2FU9-r7vpId2Rf-sF7oJ_9ENjatb8QujcJ-Eu3WBAxtAwkP_MX608NTVhN8UttioivjykfLBd5c9WyXZq7dV_JP_V3QIrwr_F3h5_aDd0fl64tZoZO2zcEmr8peXKCpyrIfZxb-p6K1GJEd8un4PIWHv4I6GPt1xjV2DTZGgglqseEfn7RsRBZtUDb0rKgHTqZoOGVbt3c4Y9fyaK4bHfXIJ_GtGXF-ikso_n9GZ_v2810vgnFTfOtMInzWPI9k_FlnA4Wchkzu770icuJCTvNs2KU2bZeyCCUJcQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Music theory for programmers&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;I can&apos;t play an instrument, so I worked out music theory in JavaScript instead. Twelve notes, scales and chords, derived from scratch with code you can hear.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《hucre：零依赖的电子表格引擎》</title><link>https://channel.meo-ai.com/posts/693</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/693</guid><pubDate>Sat, 15 Aug 2026 13:03:55 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《hucre：零依赖的电子表格引擎》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&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=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%94%B5%E5%AD%90%E8%A1%A8%E6%A0%BC&quot; title=&quot;#电子表格&quot;&gt;#电子表格&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Xlsx&quot; title=&quot;#Xlsx&quot;&gt;#Xlsx&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Csv&quot; title=&quot;#Csv&quot;&gt;#Csv&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Ods&quot; title=&quot;#Ods&quot;&gt;#Ods&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E8%BD%AC%E6%8D%A2&quot; title=&quot;#数据转换&quot;&gt;#数据转换&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9B%B6%E4%BE%9D%E8%B5%96&quot; title=&quot;#零依赖&quot;&gt;#零依赖&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%81%E5%BC%8F%E5%A4%84%E7%90%86&quot; title=&quot;#流式处理&quot;&gt;#流式处理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81&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%E8%AE%BF%E9%97%AE&quot; title=&quot;#无障碍访问&quot;&gt;#无障碍访问&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 核心定位：一个纯 TypeScript 编写的零依赖电子表格引擎，支持读写 XLSX、CSV、ODS、JSON、NDJSON、XML、HTML 等多种格式，可在 Node.js、Deno、Bun、浏览器、Cloudflare Workers 等任意平台运行&lt;br /&gt;2. 极致轻量：完全支持 Tree Shaking，按需导入，CSV 模块仅 3.7KB gzip，完整库 129KB gzip，远小于 SheetJS（300KB）和 ExcelJS（500KB）&lt;br /&gt;3. 多格式统一 API：通过 &lt;code&gt;read()&lt;/code&gt; 自动检测格式，&lt;code&gt;write()&lt;/code&gt; 支持 9 种输出格式（XLSX、ODS、CSV、TSV、JSON、NDJSON、XML、HTML、Markdown），大幅降低多格式处理的心智负担&lt;br /&gt;4. 流式处理：支持 XLSX、CSV、NDJSON、ODS、XML 的流式读写，可处理百万级数据而不爆内存；300万行 XLSX 流式写入峰值内存仅 70MB，而增量写入器需要 1GB+&lt;br /&gt;5. 功能全面：支持单元格样式、条件格式（13 种）、数据验证、超链接、图片（含 SVG）、图表（柱状/折线/饼图等）、数据透视表、迷你图、冻结窗格、密码保护、Excel 2024 原生复选框、模板引擎等&lt;br /&gt;6. 往返保真：&lt;code&gt;openXlsx&lt;/code&gt;/&lt;code&gt;saveXlsx&lt;/code&gt; 路径可保留图表、VBA 宏、切片器、时间线过滤器等 hucre 不原生建模的部分，实现无损编辑他人文件&lt;br /&gt;7. 数据验证与无障碍：内置 Schema 验证（类型强制、正则、枚举、范围），以及 WCAG 2.1 AA 无障碍审计（对比度检查、缺失替代文本、表头检测等）&lt;br /&gt;8. 遗留格式支持：可读取 XLS（Excel 97-2003）和 XLSB（二进制 Excel）文件，自动检测格式&lt;br /&gt;9. 开发体验友好：提供 Builder API 链式调用、对象简写读写（&lt;code&gt;readObjects&lt;/code&gt;/&lt;code&gt;writeObjects&lt;/code&gt;）、CLI 工具（格式转换、检查、验证）、单元格工具函数（行列转换、范围解析）&lt;br /&gt;10. 明确的能力边界：不实现公式计算引擎、不支持 XLS/XLSB 写入、部分高级图表类型（气泡图/雷达图等）仅支持读取和往返、流式 ODS 写入不带样式&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/productdevbook/hucre&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/productdevbook/hucre&quot;&gt;https://github.com/productdevbook/hucre&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/productdevbook/hucre&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere. - productdevbook/hucre&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 - productdevbook/hucre: Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere.&quot; src=&quot;/static/https://cdn4.telesco.pe/file/MJcnXpxpA3YeVtM-Tm5vhddBRePR-Iiy7xQfjh0W5GjjXgCWMvURyaufUW9XrSUFu02S0RODegcGhxzJ8HSISdwFSgv4a3ZhHWQJuOCC0qQuH0EdyatC4ZEy9_nZr6TzfooahohpRRD0QcWrIVL9EWMiCMDY0Cpm3XNUlGuaMc8u5o_98ecZ4Q7GsDla-h9Up2ChebVJ1WQy-Vq7GbaRMHNkCHX5q7_j_U4iwkdmPXJQvtJ1kyKJR7WBdVWyhk8tHITkfV5Xbmqyx6yhd-hXxyunomCEXs7BP3-HQw1s58YG6x6X-G47h9t2AxaRD-TviTPWDoEAMjETvPLU2YOtQA.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 - productdevbook/hucre: Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere.&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Zero-dependency spreadsheet engine. Read &amp;amp; write XLSX, CSV, ODS. Pure TypeScript, works everywhere. - productdevbook/hucre&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><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>《node-html-to-text：HTML转纯文本转换器》</title><link>https://channel.meo-ai.com/posts/627</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/627</guid><pubDate>Fri, 08 May 2026 02:59:05 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《node-html-to-text：HTML转纯文本转换器》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23NodeJS&quot; title=&quot;#NodeJS&quot;&gt;#NodeJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%B7%A5%E5%85%B7%E5%BA%93&quot; title=&quot;#工具库&quot;&gt;#工具库&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HTML%E8%A7%A3%E6%9E%90&quot; title=&quot;#HTML解析&quot;&gt;#HTML解析&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%96%87%E6%9C%AC%E8%BD%AC%E6%8D%A2&quot; title=&quot;#文本转换&quot;&gt;#文本转换&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96&quot; title=&quot;#数据提取&quot;&gt;#数据提取&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%86%85%E5%AE%B9%E5%A4%84%E7%90%86&quot; title=&quot;#内容处理&quot;&gt;#内容处理&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;node-html-to-text 是一款成熟的 Node.js 库，用于将 HTML 文档解析并转换为格式优美的纯文本。它通过类 CSS 的 selectors 机制实现高度灵活的格式化控制，支持表格、链接、列表等复杂结构，并提供 &lt;code&gt;compile&lt;/code&gt; 预编译模式以优化批量处理性能。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- **核心能力**：支持行内/块级标签、表格（含跨行跨列）、链接、自动换行、Unicode 等，能把复杂 HTML 干净地转成可读文本&lt;br /&gt;- **两种使用模式**：`convert()&lt;code&gt; 适合单次转换；`compile()&lt;/code&gt; 预编译配置后批量处理，性能更优，推荐处理大量文档时使用&lt;br /&gt;- **Selectors 驱动配置**：采用类似 CSS 的 selectors 数组来匹配元素并指定格式化方式，支持标签、类名、ID、属性等组合选择，特异性高的规则优先生效&lt;br /&gt;- **丰富的自定义扩展**：可通过 &lt;code&gt;formatters&lt;/code&gt; 注册自定义格式化函数，还能传入 &lt;code&gt;metadata&lt;/code&gt; 让 formatter 访问额外上下文信息，满足特殊业务需求&lt;br /&gt;- **版本演进清晰**：v8 引入 selectors 体系，v9 支持 ESM/CJS 双模式并移除大量废弃选项，v10 要求 Node.js 20.19.0+，API 趋于稳定现代&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://github.com/html-to-text/node-html-to-text&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/html-to-text/node-html-to-text&quot;&gt;https://github.com/html-to-text/node-html-to-text&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/html-to-text/node-html-to-text&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Advanced html to text converter. Contribute to html-to-text/node-html-to-text development by creating an account on GitHub.&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 - html-to-text/node-html-to-text: Advanced html to text converter&quot; src=&quot;/static/https://cdn4.telesco.pe/file/eLbfP41-MLTGRv32Hns1wLtU_vYiIichFyMUIlYA0YwfGHH5-HQjWH4pLvoSRS-a0Cwo7KEkdJhmGAC-DlBaXVougyCl0d_DYfyzyfafSBqUrf7vBDdHIHBi2wCy_NCA6HgnQtbzNREhJpqqXHtxpV0QVVNraVjfN1bjoqbANtMQpWQYUIDAzmnlz-LAGj8bSL1b0J7r7ZztttcH61pmiZC2ijHNri6dTBGu3hTVB3tSK04_PdpJJuxl4Idb2IVeoUNabd36ayNyou2B2iebfyXKOsu_h9jEObNH3EfBqdBxwuXA6XZUHUDrympxcmGSUjszHsl2NlG1C1iV7VR12g.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 - html-to-text/node-html-to-text: Advanced html to text converter&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Advanced html to text converter. Contribute to html-to-text/node-html-to-text development by creating an account on GitHub.&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>