Node.js周刊2026W33 | TermDOM终端 UI、pnpm 12 Rust重写、Node.js 26.7.0

TermDOM 用 HTML、CSS 和 DOM 构建终端 UI,Harness 工程把代理带入生产;pnpm 12 Rust 重写进入候选、TanStack Table v9 稳定发布,Node.js 26.7.0 带来全量测试覆盖、FFI 和 SQLite 崩溃修复及 Perfetto tracing 支持。

🔥 头条

TermDOM:用 HTML、CSS 和 DOM 构建终端 UI

终端 UI 现在可以用纯 HTML、CSS 和 DOM 构建——TermDOM 把真正的布局引擎和真正的级联渲染进你的终端,DOM 节点变化时自动重绘。传统 TUI 强迫你钻进带自家布局和事件模型的专用框架,而 Web 开发者恰好已经熟悉这些原语;甚至一个 NERDTree 风格的文件浏览器也只需大约 200 行原生 DOM。这个库展示了突变驱动的绘制、支持整格对齐的 CSS 盒布局,以及任何前端框架或原生 JavaScript 都能驱动交互式 CLI。

将大型 Flow Monorepo 迁移到 TypeScript

Yelp 正在将超过百万行的 Flow monorepo 迁移到 TypeScript,遵循一条铁律:绝不关闭类型检查,也绝不批量插入忽略注释,因为代码一旦失去类型检查器的覆盖就几乎再也无法恢复。这一约束同时排除了一次性大规模重写和代码冻结两条路,迫使采用渐进式迁移——让 Flow 和 TypeScript 在同一仓库中共存,在生产环境中运行,同时不损失类型安全。文章涵盖了 2021 年 Flow 团队转向 Facebook 内部需求后迁移范围的收缩,以及整个过程中如何维持类型完整性。

📖 文章

添加第二个中间件破坏了我们的 TypeScript 类型

两个空操作中间件以任一单个中间件都不会的方式破坏了 TypeScript:向 Inngest 客户端传入第二个中间件后,step.run 的返回类型悄悄塌缩成 {},尽管中间件代码本身什么都没做——仅仅数量就足以破坏类型。每个中间件都会组合一次静态的 Jsonify 输出变换,所以两个就意味着 Jsonify<Jsonify<T>>;运行时序列化已经序列化的数据是无害的空操作,但类型并不像应该的那样幂等,合法的代码失去了全部类型检查。文章跟随作者的侦探式排查,把组合变换追到根因并给出修复。

DeepSeek Harness:DeepSeek 新的 Node 驱动代理框架

DeepSeek 的代理 harness 让每项能力都成为可替换的插件——模型、工具、技能、会话、沙箱、存储,甚至 UI——都能在配置中重新组合,无需触碰源码。大多数代理框架硬编码了自家技术栈,换一个模型提供商或会话后端就意味着 fork 代码库,而当你看不到模型实际看到了什么时,调试一次运行全靠猜。DeepSeek Harness 基于 Cordis 插件内核构建,把每次运行都记录进追加式的会话日志——系统提示、推理、工具调用、子代理调度和上下文注入——并通过 Trajectory 视图在同一个事件流上支持恢复、fork、搜索和回放。

Kitesurf: Cloudflare's Agent-First Browser in V8 Isolates

JavaScript 内部的渐进增强

渐进增强并不止于 HTML 等待 JavaScript——它在 JavaScript 内部同样适用:应用就绪前触发的 drop 事件会让浏览器直接导航离开页面。在 2G 拥堵的列车网络上,作者的文字阅读器从 esm.sh 导入解析器和 highlightjs,一个 600kB 的压缩包,因此处理程序加载完成前拖入文件会被静默当作浏览器的默认“打开文件”操作。文章展示了修复方案——在模块就绪前用 Loading 指示器捕捉用户意图——并通过节流速度下的前后对比视频呈现。

TanStack Table v9:更快、更模块化的基础

经过两年多断断续续的开发,TanStack Table v9 终于稳定发布——这是一次基于 tree-shakable 插件系统和 TanStack Store 驱动的状态管理的大规模重写,应用只需打包自己真正用到的表格功能。重写一个成熟库的内部结构有破坏既有应用依赖的 API 和行为之险,但新架构足够灵活,团队在 beta 期间反而加速了功能增长,而不是停滞在重构上。发布说明详述了新架构、扩展后的功能集,以及 v9 中上线的改进和修复。

🛠 工具

Fastify 6.0 Enters Alpha

unbash:快速零依赖的 Bash 解析库

