<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>简希博客</title>
    <link>https://climberzbm.cn</link>
    <description>个人技术博客，记录学习与成长</description>
    <language>zh-CN</language>
    <atom:link href="https://climberzbm.cn/rss" rel="self" type="application/rss+xml"/>
    
    <item>
      <title>Node.js 事件循环的阻塞治理：从同步 CPU 任务到分区切片的响应性优化</title>
      <link>https://climberzbm.cn/posts/node-js-事件循环的阻塞治理-从同步-cpu-任务到分区切片的响应性优化-1789387282808</link>
      <description>Node.js 的单线程事件循环，一旦被同步 CPU 任务长时间占用，所有 I/O 回调都会卡死。本文从阻塞的检测、分区切片、到 worker_threads 卸载，用正反例拆解如何在不改架构的前提下，把主线程还给事件循环。</description>
      <pubDate>Mon, 14 Sep 2026 12:01:22 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-事件循环的阻塞治理-从同步-cpu-任务到分区切片的响应性优化-1789387282808</guid>
    </item>
    
    <item>
      <title>Vite 依赖预构建的失效治理：从 optimizeDeps 缓存误判到冷启动回归的排查链路</title>
      <link>https://climberzbm.cn/posts/vite-依赖预构建的失效治理-从-optimizedeps-缓存误判到冷启动回归的排查链路-1789351258869</link>
      <description>Vite 的依赖预构建是开发期提速的核心，但缓存一旦过期或误判，就会退化成冷启动反复重扫。本文从 optimizeDeps 缓存失效的三个诱因、手动失效到 include/exclude 的边界，用正反例拆解如何让预构建始终命中。</description>
      <pubDate>Mon, 14 Sep 2026 02:00:58 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-依赖预构建的失效治理-从-optimizedeps-缓存误判到冷启动回归的排查链路-1789351258869</guid>
    </item>
    
    <item>
      <title>用 Web Worker 把重计算赶出主线程：从卡顿到 60fps 的三种卸载策略实测</title>
      <link>https://climberzbm.cn/posts/用-web-worker-把重计算赶出主线程-从卡顿到-60fps-的三种卸载策略实测-1789351244358</link>
      <description>主线程被长任务阻塞是前端卡顿的头号元凶。本文对比三种卸载策略——一次性 spawn 重 Worker、可复用 Worker 池、以及 Transferable 零拷贝传参——用 INP 与火焰图度量真实收益，并给出避免结构化克隆与过度通信的反例。</description>
      <pubDate>Mon, 14 Sep 2026 02:00:44 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/用-web-worker-把重计算赶出主线程-从卡顿到-60fps-的三种卸载策略实测-1789351244358</guid>
    </item>
    
    <item>
      <title>React key 的语义边界：从隐式索引到稳定身份的类型安全治理</title>
      <link>https://climberzbm.cn/posts/react-key-的语义边界-从隐式索引到稳定身份的类型安全治理-1789351243341</link>
      <description>隐式索引作为 React key 是高频的渲染隐患。本文从 key 的身份语义出发，用 TypeScript 把 key 选型固化为编译期契约，正反例对照终结列表重建、状态错位与焦点丢失。</description>
      <pubDate>Mon, 14 Sep 2026 02:00:43 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/react-key-的语义边界-从隐式索引到稳定身份的类型安全治理-1789351243341</guid>
    </item>
    
    <item>
      <title>V8 数组元素类型与内联缓存的选型治理：从 PACKED/ELEMENTS 到 Holey 降级的性能真相</title>
      <link>https://climberzbm.cn/posts/v8-数组元素类型与内联缓存的选型治理-从-packed-elements-到-holey-降级的性能真相-1789264854474</link>
      <description>JavaScript 数组在 V8 里不是一种结构，而是按元素类型与是否稀疏分成多种「元素种类」。一次不经意的赋值就能让数组从紧凑降到带洞，让后续遍历慢上一个量级。本文用正反例拆解元素种类的迁移规则与治理清单。</description>
      <pubDate>Sun, 13 Sep 2026 02:00:54 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/v8-数组元素类型与内联缓存的选型治理-从-packed-elements-到-holey-降级的性能真相-1789264854474</guid>
    </item>
    
    <item>
      <title>React 表单状态的类型安全工程：从 any 逃逸到 Zod 编译期契约</title>
      <link>https://climberzbm.cn/posts/react-表单状态的类型安全工程-从-any-逃逸到-zod-编译期契约-1789264839664</link>
      <description>表单是 React 运行时错误重灾区。本文用可辨识联合建模校验状态机、用 Zod 单一数据源驱动校验，把 NaN 逃逸和字段拼错从类型层拦截。</description>
      <pubDate>Sun, 13 Sep 2026 02:00:39 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/react-表单状态的类型安全工程-从-any-逃逸到-zod-编译期契约-1789264839664</guid>
    </item>
    
    <item>
      <title>Node.js 配置加载的类型安全工程：从 process.env 裸读到 Zod 校验与分层注入</title>
      <link>https://climberzbm.cn/posts/node-js-配置加载的类型安全工程-从-process-env-裸读到-zod-校验与分层注入-1789214462810</link>
      <description>Node.js 服务从 process.env 里读配置，几乎是所有运行时事故的起点：缺失、拼错、类型错位都要等到请求进来才爆。本文从 env 的类型收窄、Zod 运行时校验、到配置分层注入，用正反例拆解一套编译期与运行时双保险的配置工程。</description>
      <pubDate>Sat, 12 Sep 2026 12:01:02 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-配置加载的类型安全工程-从-process-env-裸读到-zod-校验与分层注入-1789214462810</guid>
    </item>
    
    <item>
      <title>JavaScript 深拷贝的工程化选型：structuredClone、JSON 与手写递归的性能与语义真相</title>
      <link>https://climberzbm.cn/posts/javascript-深拷贝的工程化选型-structuredclone-json-与手写递归的性能与语义真相-1789178502686</link>
      <description>深拷贝远不止 JSON.parse(JSON.stringify(obj)) 这一招。本文从工程化视角拆解 structuredClone、JSON 序列化与手写递归三者的性能差异、语义边界与陷阱。</description>
      <pubDate>Sat, 12 Sep 2026 02:01:42 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-深拷贝的工程化选型-structuredclone-json-与手写递归的性能与语义真相-1789178502686</guid>
    </item>
    
    <item>
      <title>React 状态更新的批处理与边界：从自动批处理到 useSyncExternalStore 的同步性治理</title>
      <link>https://climberzbm.cn/posts/react-状态更新的批处理与边界-从自动批处理到-usesyncexternalstore-的同步性治理-1789178447124</link>
      <description>React 的状态更新何时同步、何时批处理，直接决定一次交互里组件重渲染几次。本文从 React 18 自动批处理、事件与异步回调的边界、到 useSyncExternalStore 的同步快照，用正反例拆解更新语义，让渲染次数可预测。</description>
      <pubDate>Sat, 12 Sep 2026 02:00:47 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/react-状态更新的批处理与边界-从自动批处理到-usesyncexternalstore-的同步性治理-1789178447124</guid>
    </item>
    
    <item>
      <title>用 Vite define 与 TypeScript 类型收窄终结运行时功能开关：编译期常量折叠的零开销治理</title>
      <link>https://climberzbm.cn/posts/用-vite-define-与-typescript-类型收窄终结运行时功能开关-编译期常量折叠的零开销治理-1789178443278</link>
      <description>运行时功能开关库总在偷偷引入 if 分支与依赖树膨胀。本文用 Vite 的 define 常量替换配合 TypeScript 字面量类型收窄，把开关判定提前到编译期，让未启用代码被 Tree Shaking 彻底剪除，实现真正的零运行时开销。</description>
      <pubDate>Sat, 12 Sep 2026 02:00:43 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/用-vite-define-与-typescript-类型收窄终结运行时功能开关-编译期常量折叠的零开销治理-1789178443278</guid>
    </item>
    
    <item>
      <title>Node.js 启动性能的 V8 快照治理：从冷启动瓶颈到字节码缓存的工程化加速</title>
      <link>https://climberzbm.cn/posts/node-js-启动性能的-v8-快照治理-从冷启动瓶颈到字节码缓存的工程化加速-1789092083787</link>
      <description>Node.js 服务的启动延迟往往被归咎于依赖加载，却忽略了 V8 的编译与解析成本。本文从模块解析耗时、字节码缓存到进程复用的快照机制，用正反例拆解冷启动的性能黑洞，给出可落地到部署管线的加速范式。</description>
      <pubDate>Fri, 11 Sep 2026 02:01:23 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-启动性能的-v8-快照治理-从冷启动瓶颈到字节码缓存的工程化加速-1789092083787</guid>
    </item>
    
    <item>
      <title>Node.js 依赖锁定的工程化治理：从 package-lock 漂移到依赖提升的确定性防线</title>
      <link>https://climberzbm.cn/posts/node-js-依赖锁定的工程化治理-从-package-lock-漂移到依赖提升的确定性防线-1789092073847</link>
      <description>锁定文件漂移、幽灵依赖与依赖提升导致的“本地能跑、CI 崩”，是 Node 项目最隐蔽的工程债。本文用正反例对比拆解 lockfile 的三类漂移、npm ci 的确定性语义，以及依赖提升如何让不同包管理器产出天差地别的 node_modules。</description>
      <pubDate>Fri, 11 Sep 2026 02:01:13 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-依赖锁定的工程化治理-从-package-lock-漂移到依赖提升的确定性防线-1789092073847</guid>
    </item>
    
    <item>
      <title>Map 与对象字面量的性能对决：V8 隐藏类、单态缓存与键值容器选型的工程化真相</title>
      <link>https://climberzbm.cn/posts/map-与对象字面量的性能对决-v8-隐藏类-单态缓存与键值容器选型的工程化真相-1789092070243</link>
      <description>对象字面量真的总是最快的键值存储吗？本文从 V8 隐藏类、内联缓存分态与哈希实现三个底层维度，用基准对照揭示 Map 与 Object 在动态键、频繁增删、大容量场景下的性能反转，并给出可落地的选型清单。</description>
      <pubDate>Fri, 11 Sep 2026 02:01:10 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/map-与对象字面量的性能对决-v8-隐藏类-单态缓存与键值容器选型的工程化真相-1789092070243</guid>
    </item>
    
    <item>
      <title>TypeScript 名义类型（Branded Types）工程化实践：用类型系统终结 UserId 与 OrderId 的混用灾难</title>
      <link>https://climberzbm.cn/posts/typescript-名义类型-branded-types-工程化实践-用类型系统终结-userid-与-orderid-的混用灾难-1789005674359</link>
      <description>结构化类型让 TypeScript 的 UserId 和 ProductId 可以互相赋值，埋下运行时隐患。本文用 Branded Types 给基本类型打上不可伪造的标记，配合正反例对比，把 ID、金额、单位的类型安全前移到编译期。</description>
      <pubDate>Thu, 10 Sep 2026 02:01:14 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/typescript-名义类型-branded-types-工程化实践-用类型系统终结-userid-与-orderid-的混用灾难-1789005674359</guid>
    </item>
    
    <item>
      <title>品牌类型的工程化落地：用名义类型终结 TypeScript 的原始类型痴迷</title>
      <link>https://climberzbm.cn/posts/品牌类型的工程化落地-用名义类型终结-typescript-的原始类型痴迷-1789005670782</link>
      <description>string 到底是 UserId 还是 OrderId？TS 的结构化类型让所有字符串互相兼容，运行时一错全错。本文用品牌类型（Branded Type）把业务语义编码进类型层，实测可拦截一整类参数错位事故。</description>
      <pubDate>Thu, 10 Sep 2026 02:01:10 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/品牌类型的工程化落地-用名义类型终结-typescript-的原始类型痴迷-1789005670782</guid>
    </item>
    
    <item>
      <title>Vite 多环境配置的工程化范式：从环境变量安全到构建模式隔离的最佳实践</title>
      <link>https://climberzbm.cn/posts/vite-多环境配置的工程化范式-从环境变量安全到构建模式隔离的最佳实践-1789005668059</link>
      <description>Vite 的 .env 体系看似简单，却在密钥泄漏、类型缺失、模式混淆三处埋着工程化隐患。本文从 import.meta.env 的类型契约、模式隔离到密钥治理，用正反例拆解一套可复用的多环境配置范式，避免配置漂移拖垮部署。</description>
      <pubDate>Thu, 10 Sep 2026 02:01:08 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-多环境配置的工程化范式-从环境变量安全到构建模式隔离的最佳实践-1789005668059</guid>
    </item>
    
    <item>
      <title>Vue 组件的编译期性能契约：用泛型 Props 与 defineModel 把运行时校验前移到类型层</title>
      <link>https://climberzbm.cn/posts/vue-组件的编译期性能契约-用泛型-props-与-definemodel-把运行时校验前移到类型层-1788955261830</link>
      <description>Vue 的性能优化常被理解成运行时的事，但很多代价能在编译期就消灭。本文从泛型 Props 消除 any、defineModel 收敛双向绑定、到组合式函数的类型推导，用正反例拆解如何用 TypeScript 把组件契约前移，减少运行时收窄与修补。</description>
      <pubDate>Wed, 09 Sep 2026 12:01:01 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vue-组件的编译期性能契约-用泛型-props-与-definemodel-把运行时校验前移到类型层-1788955261830</guid>
    </item>
    
    <item>
      <title>Node.js 错误边界的类型安全工程：从 catch 丢弃到 Result 与进程守护的分层治理</title>
      <link>https://climberzbm.cn/posts/node-js-错误边界的类型安全工程-从-catch-丢弃到-result-与进程守护的分层治理-1788919271385</link>
      <description>Node.js 的错误总在异步缝隙里悄悄丢失，而 TypeScript 的 any 让 catch 里的 err 变成黑洞。本文从 Promise 拒绝的分型、Result 类型收敛、到进程级未捕获异常的守护，用正反例拆解一条类型驱动、分层兜底的错误治理链路。</description>
      <pubDate>Wed, 09 Sep 2026 02:01:11 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-错误边界的类型安全工程-从-catch-丢弃到-result-与进程守护的分层治理-1788919271385</guid>
    </item>
    
    <item>
      <title>Node.js 类型安全事件总线：用事件映射表终结 EventEmitter 的 stringly-typed 灾难</title>
      <link>https://climberzbm.cn/posts/node-js-类型安全事件总线-用事件映射表终结-eventemitter-的-stringly-typed-灾难-1788919257277</link>
      <description>Node.js 原生 EventEmitter 把事件名当裸字符串，拼错一个事件名或传错 payload 类型要到运行时才爆炸。本文用 TypeScript 的事件映射表 + 泛型约束重写事件总线，实现编译期校验事件名与回调签名，正反例对比展示从 any 逃逸到零运行时开销的类型护栏。</description>
      <pubDate>Wed, 09 Sep 2026 02:00:57 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-类型安全事件总线-用事件映射表终结-eventemitter-的-stringly-typed-灾难-1788919257277</guid>
    </item>
    
    <item>
      <title>Vite 动态导入失败的工程化治理：从 chunk 加载错误到优雅降级的重试防线</title>
      <link>https://climberzbm.cn/posts/vite-动态导入失败的工程化治理-从-chunk-加载错误到优雅降级的重试防线-1788919242702</link>
      <description>动态 import 的 chunk 404/超时会直接炸掉整个页面。本文用正反例拆解 Vite 动态导入失败的捕获、重试与降级策略，并给出可落地的错误边界封装。</description>
      <pubDate>Wed, 09 Sep 2026 02:00:42 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-动态导入失败的工程化治理-从-chunk-加载错误到优雅降级的重试防线-1788919242702</guid>
    </item>
    
    <item>
      <title>Node.js 到 React 的 ChatGPT 流式全链路：SSE 代理、背压与 hook 状态的一致性治理</title>
      <link>https://climberzbm.cn/posts/node-js-到-react-的-chatgpt-流式全链路-sse-代理-背压与-hook-状态的一致性治理-1788868858560</link>
      <description>把 ChatGPT 的流式输出从 Node 代理一路送到 React 组件，难点在三个接缝：服务端的 SSE 边界、代理的背压转发、客户端的增量状态合并。本文用正反例拆解这条跨端链路，给出每一层的一致性约束。</description>
      <pubDate>Tue, 08 Sep 2026 12:00:58 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-到-react-的-chatgpt-流式全链路-sse-代理-背压与-hook-状态的一致性治理-1788868858560</guid>
    </item>
    
    <item>
      <title>TypedArray 的性能真相：为什么普通数组在二进制数据处理里会慢 10 倍</title>
      <link>https://climberzbm.cn/posts/typedarray-的性能真相-为什么普通数组在二进制数据处理里会慢-10-倍-1788832885534</link>
      <description>很多人以为 JavaScript 里处理大量数值就该用 Array，其实 TypedArray 才是二进制场景的正确选择。本文通过正反例对比 TypedArray 与普通数组在内存布局、类型稳定性与批量运算上的差异，并给出浏览器与 Node.js Buffer 互操作的工程实践。</description>
      <pubDate>Tue, 08 Sep 2026 02:01:25 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/typedarray-的性能真相-为什么普通数组在二进制数据处理里会慢-10-倍-1788832885534</guid>
    </item>
    
    <item>
      <title>Vue 响应式代理背后的 JavaScript 陷阱：Proxy 拦截、this 绑定与深度追踪的边界治理</title>
      <link>https://climberzbm.cn/posts/vue-响应式代理背后的-javascript-陷阱-proxy-拦截-this-绑定与深度追踪的边界治理-1788832871774</link>
      <description>Vue 3 的响应式建立在 Proxy 之上，而 Proxy 的 get/set 拦截会与 this 丢失、原型访问、数组方法产生一系列 JavaScript 层面的语义裂痕。本文从拦截时机、receiver 参数到深度追踪边界，用正反例拆解代理包装后的隐形陷阱。</description>
      <pubDate>Tue, 08 Sep 2026 02:01:11 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vue-响应式代理背后的-javascript-陷阱-proxy-拦截-this-绑定与深度追踪的边界治理-1788832871774</guid>
    </item>
    
    <item>
      <title>Vue 3 模板类型检查的工程化落地：用 vue-tsc 把模板错误拦截在 CI 门前</title>
      <link>https://climberzbm.cn/posts/vue-3-模板类型检查的工程化落地-用-vue-tsc-把模板错误拦截在-ci-门前-1788832871772</link>
      <description>脚本块的类型安全只覆盖一半。本文从 defineProps/defineEmits/defineSlots 三件套出发，拆解 vue-tsc 如何在 CI 门禁前拦截模板层的属性拼写、事件参数与插槽作用域错误。</description>
      <pubDate>Tue, 08 Sep 2026 02:01:11 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vue-3-模板类型检查的工程化落地-用-vue-tsc-把模板错误拦截在-ci-门前-1788832871772</guid>
    </item>
    
    <item>
      <title>JavaScript 闭包陷阱如何拖垮 React 渲染：从过期闭包到引用稳定的状态治理</title>
      <link>https://climberzbm.cn/posts/javascript-闭包陷阱如何拖垮-react-渲染-从过期闭包到引用稳定的状态治理-1788782450975</link>
      <description>闭包是 JavaScript 的基础能力，但在 React 函数组件里，它会在 useCallback、useEffect 与定时回调中滋生出「过期闭包」。本文从捕获时机、依赖数组到函数引用稳定性，用正反例拆解闭包如何污染状态读取并拖垮渲染。</description>
      <pubDate>Mon, 07 Sep 2026 12:00:50 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-闭包陷阱如何拖垮-react-渲染-从过期闭包到引用稳定的状态治理-1788782450975</guid>
    </item>
    
    <item>
      <title>JavaScript WeakRef 缓存反模式：为什么你的弱引用缓存根本不会命中</title>
      <link>https://climberzbm.cn/posts/javascript-weakref-缓存反模式-为什么你的弱引用缓存根本不会命中-1788746469097</link>
      <description>WeakRef 和 FinalizationRegistry 看似能优雅地实现自动回收缓存，实则暗藏 GC 时机不可控、命中率归零的陷阱。本文用正反例剖析正确姿势与适用边界。</description>
      <pubDate>Mon, 07 Sep 2026 02:01:09 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-weakref-缓存反模式-为什么你的弱引用缓存根本不会命中-1788746469097</guid>
    </item>
    
    <item>
      <title>TypeScript 类型的运行时退场：从编译期优化到 monomorphic 调用点的性能闭环</title>
      <link>https://climberzbm.cn/posts/typescript-类型的运行时退场-从编译期优化到-monomorphic-调用点的性能闭环-1788746467568</link>
      <description>TypeScript 的类型在编译后就消失，但它留下的代码形状会反向决定 V8 的内联缓存能否保持单态。本文从类型收窄、联合类型的运行时代价、到 const 断言的形状稳定，用正反例拆解类型设计如何间接影响引擎性能。</description>
      <pubDate>Mon, 07 Sep 2026 02:01:07 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/typescript-类型的运行时退场-从编译期优化到-monomorphic-调用点的性能闭环-1788746467568</guid>
    </item>
    
    <item>
      <title>JavaScript 布局抖动的精准治理：用读写分离与批处理终结强制同步布局</title>
      <link>https://climberzbm.cn/posts/javascript-布局抖动的精准治理-用读写分离与批处理终结强制同步布局-1788746451820</link>
      <description>前端性能里最隐蔽的卡顿来源——布局抖动（Layout Thrashing）。从强制同步布局的原理，到 Performance 面板定性，再到读写分离与 transform 离线优化两套可落地方案，彻底终结循环里的读-写交替。</description>
      <pubDate>Mon, 07 Sep 2026 02:00:51 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-布局抖动的精准治理-用读写分离与批处理终结强制同步布局-1788746451820</guid>
    </item>
    
    <item>
      <title>V8 多态内联缓存的工程化治理：从单态假设到去优化的自动化防线</title>
      <link>https://climberzbm.cn/posts/v8-多态内联缓存的工程化治理-从单态假设到去优化的自动化防线-1788696057017</link>
      <description>V8 的性能高度依赖内联缓存保持单态，而多态一旦失控就触发去优化回退到解释器。本文从隐藏类偏离、参数类型漂移到函数热点的监控，用正反例拆解如何把「看不见的引擎优化」变成 CI 可守卫的工程约束。</description>
      <pubDate>Sun, 06 Sep 2026 12:00:57 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/v8-多态内联缓存的工程化治理-从单态假设到去优化的自动化防线-1788696057017</guid>
    </item>
    
    <item>
      <title>TypeScript 泛型 Hook 的型变陷阱：从协变返回到逆变回调的 React 类型工程</title>
      <link>https://climberzbm.cn/posts/typescript-泛型-hook-的型变陷阱-从协变返回到逆变回调的-react-类型工程-1788663497942</link>
      <description>把 React Hook 抽成泛型是消除重复样板的高效手段，但型变关系一旦搞反，类型安全会在真实调用处静默失效。本文从泛型推断、协变返回、逆变回调三个维度，用正反例拆解泛型 Hook 的类型工程，给出可落地的收窄范式。</description>
      <pubDate>Sun, 06 Sep 2026 02:58:17 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/typescript-泛型-hook-的型变陷阱-从协变返回到逆变回调的-react-类型工程-1788663497942</guid>
    </item>
    
    <item>
      <title>package.json exports 字段的工程化陷阱：从双包危机到稳定发布契约</title>
      <link>https://climberzbm.cn/posts/package-json-exports-字段的工程化陷阱-从双包危机到稳定发布契约-1788663437210</link>
      <description>同一个库在 ESM 与 CJS 下加载两次导致的"双包危机"，用 exports 条件导出、types 排序与深路径白名单一次性终结，附正反例与冒烟测试清单。</description>
      <pubDate>Sun, 06 Sep 2026 02:57:17 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/package-json-exports-字段的工程化陷阱-从双包危机到稳定发布契约-1788663437210</guid>
    </item>
    
    <item>
      <title>Vite 环境变量的类型安全契约：用 import.meta.env 泛型与 zod 校验终结 undefined 地狱</title>
      <link>https://climberzbm.cn/posts/vite-环境变量的类型安全契约-用-import-meta-env-泛型与-zod-校验终结-undefined-地狱-1788663377737</link>
      <description>环境变量是前端项目最易被忽掉的运行时契约。本文从 import.meta.env 的类型增强出发，结合 zod 运行时校验，构建一套从编译期到运行期的双重防线，彻底告别 process.env 的 undefined 地狱。</description>
      <pubDate>Sun, 06 Sep 2026 02:56:17 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-环境变量的类型安全契约-用-import-meta-env-泛型与-zod-校验终结-undefined-地狱-1788663377737</guid>
    </item>
    
    <item>
      <title>Vue 中接入 ChatGPT 流式响应的状态治理：从 SSE 断流到响应式更新的完整链路</title>
      <link>https://climberzbm.cn/posts/vue-中接入-chatgpt-流式响应的状态治理-从-sse-断流到响应式更新的完整链路-1788659833629</link>
      <description>在 Vue 里接 ChatGPT 流式输出，难点不在发请求，而在流状态如何安全地进入响应式系统。本文从 ReadableStream 逐块读取、AbortController 取消、到用 shallowRef 避免逐字触发整树重渲染，用正反例拆解一条可复用的流式会话链路。</description>
      <pubDate>Sun, 06 Sep 2026 01:57:13 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vue-中接入-chatgpt-流式响应的状态治理-从-sse-断流到响应式更新的完整链路-1788659833629</guid>
    </item>
    
    <item>
      <title>V8 函数内联与调用点多态性治理：从小函数风格到 monomorphic 调用点的性能工程</title>
      <link>https://climberzbm.cn/posts/v8-函数内联与调用点多态性治理-从小函数风格到-monomorphic-调用点的性能工程-1788659793653</link>
      <description>V8 的 TurboFan 通过内联消除函数调用开销，但只有 monomorphic（单态）调用点才能稳定命中内联缓存。本文通过 V8 反优化追踪，剖析小函数风格、多态派发与类字段调用对性能的影响，给出让热路径代码保持在单态调用点的工程化实践。</description>
      <pubDate>Sun, 06 Sep 2026 01:56:33 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/v8-函数内联与调用点多态性治理-从小函数风格到-monomorphic-调用点的性能工程-1788659793653</guid>
    </item>
    
    <item>
      <title>Vite 构建产物的依赖治理：从分包策略到按需预加载的缓存命中优化</title>
      <link>https://climberzbm.cn/posts/vite-构建产物的依赖治理-从分包策略到按需预加载的缓存命中优化-1788659792273</link>
      <description>Vite 打包出的产物结构直接决定浏览器缓存命中率与首屏体积。本文从 manualChunks 手动分包、动态 import 的预加载时机、到 vendor 文件的哈希稳定性，用正反例拆解如何让每一次依赖升级不再拖垮生产环境的缓存。</description>
      <pubDate>Sun, 06 Sep 2026 01:56:32 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-构建产物的依赖治理-从分包策略到按需预加载的缓存命中优化-1788659792273</guid>
    </item>
    
    <item>
      <title>Vite 的转译与类型检查分离：为什么 dev 能跑通、CI 却会炸</title>
      <link>https://climberzbm.cn/posts/vite-的转译与类型检查分离-为什么-dev-能跑通-ci-却会炸-1788659734427</link>
      <description>Vite 用 esbuild 只做类型擦除不做检查，dev 秒开但类型错误被静默吞掉，直到 CI 的 tsc --noEmit 才爆发。解析这条转译与检查分离的边界，用正反例讲清 enums、namespaces、类型导入如何埋雷，并给出 tsc 校验 + 编辑器联动的工程化防线。</description>
      <pubDate>Sun, 06 Sep 2026 01:55:34 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-的转译与类型检查分离-为什么-dev-能跑通-ci-却会炸-1788659734427</guid>
    </item>
    
    <item>
      <title>Vue 组件的响应式陷阱与 V8 对象形状：从 Proxy 追踪依赖到隐藏类偏离的性能治理</title>
      <link>https://climberzbm.cn/posts/vue-组件的响应式陷阱与-v8-对象形状-从-proxy-追踪依赖到隐藏类偏离的性能治理-1787843905380</link>
      <description>Vue 3 的响应式建立在 Proxy 之上，而 Proxy 追踪的粒度会反作用于 V8 隐藏类优化。本文从 reactive 依赖收集的运行时成本、对象形状的稳定与偏离出发，用正反例拆解二者叠加下的隐性性能损耗。</description>
      <pubDate>Thu, 27 Aug 2026 15:18:25 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vue-组件的响应式陷阱与-v8-对象形状-从-proxy-追踪依赖到隐藏类偏离的性能治理-1787843905380</guid>
    </item>
    
    <item>
      <title>JavaScript 对象判等与比较语义的工程陷阱：从 == 隐式转换到 Object.is 的边界治理</title>
      <link>https://climberzbm.cn/posts/javascript-对象判等与比较语义的工程陷阱-从-隐式转换到-object-is-的边界治理-1787843863686</link>
      <description>相等性比较是 JavaScript 中被误用最多的语法特性之一。本文从宽松相等、严格相等到 Object.is 与 SameValueZero，用正反例拆解隐式转换的坑，给出在真实项目中可落地的判等与键值比较规范。</description>
      <pubDate>Thu, 27 Aug 2026 15:17:43 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-对象判等与比较语义的工程陷阱-从-隐式转换到-object-is-的边界治理-1787843863686</guid>
    </item>
    
    <item>
      <title>V8 对象属性的隐藏税：从 In-object 属性到字典模式的性能塌方</title>
      <link>https://climberzbm.cn/posts/v8-对象属性的隐藏税-从-in-object-属性到字典模式的性能塌方-1787843850180</link>
      <description>delete 一个属性代价有多大？对象从快速模式跌入字典模式后，读写速度可以慢一个数量级。本文拆解 V8 的三种属性存储形态，用 benchmark 对照正反例，并给出躲开陷阱的 4 条工程化准则。</description>
      <pubDate>Thu, 27 Aug 2026 15:17:30 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/v8-对象属性的隐藏税-从-in-object-属性到字典模式的性能塌方-1787843850180</guid>
    </item>
    
    <item>
      <title>TypeScript 穷尽性检查的工程化落地：用 never 类型与可辨识联合打造零遗漏的状态机</title>
      <link>https://climberzbm.cn/posts/typescript-穷尽性检查的工程化落地-用-never-类型与可辨识联合打造零遗漏的状态机-1787843798561</link>
      <description>状态分支漏写会导致难以追踪的运行时 bug。本文通过 never 穷尽性检查、可辨识联合与 switch 默认分支的配合，展示如何把状态机分支遗漏从运行时错误前移到编译期，并给出正反例对比与工程化实践。</description>
      <pubDate>Thu, 27 Aug 2026 15:16:38 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/typescript-穷尽性检查的工程化落地-用-never-类型与可辨识联合打造零遗漏的状态机-1787843798561</guid>
    </item>
    
    <item>
      <title>React 自定义 Hook 的依赖黑洞：六个被忽视的闭包过期与内存泄漏场景</title>
      <link>https://climberzbm.cn/posts/react-自定义-hook-的依赖黑洞-六个被忽视的闭包过期与内存泄漏场景-1785585665562</link>
      <description>自定义 Hook 的依赖数组和清除函数是实现复用的关键，也是 Bug 的温床。本文从闭包过期、定时器泄漏、事件监听残留三个维度，用正反例剖析六个典型陷阱，给出工程级的规范化修复方案。</description>
      <pubDate>Sat, 01 Aug 2026 12:01:05 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/react-自定义-hook-的依赖黑洞-六个被忽视的闭包过期与内存泄漏场景-1785585665562</guid>
    </item>
    
    <item>
      <title>Vite ESM 产物与 V8 解析引擎的协同优化：从模块图谱到字节码的加载链路治理</title>
      <link>https://climberzbm.cn/posts/vite-esm-产物与-v8-解析引擎的协同优化-从模块图谱到字节码的加载链路治理-1785549765486</link>
      <description>深入剖析 Vite 开发模式下的 ESM 模块加载如何触发 V8 的惰性解析与流式编译，揭示模块图谱结构对首屏性能的影响，并提供从依赖预构建到模块预热的体系化优化策略。</description>
      <pubDate>Sat, 01 Aug 2026 02:02:45 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/vite-esm-产物与-v8-解析引擎的协同优化-从模块图谱到字节码的加载链路治理-1785549765486</guid>
    </item>
    
    <item>
      <title>React 自定义 Hook 的依赖黑洞：六个被忽视的闭包过期与内存泄漏场景</title>
      <link>https://climberzbm.cn/posts/react-自定义-hook-的依赖黑洞-六个被忽视的闭包过期与内存泄漏场景-1785549707048</link>
      <description>自定义 Hook 的依赖数组和清除函数是实现复用的关键，也是 Bug 的温床。本文从闭包过期、定时器泄漏、事件监听残留三个维度，用正反例剖析六个典型陷阱，给出工程级的规范化修复方案。</description>
      <pubDate>Sat, 01 Aug 2026 02:01:47 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/react-自定义-hook-的依赖黑洞-六个被忽视的闭包过期与内存泄漏场景-1785549707048</guid>
    </item>
    
    <item>
      <title>Node.js 与 ChatGPT API 的流式响应实践：从阻塞轮询到 Server-Sent Events 的架构演进</title>
      <link>https://climberzbm.cn/posts/node-js-与-chatgpt-api-的流式响应实践-从阻塞轮询到-server-sent-events-的架构演进-1785499255629</link>
      <description>深入剖析 Node.js 对接 ChatGPT API 的两种数据传输范式：阻塞轮询与 SSE 流式传输。从 ReadableStream 底层原理到生产级背压控制，用可运行的代码正反例厘清架构取舍。</description>
      <pubDate>Fri, 31 Jul 2026 12:00:55 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-与-chatgpt-api-的流式响应实践-从阻塞轮询到-server-sent-events-的架构演进-1785499255629</guid>
    </item>
    
    <item>
      <title>JavaScript 性能预算体系：从指标定义到 CI 门禁的工程化落地</title>
      <link>https://climberzbm.cn/posts/javascript-性能预算体系-从指标定义到-ci-门禁的工程化落地-1785463489339</link>
      <description>性能预算不是拍脑袋的数字游戏。本文从 Lighthouse 指标筛选、预算基线制定、webpack/Vite 构建集成到 CI 自动化拦截，构建一套完整的 JavaScript 前端性能预算工程化体系，让性能回归可量化、可追溯、可阻断的工程防线。</description>
      <pubDate>Fri, 31 Jul 2026 02:04:49 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-性能预算体系-从指标定义到-ci-门禁的工程化落地-1785463489339</guid>
    </item>
    
    <item>
      <title>Node.js 流式管道实战：用 Transform 流实现 ChatGPT 响应的实时转译与速率控制</title>
      <link>https://climberzbm.cn/posts/node-js-流式管道实战-用-transform-流实现-chatgpt-响应的实时转译与速率控制-1785412858906</link>
      <description>深入 Node.js Stream 管道机制，手写 Transform 流对 ChatGPT SSE 响应做实时转译、节流与缓冲合并，结合 React useReducer 构建稳定可恢复的流式消费管道。</description>
      <pubDate>Thu, 30 Jul 2026 12:00:58 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/node-js-流式管道实战-用-transform-流实现-chatgpt-响应的实时转译与速率控制-1785412858906</guid>
    </item>
    
    <item>
      <title>GPT API 流式响应的工程化治理：背压控制、断线重连与消费端的 5 层防线</title>
      <link>https://climberzbm.cn/posts/gpt-api-流式响应的工程化治理-背压控制-断线重连与消费端的-5-层防线-1785326451454</link>
      <description>前端侧消费 ChatGPT Streaming Response 时，简易实现会面临内存溢出、网络断开后数据丢失、render 频率过高这三座大山。本文用 5 层防线构建生产级流式处理器，每一层都附带正反例代码对比。</description>
      <pubDate>Wed, 29 Jul 2026 12:00:51 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/gpt-api-流式响应的工程化治理-背压控制-断线重连与消费端的-5-层防线-1785326451454</guid>
    </item>
    
    <item>
      <title>将 ChatGPT 嵌入 TypeScript 编译管线：用 CLI 工具自动化生成类型声明与单元测试</title>
      <link>https://climberzbm.cn/posts/将-chatgpt-嵌入-typescript-编译管线-用-cli-工具自动化生成类型声明与单元测试-1785240043970</link>
      <description>手动编写上百个 API 响应类型和单元测试的样板代码是一种浪费。本文提出一种工程化方案——用 ChatGPT API 作为编译管线中的代码生成器，通过 TypeScript Compiler API 提取接口签名，结合结构化 Prompt 和确定性校验层，将 AI 输出可控地融入 CI 流程。</description>
      <pubDate>Tue, 28 Jul 2026 12:00:43 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/将-chatgpt-嵌入-typescript-编译管线-用-cli-工具自动化生成类型声明与单元测试-1785240043970</guid>
    </item>
    
    <item>
      <title>V8 去优化的 5 个隐蔽触发场景：从代码形状到性能回退的实战对照</title>
      <link>https://climberzbm.cn/posts/v8-去优化的-5-个隐蔽触发场景-从代码形状到性能回退的实战对照-1785204220565</link>
      <description>TurboFan 的激进优化不是免费的午餐——一次不经意的参数类型切换就能让热函数退回解释执行。本文用 5 个可复现的场景 + 正反例对照，拆解 V8 去优化的触发机制、d8 诊断方法与规避策略。</description>
      <pubDate>Tue, 28 Jul 2026 02:03:40 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/v8-去优化的-5-个隐蔽触发场景-从代码形状到性能回退的实战对照-1785204220565</guid>
    </item>
    
    <item>
      <title>JavaScript 垃圾回收的性能暗面：从新生代 Scavenge 到老生代 Mark-Compact 的 GC 工程化避坑</title>
      <link>https://climberzbm.cn/posts/javascript-垃圾回收的性能暗面-从新生代-scavenge-到老生代-mark-compact-的-gc-工程化避坑-1785204214313</link>
      <description>V8 的垃圾回收并非免费午餐。本文从 Orinoco 并行回收器入手，拆解新生代 Scavenge 与老生代 Mark-Compact 的触发条件与性能代价，剖析短命对象池化、Hidden Class 迁移污染与增量标记的 stop-the-world 规避策略，提供 5 个生产级场景下的 GC 友好编码范式。</description>
      <pubDate>Tue, 28 Jul 2026 02:03:34 GMT</pubDate>
      <guid>https://climberzbm.cn/posts/javascript-垃圾回收的性能暗面-从新生代-scavenge-到老生代-mark-compact-的-gc-工程化避坑-1785204214313</guid>
    </item>
    
  </channel>
</rss>