- Published on
2026-第二十七周
- Authors

- Name
- AgedCoffee
- @__middle__child
该周报主要为各个地方内容的汇总整理
- 技术
- Python:在 WeakKeyDictionary 中为对象存储额外数据 - Adam Johnson
- 使用 AI 驱动的堆快照分析在几分钟内调试 Node.js 内存泄漏
- 追逐幻影跳跃:我们如何在低端安卓设备上让 Pingo 动画流畅运行 — Margelo 博客
- React 测试中常让工程师困惑的问题 | 如何测试前端
- 工具
- EdgeMirror
- GitHub - francoismassart/eslint-plugin-tailwindcss 在 tailwindweekly.com · GitHub
- GitHub - onmyway133/pica: 🕊️ 从任意仓库获取代理、技能、命令
- gnhf
- 更新
- Prettier 3.9:重大解析器升级与格式化改进 · Prettier
- 使用 TypeScript 7 更快迭代
- 其他
- 把人当棋子,建起的帝国脆弱不堪
- 扩展工程:所有权优先于招聘 | 伊多·格林
- 维持共享现实:过往技术浪潮如何影响战略 | 作者:惠特尼·齐默尔曼 | 2026 年 5 月 | Medium
技术
Python:在 WeakKeyDictionary 中为对象存储额外数据 - Adam Johnson
本文介绍了使用 WeakKeyDictionary 为 Python 对象存储额外数据的方法,避免了直接属性存储的缺点,并解释了其优势与适用条件。
- 📦 问题背景:需要为对象(如
ast.Module)关联额外数据,但直接属性存储存在限制(如不支持任意属性、命名冲突、干扰vars()等)。 - 🔑 解决方案:使用
WeakKeyDictionary以对象为键存储数据,利用弱引用在对象不再被引用时自动清理条目,保持 O(1) 查找性能。 - ✅ 对象要求:对象必须可哈希(默认满足)且可弱引用(大多数用户类默认支持,内置类型如
int、str等不支持,但可通过在__slots__中添加__weakref__实现)。 - ⚠️ 与
functools.cache对比:functools.cache使用强引用,会阻止对象被垃圾回收,导致内存泄漏;而WeakKeyDictionary自动释放未引用对象的内存。 - 🛠️ 实现示例:通过
try-except模式检查缓存,若不存在则计算并存储结果,确保高效且安全地管理额外数据。
使用 AI 驱动的堆快照分析在几分钟内调试 Node.js 内存泄漏
本文介绍了如何使用 N|Solid 扩展在 VS Code 等编辑器中,通过 AI 驱动的堆快照分析,快速定位并修复 Node.js 内存泄漏问题。
- 🧠 问题描述:内存泄漏是生产环境中最令人头疼的问题之一,表现为内存持续增长、GC 频繁、性能下降甚至进程崩溃。
- 🔍 检测方法:通过 N|Solid 扩展在编辑器中直接观察运行时内存指标,无需切换外部仪表盘,发现内存持续上升。
- 📸 堆快照捕获:直接捕获堆快照,AI 自动分析内存图,快速识别出模块级数组
leak是泄漏根源。 - 🎯 根因定位:AI 报告指出
leak.push(JSON.parse(resp))导致对象被永久保留,并重建了保留路径:GC 根 → http.Server → requestListener → 模块作用域 → leak。 - 🛠️ 修复方案:移除不必要的数组保留,修正后的代码不再存储请求对象,让 GC 能正常回收内存。
- ✅ 验证修复:部署修复后再次捕获堆快照,AI 分析确认无活动泄漏,无增长的对象集合,泄漏模式消失。
- 💡 核心价值:将生产调试工作流整合到编辑器中,减少上下文切换,缩短从发现问题到理解修复的时间。
- 🎬 完整演示:提供视频链接展示从泄漏检测到根因分析再到验证的完整流程。
- 🚀 开始使用:N|Solid 扩展支持 VS Code、Cursor、Windsurf 和 Antigravity,可直接从编辑器调试生产问题。
追逐幻影跳跃:我们如何在低端安卓设备上让 Pingo 动画流畅运行 — Margelo 博客
本文详细分析了在廉价 120Hz 安卓设备上,一个看似正确的弹簧动画出现视觉卡顿的根本原因。问题并非动画逻辑本身,而是由渲染管线中的多个成本叠加导致帧交付延迟。文章按影响大小依次介绍了三个主要成本:Skia 在安卓上的合成方式(TextureView vs SurfaceView)、一个自循环的重新绘制错误,以及 React 状态管理导致的额外渲染。最终通过将画布从 TextureView 切换到 SurfaceView,并修复其他问题,彻底解决了卡顿。
- 🧩 核心问题:动画数学上完美(位置单调),但因帧交付时间不均匀(部分帧耗时超过 8.3ms),导致人眼感知到卡顿。问题在于“帧节奏”,而非“位置曲线”。
- 🖼️ 最大成本:Skia 合成方式:默认的
TextureView导致每帧 GPU 需对画布像素进行 2-3 次处理(渲染、上传、合成),在廉价 120Hz 设备上远超 8.3ms 预算。dumpsys gfxinfo显示 85% 的帧卡顿,其中 79% 归因于“慢位图上传”。 - 🔬 诊断方法:将屏幕强制降至 60Hz 后,卡顿率从 85% 骤降至 15%,证实了每帧 GPU 成本是固定的,且超出了 120Hz 的预算。
- ⚙️ 关键修复:将
<Canvas>的opaque属性设为true(安卓上),使其从SkiaTextureView切换为SkiaSurfaceView。这为画布创建了独立的SurfaceFlinger层,消除了每帧的纹理上传和 GPU 合成,让硬件合成器直接处理,RenderThread CPU 使用率下降 50-65%。 - 🔄 第二成本:自循环重绘:
usePathValue和usePathInterpolation钩子会创建一个自循环,每次重绘都重新脏化自身,导致画布在无交互时也持续重绘。通过改用缓冲区变异(useDerivedValue返回稳定引用)修复,空闲帧时间从 17-32ms 降至约 9ms。 - ⚡ 第三成本:React 状态搅动:
useEffect依赖了每次轮询都创建新对象的 Zustand store 值,导致React.memo失效,触发不必要的画布重绘。通过基于内容而非对象引用来记忆化修复。 - 🤖 自动化二分法:使用 LLM 代理(Claude Code)并行构建、运行和测量数百个变体,快速定位次要成本。人类负责提出假设和判断结果,机器负责执行重复循环。
- 📊 最终效果:在廉价 120Hz 设备上,动画从 85% 卡顿帧变为流畅,用户不再感知到跳跃。所有修复中,
SurfaceView切换贡献了绝大部分性能提升。
React 测试中常让工程师困惑的问题 | 如何测试前端
本文探讨了前端测试中常见的陷阱与最佳实践,尤其针对 React 应用和 React Testing Library。文章通过面试问题形式,剖析了“永不失败的测试”、过度模拟、测试实现细节等关键问题,并提供了具体解决方案,如使用假定时器、正确模拟 Web API 等。
- 🧪 永不失败的测试:测试硬编码文本或错误断言(如
expect(container).toBeTruthy())毫无价值,应避免。若测试在实现被删除后仍通过,则说明测试无效。 - 🔄 测试实现细节:如果重构内部代码(如从
useState改为useReducer)导致测试失败,则说明测试了实现细节。应只通过用户交互(如点击按钮后文本变化)来验证。 - ⏱️ 测试防抖输入:使用假定时器(
jest.useFakeTimers())和配置userEvent.setup({ advanceTimers }),并在act()中推进时间,而非依赖真实时间。 - 🎭 过度模拟的危害:模拟过多会导致测试与真实代码脱节,如模拟 API 返回数据后只验证模拟本身。应仅模拟外部依赖(如浏览器 API、第三方模块)。
- 🌐 测试 IntersectionObserver:
jsdom不支持该 API,需手动模拟或使用真实浏览器(如 Vitest Browser Mode 或 E2E 测试)。提供完整模拟代码示例。 - 🖱️ 测试拖拽功能:优先使用键盘事件(
fireEvent.keyDown)模拟拖拽,因为jsdom无真实布局。鼠标拖拽应留给 E2E 测试。 - 🚫 E2E 测试的过度使用:E2E 测试慢、易不稳定,应只覆盖关键流程。组件细节和边缘用例更适合单元/集成测试。
- 📚 RTL 基础问题:熟悉
getByvsqueryByvsfindBy、userEventvsfireEvent、data-testid作为最后手段,以及waitFor的用法。 - ⚠️
act()的作用:确保所有状态更新和重渲染完成。忽略not wrapped in act()警告可能导致假阳性。userEvent和waitFor内部已包含act()。
工具
EdgeMirror
EdgeMirror 是一个基于 CDN 风格的边缘镜像网关,通过单一域名路径路由的方式,为 PyPI、PyTorch、Hugging Face、GitHub、Docker 等多种开发者资源提供加速服务。支持 Cloudflare Workers 和 Vercel Functions 一键部署,提供稳定版和测试版服务矩阵。
- 🚀 单一域名网关:所有加速服务通过统一域名(如 edgemirror.w0x7ce.eu)的路径路由访问,如/pypi、/hf、/github 等
- ⚡ 多语言支持:每页内置英语、西班牙语、中文语言切换器,工具名称保持英语,说明标签跟随所选语言
- 🛠️ 技术栈:基于 Cloudflare Workers/Vercel Functions 构建,使用 JavaScript 实现代理加速
- ✅ 稳定版服务:包含 EdgeMirror 门户、帮助、PyPI/PyTorch、Hugging Face、GitHub、Docker 注册表、Linux 镜像、通用代理等
- 🧪 测试版服务:npm 注册表、Go 模块代理、Maven/Gradle、crates.io 稀疏注册表、运行时下载等正在验证中
- 📦 一键部署:支持 Cloudflare Workers 和 Vercel 一键点击部署,无需复杂配置
- 💻 本地开发:提供完整的 npm 脚本生态,包括验证、语法检查、烟雾测试和部署命令
- 🌐 Docker 支持:单域部署可直接使用 docker pull 命令,自动识别/v2、/token 等 Docker API 流量
- 📋 路径路由模型:所有工具采用统一路径模型,如/edgemirror、/pypi、/hf 等
- 🔄 配置灵活:通过 src/config.js 添加或修改工具,支持自定义域名和环境变量配置
GitHub - francoismassart/eslint-plugin-tailwindcss 在 tailwindweekly.com · GitHub
eslint-plugin-tailwindcss 是一个专为 Tailwind CSS v4 设计的 ESLint 插件,提供 7 条规则以增强代码一致性和最佳实践,支持自动修复和自定义配置,并鼓励社区贡献。
- 📦 安装与配置:通过
npm i -D eslint-plugin-tailwindcss安装,需在eslint.config文件中导入并设置cssConfigPath指向 Tailwind CSS v4 的.css配置文件。 - 🛠️ 核心规则:包含 7 条规则,如
classnames-order(排序)、enforces-shorthand(简写)、no-contradicting-classname(避免矛盾)等,部分支持自动修复(🔧)或手动修复(💡)。 - ⚙️ 灵活设置:支持自定义属性、函数、忽略键、缓存大小等共享设置,默认值通过
DEFAULT_SETTINGS导出,并支持 TypeScript 类型安全配置。 - 🌟 开源与赞助:项目基于 MIT 许可证,鼓励开发者贡献,并接受 GitHub Sponsors 和 thanks.dev 赞助以维持维护。
- 🚀 版本与兼容:最新版本 v4.0.6(2026 年 7 月),支持 ESLint v10;旧版 Tailwind CSS v3 用户可使用
eslint-plugin-tailwindcss@3.x.x。
GitHub - onmyway133/pica: 🕊️ 从任意仓库获取代理、技能、命令
pica 是一个 CLI 工具,用于从 GitHub 仓库或本地路径检测并安装 Claude Code 的代理、技能、命令、钩子和规则。
- 🕊️ 支持通过
npx @onmyway133/pica <repo>快速安装,或使用uninstall命令卸载 - 📦 可检测五种配置类型:代理(
.md文件)、技能(SKILL.md目录)、命令(.md文件)、钩子(hooks.json)和规则(.md文件) - 🎯 安装时提供交互式提示,可选择安装类型、具体项目、作用域(本地
.claude/或全局~/.claude/)和模式(符号链接或复制) - 🗑️ 卸载时仅显示已安装的项目,支持从本地、全局或两者同时移除,钩子会精确删除
settings.json中的对应条目 - 🔗 符号链接模式将文件复制到全局存储并创建链接,确保一处更新处处生效;复制模式则直接拷贝独立副本
- 📂 仓库需遵循特定目录结构(如
.claude/agents/、hooks/等),工具自动检测并让用户选择安装内容
gnhf
gnhf 是一个开源自动化研究编排工具,可在您睡眠期间让 AI 代理持续工作,每次迭代都会向目标推进一个小而确定的提交,醒来时即可获得干净的分支和完整的工作日志。
- 💤 自动化夜间工作:睡前只需一条命令,代理就会持续运行直到你停止或达到配置上限,醒来即可看到干净的代码分支和完整日志
- 🔄 智能迭代机制:每次成功迭代自动提交,失败回滚(提交失败保留未提交代码供修复),代理错误指数退避重试,连续失败 3 次自动中止
- 📊 实时状态与总结:终端标题实时显示状态、令牌数和提交数;运行结束时输出包含耗时、分支、迭代数、令牌数、差异统计和审查命令的永久摘要
- 🔧 多代理支持:开箱支持 Claude Code、Codex、Rovo Dev、OpenCode、GitHub Copilot CLI、Pi 和 ACP 目标,可通过配置文件切换
- 🌳 并发工作树模式:通过
--worktree在隔离的 git 工作树中同时运行多个代理,互不干扰,适合同时实现多个功能 - 🔄 断点续跑:支持从现有 gnhf/ 分支恢复运行,提示不同时可选择更新提示继续、新建分支或退出
- 🚀 实时分支模式:
--current-branch --push组合可在当前分支直接提交并推送,适合需要实时部署或监看的项目 - 🛡️ 优雅中断与睡眠保护:首次 Ctrl+C 优雅停止(等当前迭代完成),第二次立即强制停止;支持 macOS/Linux/Windows 系统睡眠保护
- 📝 共享记忆与元数据:代理通过 notes.md 文件跨迭代通信,运行元数据存储在 .gnhf/runs/ 目录下,不污染工作分支
- 🔧 高度可配置:通过
~/.gnhf/config.yml设置默认代理、自定义路径、代理参数、提交约定等;CLI 标志可覆盖配置文件
更新
Prettier 3.9:重大解析器升级与格式化改进 · Prettier
Prettier 3.9 版本发布,带来了主要解析器升级和大量格式化改进,涵盖 Markdown、YAML、Flow、GraphQL、Angular 以及 JavaScript/TypeScript 等多个领域。
- 🚀 主要解析器升级:Markdown 解析器升级至最新的 micromark v4,YAML 解析器升级至 yaml v2,Flow 采用新的 Rust 解析器,GraphQL 支持 v17 语法。
- 🐛 JavaScript 格式化修复:修复了
--no-semi模式下注释、括号、空行、IIFE 函数、JSDoc 等多处问题,并优化了逻辑表达式、模板插值、成员链等格式。 - 🛠️ TypeScript 改进:修复了成员链换行、类型断言、联合类型、条件类型、类继承、枚举键引用、映射类型注释等多处问题,并优化了
no-semi模式下的分号处理。 - 💧 Flow 增强:新增对 Flow 记录、匹配实例模式、隐式声明函数/组件、
writeonly/in/out方差修饰符的支持,并修复了可选返回类型、注释格式等问题。 - 📝 Markdown 与 YAML 修复:修复了 Markdown 中 CJK 换行、列表缩进代码块、setext 标题等问题;YAML 修复了键换行、块标量空格、空行保留等问题。
- 🎨 CSS/SCSS/HTML/Angular 改进:修复了 CSS 属性值换行、SCSS 尾逗号、HTML 注释与预格式化元素、Angular
@content块支持等问题。 - 🔧 CLI 与杂项:修复了特殊字符目录名崩溃、EditorConfig 搜索范围、缓存策略、文件名引号等问题,并更新了实验性 CLI 和 Printer 接口。
使用 TypeScript 7 更快迭代
VS Code 团队通过渐进式方法成功迁移至 TypeScript 7,实现了 7 倍类型检查加速和 4 倍构建速度提升,同时通过紧密协作帮助 TypeScript 团队完善了工具链。
- ⚡ 性能飞跃:类型检查从 36 秒降至 5 秒(7 倍提速),
npm run watch从 80 秒缩短至 20 秒,编辑器语言工具加载时间从近 1 分钟降至 10 秒。 - 🧩 渐进式迁移策略:分阶段推进(探索→TS6 桥接→并行运行→逐扩展迁移→全面切换),每个步骤都降低风险并持续反馈问题。
- 🔄 双向协作价值:VS Code 团队通过日常使用发现格式化差异、功能缺失等真实场景 bug,推动 TypeScript 团队优先修复,最终使 TS7 更稳定可靠。
- 🛠 工具链简化:迁移过程中用 esbuild 替代 webpack,结合
tsgo(TS7)实现更简洁的构建流程,减少生产与开发环境差异。 - 🚀 开发者体验提升:日常编辑循环显著加速,代理辅助迭代更高效,开发者无需频繁等待编译或切换语言版本。
其他
缓慢思考,快速行动,这就是成功的秘诀。
(Think slow, act fast: That’s the secret of success.)
-- 《如何完成大型项目》
大多数争论都是与自我意识有关,而非理念。
--《我为什么不再与人争论》
把人当棋子,建起的帝国脆弱不堪
本文探讨了在科技行业中,将员工视为“棋子”的管理方式虽能短期获利,但最终会导致组织脆弱、不可持续。作者主张,道德的管理方式与持久的管理方式是一致的,应通过系统思维、结构优化和以人为本的实践来构建健康的工程团队。
- 🧠 把员工当棋子的管理终将失败:短期看似成功,但组织内部腐烂,长期必然崩塌。
- 🔄 团队是系统,不是零件堆:工作积压、技术债务等反馈循环决定团队表现,而非个人努力。
- ⏳ 硬性限制不可忽视:管理者最多有效管理 6-8 人,团队协调成本随规模指数增长。
- 🌊 团队三种状态需不同应对:水下(需增加容量)、踩水(需减少并行任务)、水上(需保护余量用于还债或创新)。
- 📏 用正确指标引导行为:奖励代码行数或 bug 数会扭曲行为,应关注质量、成长等难以量化的价值。
- 🛠️ 建立可持续的结构:为未来规模设计、文档化流程、坚持完成收尾工作,避免半途而废。
- 🌱 耐心打造能超越自己的系统:结构改进见效慢,但比靠压榨员工换来的短期成果更持久。
扩展工程:所有权优先于招聘 | 伊多·格林
扩展工程团队的关键在于扩展所有权,而非单纯增加人手。随着团队规模从 20 人增长到 200 人,协调成本会随之增加,而清晰的所有权是保持效率的核心。
- 🚀 前 20 人:优化构建者 – 团队应拥有端到端的服务所有权,包括独立负责部署、值班和故障修复,避免过早设立平台团队。
- ⚠️ 50 人左右:协调成本出现 – 沟通不再自然发生,依赖关系变得复杂。需警惕“组织表演性”流程,只引入解决真实问题的流程。
- 🔍 代码审查成为新瓶颈 – AI 时代,写代码变便宜,但审查、维护和保持架构完整性变难。重点应从“写更多代码”转向“保持对代码的信心”。
- 🏗️ 200 人左右:扩展所有权是核心工作 – 管理重点从软件开发转向“团队系统”设计。组织设计的重要性不亚于技术架构。
- 🌐 协调的真实成本 – 跨团队、跨时区的依赖、共享责任和不清晰的所有权边界会带来“税收”。目标是持续最小化组织阻力,同时保持对齐。
- 🛠️ 平台团队的正确时机 – 在 80-100 人之后,当重复劳动和可靠性需求足够高时,平台团队才能创造真正的杠杆效应,且应像产品团队一样服务内部客户。
- 📞 值班揭示真相 – 健康组织将值班视为学习机制,通过反馈循环改进系统;不健康组织则将其视为惩罚。
- 🏢 上市公司的转变 – 需平衡速度与可预测性。避免过度流程化,在保持质量的同时维护所有权文化。
- 🤖 AI 改变与不变 – AI 加速了代码生成,但并未改变所有权的重要性,反而因代码量激增而需要更强的所有权模型。
- 💡 核心思想 – 扩展工程不是增加工程师,而是确保每位工程师清楚自己拥有什么、为何拥有以及当故障发生时会发生什么。清晰的目标、优先级和所有权是成功的关键。
维持共享现实:过往技术浪潮如何影响战略 | 作者:惠特尼·齐默尔曼 | 2026 年 5 月 | Medium
历史经验表明,每一次信息技术浪潮都会让战略分析变得更容易,但也容易导致分析脱离决策,使企业陷入“分析瘫痪”。生成式 AI 是又一次强大变革,理解过往教训能帮助战略领导者更好地利用它。
- 📉 分析脱离决策的陷阱:1972 年,麦肯锡合伙人 Gerstner 指出,数据处理的普及让战略规划成为“浪费时间的玩物”,因为分析未能与真实决策结合,CEO 必须亲自参与。
- 🏢 IBM 的教训:1993 年 Gerstner 接手 IBM 时,公司拥有 339 项客户满意度调查,却因销售团队自选样本而系统性地误导战略。他通过“熊抱行动”强制高管亲自拜访客户,重建了共享认知。
- 🧠 自动化悖论:自动化接管常规任务后,人类会疏于练习关键技能。研究表明,“自动化自满”是注意力问题,无法通过意志克服,导致领导者在战略框架、辩论和选择上脱节。
- 🤝 共享心智模型的价值:团队通过协作分析(而非接收成品报告)建立的共享认知,是应对不确定性的关键。Gerstner 的“熊抱行动”实质是强制高管共同构建对现实的理解。
- ⏳ 节奏错配:分析层(快)与决策层(慢)的失衡是危机根源。AI 加速分析,但战略的框架构建、辩论和承诺仍需人类节奏,过快产出会压垮团队的吸收能力。
- 🛠️ 战略领导者的行动建议:保持深度参与(如 NVIDIA 的实时白板辩论);不急于自动化,先培养团队质疑能力;投资于问题分解而非分析数量;警惕机器般完美的输出,珍视思考的“不完美痕迹”。
- 🎨 艺术隐喻:拉斯金在《威尼斯之石》中赞美哥特柱头的“不完美”,认为每个凿痕都记录着工匠的思考。战略亦如此——最宝贵的部分正是人类判断、诠释和选择的痕迹。