解析 Bash——一种以抗拒静态分析著称的语言——不需要执行,也不需要依赖,这个 TypeScript 解析器返回带类型和源码位置的 AST。Shell 工具通常要么执行脚本(有风险),要么用正则猜测结构,而 Bash 的嵌套替换、heredoc 和花括号展开经常击溃朴素的解析器,尤其面对畸形或不完整的输入时。unbash 覆盖命令、控制流、管道、重定向、赋值和嵌套替换,提供尽力而为的局部 AST 和带源码位置的错误检测,让使用者无需运行脚本就能安全地检查 shell 结构。

Drizzle 中不引入第二套系统的全文搜索

Drizzle 现在无需另起一套系统就能搜索 Postgres——官方 ParadeDB 集成把全文搜索、pgvector 检索和聚合都运行在与应用数据同一个数据库上。搜索技术栈通常被迫接一个独立引擎外加一条脆弱的同步管道,而 pg_search 扩展把查询留在你的行数据所在的地方。该集成新增了一流索引管理和完整的 ParadeDB API,示例覆盖混合搜索(RRF)、分面搜索、自动补全和 RAG。

njsscan 1.0:面向 Node 的语义感知 SAST 工具

扫描一个 Node.js 文件会浮现 160 条 semantic-grep 发现,却只有 1 条模式匹配。纯正则 SAST 会漏掉依赖上下文的缺陷,比如 njsscan 在 OWASP A1/CWE-79 下标记的 express_xss 注入,而单纯的朴素模式匹配又几乎碰不到现代 Node.js 代码。njsscan 把 libsast 的轻量模式匹配器与 semgrep 的语法感知语义搜索结合,文章介绍了它的即插即用 CLI 用法,以及包括 SARIF、SonarQube、DefectDojo、GitLab SAST 和 HTML 报告在内的 CI 就绪输出。

Hucre 1.0:零依赖的电子表格引擎

一个零依赖的电子表格引擎在最小 2KB gzip 的 tree-shakable 包中读写 XLSX、CSV、ODS、JSON 和 XML——SheetJS CE、ExcelJS 和 xlsx-js-style 等对手要带 300-500KB。事实标准的 SheetJS CE 甚至把自己从 npm 撤下,迫使 CDN tarball 安装,并把样式、图片和条件格式化锁在付费 Pro 档之后。Hucre 的并排对比展示了免费档提供的一切:原生 ESM、CSP 合规、流式处理、往返保真、边缘运行时支持和 13 种条件格式化类型。

devalue 5.9

JSON.stringify 遇到循环引用会抛错、丢弃 promise,而 devalue 两者都能序列化——且输出比 JSON 本身更紧凑。把服务端渲染的状态送进浏览器意味着要携带 JSON 无法表示的值,用 eval 复活它们会撕开 XSS 漏洞,手工解决方案又让每次页面加载膨胀。文章介绍了 devalue 的双 API——uneval 生成最紧凑的可执行代码,stringify/parse 提供安全的复活——外加面向 promise 密集载荷的 stringifyAsync,以及只复活更大 JSON 文档中某一小块的 unflatten。

Svelte Select 6.0

Svelte Select 6.0 要求 Svelte 5,并在 runes 之上重建自身——传统的 createEventDispatcher 事件接线变成普通回调 props,命名 slot 变成 snippet props。升级不是无脑替换:使用者必须把每个事件和 slot 绑定迁移到新的基于 props 的 API,而列表定位现在依赖 floating-ui 的包入口,这是经典的构建错误来源。README 记录了完整的 props 表面——值模式、多选、过滤、防抖和加载状态——以及示例、在线 REPL 和迁移指南。

fuzzysort 4.0

fuzzysort 4.0 能在 1 毫秒内匹配 13,000 个文件,且零依赖——一个速度超过重型替代品的迷你模糊搜索引擎。朴素的子串匹配让用户淹没在无关结果里,而传统模糊搜索库为了速度牺牲相关性;带可配置阈值的干净排序,才是区分可用搜索与噪音的关键。文档介绍了 API:带 limit 和 threshold 的 go()、用于查询多个嵌套 key 的 snapshot()、通过 scoreFn 自定义评分,以及同时面向纯字符串和 React 的单行结果高亮。

GTKX 1.0

