跳转至

2026-04-29 学习日志

今日主题

  • Claude Code thinking 控制:alwaysThinkingEnabled vs effortLevel
  • React useEffect 依赖机制

新增认知

Claude Code thinking 控制:alwaysThinkingEnabled vs effortLevel

  • alwaysThinkingEnabled 和 effortLevel 是 Claude Code 中两个不同层次的控制:alwaysThinkingEnabled 是 thinking 的开关(是否启用 thinking 模式),effortLevel 是 thinking 的旋钮(思考投入多深)。前者控制启停,后者控制投入量,两者不冲突。
  • alwaysThinkingEnabled 是一个布尔开关,仅决定 thinking 开启或关闭。代码中只在 shouldEnableThinkingByDefault() 中出现:为 false 时强制关闭,不设或为 true 时默认开启(前提是模型支持)。
  • effortLevel 是一个分级参数(low/medium/high/max),在 thinking 已开启的前提下控制模型投入的推理资源量。通过 resolveAppliedEffort() 层层解析(环境变量 CLAUDE_CODE_EFFORT_LEVEL → 用户设置 → 模型默认值),最终影响发送给 API 的 thinking 预算。
  • 两者的关系类似于开关与音量旋钮:alwaysThinkingEnabled 决定要不要 thinking,effortLevel 决定 thinking 要用多大力度。在 UI 中,Config 面板的 Thinking mode 切换控制的是 alwaysThinkingEnabled,而 /effort 命令控制的是 effortLevel。

React useEffect 依赖机制

  • useEffect 的三种依赖模式([]、[deps]、不传)不是三条独立规则,而是同一设计原则的推论:'render 后对比新旧 dep,有变化才执行'。
  • 空数组 [] 每次对比 0 个元素(for 循环体执行 0 次),结论永远是'没变化',所以只 mount 时执行一次。不是'[]=不做',而是'没东西可比=不用更新'。
  • 不传 dep 时 React 无法做任何对比,保守策略是每次渲染都执行。直觉上'不填=不做'恰好反了,实际上是'没法判断=宁可多做'。
  • 第一次 mount 无论如何都执行,是因为没有旧 dep 可比,语义上等价于'从无到有,肯定变了'。
  • 这个 dep 对比机制(Object.is 逐个比,全等则跳过)同样适用于 useMemo、useCallback、useLayoutEffect,一通百通。