用 React 和 TypeScript 编写原生 Linux 桌面应用——useState 和 onClicked 之类的普通 hooks 直接驱动真实的 GTK4 控件,完全不涉及浏览器或 webview。GTK4 的 GtkBuilder XML 能很好地布局静态界面,但当应用状态变化时没有任何东西重新渲染,工作时也没有热重载,这让 GNOME 技术栈缺少一层声明式抽象。GTKX 恰好补上这一缺失层及其工具链:映射到 GTK4 控件的内置 React 元素、CLI 生成的按项目绑定,以及完整暴露而非藏在跨平台 API 背后的整套 GNOME 技术栈。

Belgie 0.40

Belgie 在 Python 内嵌入一个带权限控制的 Deno 运行时,让 AI 代理能在带显式安全边界的沙箱环境中执行 JavaScript 和 TypeScript。生成 JS/TS 代码的 Python 代理通常找不到安全的地方运行它们——subprocess 黑客手段和不受管理的运行时让跨语言执行变得脆弱,而 Python/JS 边界要求 JSON 兼容的值和清晰的工具契约。文章介绍了 Script/Runtime API、JSON 数据桥、通过 BelgieExtension 接线的 React MCP Apps,以及即插即用的 Pydantic AI 和 LangChain 集成。

📚 教程

Harness 工程:如何驾驭你的代理

没有 harness 的 LLM 调用不是代理——它只是一次事务性的推理调用,没有记忆、没有恢复能力,也无法在一次失败的工具调用后存活。这种脆弱性正是大多数代理 demo 无法上线的根因:生产级代理需要支撑持久化执行、安全沙箱、记忆系统和多代理编排的基础设施。Netflix 高级软件工程师 Scott Moss 教你用 TypeScript 构建这种生产级 harness,每节课都配有解决方案和随堂笔记。

📝 简讯

pnpm 12(Rust 重写)进入候选发布

对最广泛使用的 Node.js 包管理器做的一次彻底 Rust 重写,却带着零迁移负担发布:pnpm 12 保留了 pnpm 11 的每一个命令、标志、设置和 lockfile 格式。只有四个行为真正改变——一个被移除的标志直接报错、全局安装的 node、deno 或 bun 现在遵循当前项目锁定的版本(消除了独立版本管理器的需求),而 git specifier 变成与传输无关的标识,因此解析器永远不会记录 SSH URL——在 pnpm 11 中这些 URL 会在没有作者密钥的机器上悄然破坏安装。这篇文章汇总了全部四个差异,包括如何重新解析旧版 pnpm 写入的 lockfile。

Bun 1.4 在 𝕏 上持续预告新特性

Bun 正在把 SIMD 加速的 XML 解析器直接内置进运行时,作为即将到来的 1.4 版本中的 Bun.XML.parse——解析通常需要安装一个库,如今变成内置能力。这条预告重新点燃了意见分裂的社区:有人调侃 1.4 竟然被 XML 解析这种小事拖住,也有人怀疑 SIMD 面对大型 RSS 源是否撑得住,还是只是跑分秀。这个帖子的评论区追踪哪些被预告的特性最终入选(XML 已入选,FTP 仍待定),以及哪些基准测试才真正有意义。

📦 版本

Deno 2.9.5

Deno 2.9.5 悄然落地一个实验性 QuickJS 后端,用更轻量、启动更快的引擎替换 V8 这个重型引擎。V8 的内存占用和冷启动成本长期让 Deno 的全栈野心在边缘和 serverless 工作负载上难以落地。该版本将新引擎与 Blob/Body textStream()、workspace 作用域的 --members 任务运行,以及一波 node:dns 和 web-streams 兼容性修复配套发布。

Node.js 26.7.0(Current)

新增 --test-coverage-include-all,全新支持 Perfetto tracing,并修复 FFI 和 SQLite 崩溃问题。

SolidStart v2

SolidStart v2 稳定发布——其最大的架构动作是删掉自己的构建层,用 Vite 的 Environment API 替换 Vinxi 自定义管道。全栈 Solid 应用此前被框架特定的构建抽象挡在后面,阻碍了插件兼容性和 Vite 主版本升级;如今直接构建在 Vite 8 之上,解锁了 Rolldown 驱动的工具链、Tailwind CSS v4 支持,以及 Nitro v3、Cloudflare 和 Netlify 的直接部署插件集成。公告介绍了简化后的架构、发布当天就兼容 Vite 9,以及从 v1 到 v2 的一键迁移——配置从 app.config.ts 移到 vite.config.ts,另有 Node.js 24+ 和包导入变更需要注意。

Preact 11 Release Candidate


往期精选


阅读原文


扫码关注「右耳朵猫AI」

扫码关注「右耳朵猫AI」

posted @ 2026-08-22 15:07  右耳朵猫AI  阅读(16)  评论(0)    收藏  举报