项目:my-ts-axios | 版本:v1.2 | 生成日期:2026-10-06 | 依据:源码分析
这是整套 21 篇文档(0020)的最后一篇,承担两个收束职能。其一是术语表:把前 20 篇反复使用、但散落在各篇中的领域术语集中定义——每个术语给出精确定义、源码锚点与"详见篇目",让新读者可以从任何一篇跳进来时都有统一的词汇表兜底。其二是索引:先给出 19》已经论证过的内容,标注篇目引用而非重复论证。术语排序按"概念层级"组织(先架构级、再链路级、后工程级),检索建议用目录跳转。src/ 下全部源文件与篇目的反向映射(按文件查文档),再给出四条按任务组织的阅读路径(按目的查文档)。与前序篇目的分工是:本篇不引入任何新的分析结论,所有定义与指引都收束自《00
| 术语 | 定义 | 源码锚点 | 详见 |
|---|---|---|---|
| 混合对象(Hybrid Object) | 既是可调用函数、又挂载全套方法与属性的单一对象;由绑定函数加属性拷贝构成,是 axios 与每个 axios.create() 产物的运行时形态 | src/axios.ts 第 18src/helpers/util.ts extend 第 21 | 《01》3.1、《16》ADR-001、《18》走读一 |
| 适配器(Adapter) | 实现统一签名 (config) => AxiosPromise 的传输实现,负责真正收发字节;三内置为 xhr/http/fetch,用户可经 config.adapter 以函数/命名/数组三形态注入 | src/core/adapters/*;签名 src/types/index.ts 第 163 行 | 《02》5、《07》4、《11》SOP 一 |
| 适配器注册表 | 模块加载时求值的 knownAdapters 映射表;xhr 条件注册(无 XMLHttpRequest 记 null),http/fetch 无条件注册;解析时归一为数组线性扫描 | src/core/getAdapter.ts 第 10~53 行 | 《01》3.2、《16》ADR-005 |
| 回退数组(Adapter Fallback) | config.adapter 为数组时依次尝试的语义;命名适配器不可用静默跳过,全部失败抛列出可用名的普通 Error | src/core/getAdapter.ts 第 31~52 行 | 《02》5、《16》ADR-005 |
| 双端构建 | 一份 src/ 产出三种产物:Node CJS、打包器 ESM、浏览器 UMD;Node 构建 external 内置模块,浏览器构建 alias 到 shim | rollup.config.mjs 第 34~61 行 | 《14》2、《01》3.7、《16》ADR-007/008 |
| shim(占位实现) | 浏览器构建中替代 Node 内置模块与 form-data 的"调用即抛错"占位文件;使 UMD 产物零 external、自包含 | src/shims/node-builtins.ts 全文 15 行 | 《07》7、《12》2.3、《16》ADR-007 |
| external(外部依赖) | 打包时不打入产物、保留 import/require 引用的模块;Node 构建声明 http/https/zlib/stream/form-data 为 external | rollup.config.mjs 第 14~15 行 | 《14》2.2、《17》3.1 |
| 深合并(deepMerge) | 递归合并普通对象、数组与原始值直接覆盖的合并算法;容器为无原型对象 | src/helpers/util.ts 第 40~62 行 | 《07》6.1、《02》2 |
| 无原型对象(Prototype-less Object) | Object.create(null) 产出的没有原型链的对象;mergeConfig 的策略表与结果对象均如此,封死原型键注入面 | src/core/mergeConfig.ts 第 4、53 行 | 《16》ADR-012、《08》2.3 |
| 术语 | 定义 | 源码锚点 | 详见 |
|---|---|---|---|
| Promise 链编排 | 把请求生命周期折叠为一条动态拼装链:请求拦截器 unshift 链头(后注册先执行)、dispatchRequest 居中、响应拦截器按注册序追加链尾;错误传播借 Promise 原生语义 | src/core/Axios.ts 第 82~102 行 | 《01》3.3、《05》流程一、《16》ADR-002 |
| 拦截器(Interceptor) | 经 use 注册的加工钩子对(resolved, rejected);请求侧加工 config,响应侧加工 response 或处理错误;eject 以 id 摘除(槽位置 null) | src/core/InterceptorManager.ts 全文 | 《02》3、《05》流程二、《07》3.4 |
| synchronous(同步快路径) | 请求拦截器全部声明 synchronous: true 时,在调用栈内倒序加工配置、只保留一次 then 的路径;all-or-nothing;同步抛错直达调用方 | src/core/Axios.ts 第 71~80 行 | 《10》2.2、《16》ADR-003、《19》2.2 |
| runWhen(条件拦截器) | 拦截器的可选选项:返回 false 时在收集阶段被过滤,连链都不进、零 microtask | src/core/Axios.ts 第 54~68 行 | 《16》ADR-004、《19》2.2 |
| dispatchRequest(分发环节) | 链的中心环节:取消预检 → processConfig(url/data/headers 三连加工)→ 取适配器调用 → 成败两分支的响应转换 | src/core/dispatchRequest.ts 第 8~28 行 | 《07》3.2、《18》走读二、《01》2 |
| 拍平(flattenHeaders) | 把 common + method + 顶层三层 headers 深合并为一个平面对象并删除分层键;发生在 data 转换之后、进适配器之前 | src/helpers/headers.ts 第 64~81 行 | 《01》2、《07》6.3 |
| settle(成败判定) | 三适配器共享的最终裁判:validateStatus 放行即 resolve,否则按 500 界限生成 ERR_BAD_REQUEST/ERR_BAD_RESPONSE 并写入 error.status | src/core/settle.ts 全文 33 行 | 《07》3.7、《09》5.2、《16》ADR-011 |
| 转换器(Transformer) | transformRequest/transformResponse 的函数(或数组),按序串行执行 data = fn(data, headers);默认实现在 defaults 与 helpers/data | src/core/transform.ts 全文;src/defaults.ts 第 36~62 行 | 《02》4、《07》2.3、6.4 |
| 双轨取消 | CancelToken(旧)与 AbortSignal(新)两套取消机制并存;isCancel 对两轨统一判定 | src/cancel/*;Cancel.ts 第 12~14 行 | 《02》6、《05》流程四、《16》ADR-006、《19》2.4 |
| CancelToken | 旧式取消令牌:executor 注入 cancel 函数,取消即 resolve 内部 Promise<Cancel>;重复取消幂等;source() 为糖 | src/cancel/CancelToken.ts 全文 42 行 | 《02》6.1、《07》5.1 |
| CanceledError | 新式取消错误:AxiosError 子类,固定 code ERR_CANCELED;signal 轨与"取消先于请求"场景的 reject 值 | src/cancel/CanceledError.ts 全文 20 行 | 《07》5.3、《12》2.4 |
| 取消预检(Cancellation Precheck) | dispatchRequest 开头对 cancelToken.throwIfRequested() 与 signal.aborted 的双查,拦截"取消发生在发请求之前"的时序 | src/core/dispatchRequest.ts 第 50~58 行 | 《18》3.3、《19》2.4 |
| transitional(过渡配置) | 向后兼容语义的开关组:silentJSONParsing(声明未消费 ⚠️ 待确认)、forcedJSONParsing(跳过响应转换)、clarifyTimeoutError(超时码改 ETIMEDOUT) | src/defaults.ts 第 69dispatchRequest.ts 第 39 | 《13》2.1、《15》4 |
| 策略合并(Strat Merge) | mergeConfig 的字段级合并:url/params/data 只认本次(fromVal2Strat)、headers/auth 深合并(deepMergeStrat)、其余本次优先缺省回退(defaultStrat);显式 falsy 即生效 | src/core/mergeConfig.ts 全文 | 《02》2、《18》走读三、《16》ADR-012 |
| 预检响应转换(失败分支补转换) | dispatchRequest 失败分支对携带 response 的错误补跑 transformResponse,保证 4xx/5xx 的 error.response.data 已解析 | src/core/dispatchRequest.ts 第 15~20 行 | 《01》2、《18》3.1 |
| 术语 | 定义 | 源码锚点 | 详见 |
|---|---|---|---|
| 覆盖率硬门槛 | Jest 全局四项阈值(branches 80 / functions 85 / lines 90 / statements 90),不达标即测试失败;豁免面受控(node_modules/test/shims) | package.json 第 83~95 行 | 《09》4、《16》ADR-010 |
| 冒烟检查(smoke-dist) | 发布前以消费者身份加载三产物并断言导出面与 VERSION 同步的脚本;坏包事故的回归闸门 | scripts/smoke-dist.cjs 全文 | 《09》6、《16》ADR-008 |
| exports:'default' | Rollup CJS 输出模式:源码单 default 导出直接翻译为 module.exports = axios,require 直得函数而非 {default} 包装 | rollup.config.mjs 第 42、56 行 | 《16》ADR-008、《12》2.2 |
| jasmine-ajax 兼容引导 | jest-circus 时代手动引导独立 jasmine-core 环境供 jasmine-ajax 使用的 boot 层;jasmine-core 锚定 3.x | test/boot.ts 全文 39 行 | 《09》3、《16》ADR-009 |
| 提交链路 | husky(pre-commit)→ lint-staged(prettier+eslint 暂存文件)→ commitizen(交互式生成)→ commitlint(校验)的四环闭环 | package.json 第 58 | 《06》6、《17》3.5 |
| CI 矩阵 | GitHub Actions 在 Node 20/22 双版本上执行 lint → test(含覆盖率门槛)→ build → examples:build | .github/workflows/ci.yml | 《09》7、《13》2.5 |
| XSRF 防护 | 从 cookie 读 XSRF-TOKEN 写入 X-XSRF-TOKEN 请求头;xhr/fetch 两端实现,withXSRFToken 可布尔或函数 | src/helpers/cookie.ts;xhr.ts 第 135~161 行一带 | 《08》4、《07》4.1 |
| CONNECT 隧道 | Node 端 HTTPS 代理的建连方式:向代理发 CONNECT 请求,非 200 抛本项目专有码 ERR_PROXY | src/core/adapters/http.ts 第 456~547 行一带 | 《05》流程五、《13》条目 7 |
| 限速(maxRate) | Node 专属的上行/下行速率限制:滑动窗口计算瞬时速率、延迟放行实现平均限速;进度事件附 rate/estimated | src/helpers/progressStream.ts 全文 | 《10》3.3、《07》6.8 |
| ERR_PROXY | 本项目自增错误码(官方不存在),标记代理建连失败;保留但需登记使用 | src/helpers/error.ts 第 16 行 | 《13》2.4、《15》4.4 |
| 债务自白传统 | 每次事故在源码留一行注释 + 在测试留一个回归用例的维护惯例;是本库决策史的第一手材料 | util.ts 第 25smoke-dist.cjs 第 1settle.spec.ts 注释等 | 《13》4、《16》4 |
六组术语在阅读中极易互串,单独立一条辨析。其一,Cancel / CanceledError / isCancel:Cancel 是旧轨的取消原因对象(只有 message 字段,src/cancel/Cancel.ts),CanceledError 是新轨的取消错误(AxiosError 子类,code 固定 ERR_CANCELED),isCancel 是横跨两轨的判定函数——用 instanceof Cancel 判定会漏掉 signal 轨的拒绝值,用 isCancel 则两轨通吃;官方 v1 里 Cancel 是 CanceledError 的别名,本项目刻意保持两类(《13》D 级取舍)。其二,适配器与传输(transport):适配器是 (config) => AxiosPromise 签名的库级抽象;transport 是 http 适配器内部的一个更小的替换点(config.transport,可整体替换 http/https 模块的调用者)——前者换"策略",后者换"socket 来源",不在一个抽象层级。其三,shim 与 stub 与 mock:shim 特指构建期替身(浏览器构建中顶替 Node 内置模块,调用即抛错);stub 与 mock 是测试语汇(test/boot.ts 引入的 jasmine-ajax 属于 mock——接管真实 XHR 并回放响应)。三者的共同点是"占住接口的位置",差异在生效时机:shim 在打包时决定、mock 在测试运行时接管。其四,exports:'default' 与 named exports:前者是 Rollup 对"源码只有默认导出"的 CJS 翻译策略(module.exports 直得函数),后者会产出 {default} 包装——本项目选前者并有坏包事故背书。其五,synchronous 拦截器与同步异常:synchronous 是注册选项(描述拦截器可同步执行),不是"错误同步抛出"的开关——同步快路径里拦截器抛错确实会同步抛出,但那是调用栈位置的副产品而非选项语义本身。其六,transformer 与 interceptor:转换器加工的是数据(data + headers,纯管道,无 reject 能力),拦截器加工的是链路环节(config/response,可以抛错、可以返回 rejected promise 改变控制流);把"改个请求头"写成拦截器还是转换器,取决于要不要控制流能力。
下表覆盖 src/ 目录全部 29 个源文件(实测清单;若以 30 计,差异或来自把目录本身计入,本索引以 find src -type f 的实际结果为准),给出每个文件的一句话职责与主要篇目落点。行号与行数以当前版本为准(行数见《07》各节标题)。按文件查文档时,先看"主要篇目",需要更细的逐函数说明再看《07》对应小节。
| 文件 | 一句话职责 | 主要篇目 |
|---|---|---|
src/index.ts | 库唯一出口:export * from types + default axios | 《07》2.1、《03》1、《15》2.1 |
src/axios.ts | createInstance 工厂 + 默认实例 + 16 项静态挂载 | 《07》2.2、《01》3.1、《16》ADR-001/008、《18》走读一、《15》2.2 |
src/defaults.ts | 默认配置、默认转换器、validateStatus、transitional、env.FormData | 《07》2.3、《02》10、《04》1.1、《19》2.1 |
src/types/index.ts | 全部公共类型(307 行,唯一无实现文件) | 《07》8、《02》11、《03》3、《15》3/4、《04》1 |
src/core/Axios.ts | request 编排 Promise 链 + 方法族 + getUri + postForm 系 | 《07》3.1、《05》流程一/二、《16》ADR-002/003/004、《01》3.3、《02》9 |
src/core/InterceptorManager.ts | 拦截器有序容器(use/forEach/eject)与 InterceptorOptions | 《07》3.4、《02》3、《16》ADR-004 |
src/core/dispatchRequest.ts | 取消预检 + processConfig 三连加工 + 适配器调用 + 响应转换 | 《07》3.2、《18》走读二、《05》流程一/四、《01》2 |
src/core/mergeConfig.ts | 策略模式字段级合并(三类策略、无原型表与结果) | 《07》3.3、《02》2、《18》走读三、《16》ADR-012、《04》2 |
src/core/getAdapter.ts | 适配器注册表与三形态解析(函数/命名/数组回退) | 《07》3.6、《01》3.2、《16》ADR-005、《11》SOP 一 |
src/core/settle.ts | 三适配器共享的 validateStatus 成败判定 | 《07》3.7、《09》5.2、《16》ADR-011、《05》流程三 |
src/core/transform.ts | 转换器串行管道执行器(18 行) | 《07》3.5、《02》4 |
src/core/AxiosHeaders.ts | 小写规范化键名的首部容器类(官方方法子集) | 《07》3.8、《02》7、《13》2.6(方法面取舍) |
src/core/adapters/xhr.ts | XMLHttpRequest 适配器(进度/XSRF/双轨取消,205 行) | 《07》4.1、《09》5.1、《12》2.1(headers 回写坑)、《13》条目 5 |
src/core/adapters/http.ts | Node http/https 适配器(重定向/代理/解压/限速/流,551 行) | 《07》4.2、《05》流程五、《08》3.2、《10》4、《12》2.3、《01》3.7 |
src/core/adapters/fetch.ts | 全局 fetch 适配器(SW/Workers;内部 AbortController 收敛中断源,317 行) | 《07》4.3、《03》4(差异清单)、《13》2.6(无上传进度) |
src/cancel/CancelToken.ts | 旧式取消令牌(executor + 手工 resolve 的 promise) | 《07》5.1、《02》6.1、《05》流程四、《16》ADR-006、《19》2.4 |
src/cancel/Cancel.ts | 旧版取消原因类 + isCancel 双轨统一判定 | 《07》5.2、《12》2.4、《16》ADR-006 |
src/cancel/CanceledError.ts | 新式取消错误(AxiosError 子类,ERR_CANCELED) | 《07》5.3、《02》6.2、《12》2.4 |
src/helpers/util.ts | isDate/isPlainObject/extend(原型链拷贝)/deepMerge/isFormData | 《07》6.1、《16》ADR-001、《18》2.2、《01》3.1 |
src/helpers/url.ts | buildURL/isAbsoluteURL/combineURL/isURLSameOrigin | 《07》6.2、《08》2.1(编码白名单)、《02》8 |
src/helpers/headers.ts | processHeaders/parseHeaders/flattenHeaders | 《07》6.3、《01》2、《02》8 |
src/helpers/data.ts | 默认 transformRequest/transformResponse 实体(24 行) | 《07》6.4、《04》3(data 形态矩阵)、《02》8 |
src/helpers/error.ts | AxiosError 类、13 错误码常量、createError、isAxiosError | 《07》6.5、《04》1.3、《15》4.4、《11》SOP 四、《13》条目 4/7 |
src/helpers/cookie.ts | document.cookie 读取(XSRF 用,8 行) | 《07》6.6、《08》4 |
src/helpers/formData.ts | toFormData/formToJSON(dots/indexes/visitor) | 《07》6.7、《13》条目 2/3(metaTokens/maxDepth)、《19》2.5 |
src/helpers/progressStream.ts | Node 进度统计 + 限速 Transform 流 | 《07》6.8、《10》3.3、《19》2.5 |
src/helpers/proxyFromEnv.ts | HTTP_PROXY/HTTPS_PROXY/ALL_PROXY/NO_PROXY 推导 | 《07》6.9、《05》流程五、《08》3.2 |
src/helpers/HttpStatusCode.ts | 完整状态码常量表(纯数据,70 行) | 《07》6.10、《15》2.2 |
src/shims/node-builtins.ts | 浏览器构建占位(调用即抛错,15 行) | 《07》7、《16》ADR-007、《14》2.2、《12》2.3、《01》3.7 |
四条路径的共性结构是"一篇 SOP 打头、源码锚点居中、质量闸门收尾":SOP 告诉你步骤,源码锚点让你在改之前知道行为边界,质量闸门(覆盖率、CI、冒烟)替你验证改动没有破坏契约。路径之间可以交叉引用——例如路径一(新增适配器)走到"注册进注册表"一步时会自然需要路径四的准备清单,因为那已经是贡献代码。使用时不必线性读完,先找与自己任务同名的小节,沿其中的篇目引用按需跳转即可;每条路径的起点篇目都假设读者尚未读过任何文档,从零开始也不会迷路。若四条路径都不能覆盖你的任务,退回两篇总纲重读:《00》第 6 节的源码阅读路线(面向"读代码")与本篇第 3 节的反向索引(面向"查文件")——前者给顺序,后者给定位,两者组合等价于一份自导的阅读计划。
起点《11-扩展开发指南》SOP 一(完整操作清单),配合顺序建议如下。第一步读《02-模块设计》第 5 节,理解 AxiosAdapter 签名与三适配器的横切对照表(取消/超时/进度/headers 在每个适配器的落点)。第二步以 src/core/adapters/xhr.ts(205 行,全库最短)为模板通读一遍,注意它对 settle 的调用与 cleanup 的幂等清理形态。第三步看 src/core/getAdapter.ts:新适配器要么在 knownAdapters 注册一个键(可被命名引用),要么只作为函数适配器由用户直接传入;注册时同步思考环境探测(xhr 的条件注册形态是范本,《16》ADR-005)。第四步读《09-测试与质量保障》5.1/5.5 节并仿写测试——xhr 系用 jasmine-ajax、http 系用真实本地服务器,你的适配器选哪条路。最后自查三件事:覆盖率门槛(ADR-010)是否会卡住新分支、若引入新的 Node 内置 API 是否需要同步 src/shims/node-builtins.ts(ADR-007 的同步契约)、新行为是否需要登记进《03》差异清单。收尾跑 npm test 与 npm run build,CI 会替你复验一遍。
起点《12-FAQ与故障排查》2.4 节(Cancel/CanceledError/isCancel 的判定混淆是最常见根因),然后按数据流顺序排查。第一,确认判定姿势:两轨的 reject 值不同(Cancel 实例 vs CanceledError),用 axios.isCancel(e) 判定而不是 instanceof Cancel(《19》2.4 的行为对照)。第二,确认时序:取消发生在 dispatch 之前由 dispatchRequest.ts 第 5058 行的预检拦截,发生在请求进行中由适配器处理——若在 38 行剥离,运行环境需自查(runWhen 过滤后的同步快路径里取消,注意预检同样生效但错误形态不同(同步抛出,见《16》ADR-003 后果)。第三,确认环境与轨道:Node 端 signal 取消走 http.ts 的 abortCleanups 机制(取消的总是"当前跳"重定向,见《07》4.2),浏览器端走 xhr.ts 的 processSignal;fetch 端三个中断源收敛进内部 AbortController(《07》4.3)。第四,检查一个隐蔽杀手:开发机代理环境变量会劫持 http 适配器请求使取消表现异常——测试环境由 test/boot.ts 第 24httpAdapterEnvProxy.spec.ts 是验证范式)。第五,若需要"批量取消",确认多个请求共享的是同一个 token(2.4 节示例),而不是各自 source。全部排除后仍复现,按《12》第 3 节的排查决策树走,并在《05》流程四的时序图上标注卡点。
起点《14-配置与环境详解》全篇(rollup.config.mjs 逐段是第 2 节),它回答"构建配置每一行是什么"。典型三类问题的路径:产物导出形态不对(require 拿到 {default} 包装)→《16》ADR-008 与《12》2.2 节,确认 rollup 第 42 行 exports: 'default' 未被改动,并用 node scripts/smoke-dist.cjs 复验三种产物导出面;浏览器构建运行时抛"Node.js 内置模块 xxx 在浏览器构建中不可用" →《12》2.3 与《01》3.7 节,这是 shim 的正常防御抛错还是缺符号(http 适配器新用了未覆盖的内置 API),对照 src/shims/node-builtins.ts 的导出面与《17》3.1 节的 alias 机制定位;类型声明缺失或漂移 → package.json 的 build:types(tsc --declaration --emitDeclarationOnly)与 tsconfig(《14》3 节),diff dist/types/ 观察漂移面。构建问题修复后的固定动作:跑 npm run build 全链 + smoke-dist,确认四产物(cjs/esm/umd/types)全部通过——这套"以消费者身份检查自己"的流程正是坏包事故后建立的(ADR-008)。
起点《00-项目总览》第 6 节的阅读路线(axios.ts → Axios.request → dispatchRequest/mergeConfig → 适配器 → helpers),然后按顺序补齐四块背景。其一,架构约束:《01》第 5 节的三条依赖规则(core 不 import axios.ts、适配器只依赖 helpers/cancel/settle/types、helpers 无状态)——任何 PR 的 import 面先对照这三条。其二,质量门槛:《09》全篇,重点是覆盖率四阈值(新分支必须配对测试)、boot.ts 的 jasmine 兼容层(不要动全局命名空间)、istanbul ignore 的受控豁免惯例(全库仅 3 处,勿扩散)。其三,流程与提交:《06》第 6 节的提交链路(husky/lint-staged/commitizen/commitlint)与 .github/workflows/ci.yml 的四步门禁——commit 信息不符合 conventional 规范会直接被拦。其四,边界清单:《13》全篇,避免与已登记债务撞车(例如想修 xhr 就地修改 headers 时,先看条目 5 的建议方案);再看《16》的 12 条 ADR,理解"哪些是有意为之的取舍"(如 Cancel/CanceledError 双类并存是 D 级保留项,不要顺手合并)。准备就绪后按《11》SOP 六的完整验证清单执行:lint → test(覆盖率达标)→ build → smoke → examples:build,全绿再提交。
新增默认配置项走《11》SOP 三(类型声明 → defaults 默认值 → mergeConfig 策略选择 → 消费路径 → 测试五处齐全),合并策略语义的精读在《18》走读三。性能问题先读《10-性能设计与优化》第 6 节"已有实现的性能小结"确认是已知形态还是新问题,再按第 7 节的投入产出排序取建议;Promise 链构造成本的量化在《10》第 2 节,synchronous 快路径是现成的缓解手段(《19》2.2)。
至此 21 篇文档收束成一个闭环:《0006》建立"是什么"的全局图景,《0710》下沉到"每一行怎么工作",《1115》面向"怎么用、怎么扩展、怎么排障",《1620》补上"为什么这样设计、依赖是什么、代码长什么样、示例怎么跑"四个维度,而本篇把它们全部挂到一个可检索的词汇与索引系统上。三张索引各有分工:术语表解决"这个词什么意思",反向索引解决"这个文件在哪几篇里被讲透",任务路径解决"我想做 X 应该按什么顺序读"。最后重申整套文档的一条元约定(见《00》第 7 节):所有结论均来自对源码的逐文件阅读,凡无法闭环处一律 ⚠️ 待确认 而非猜测——目前已登记的待确认项包括 transitional.silentJSONParsing 的消费点、FormSerializerOptions.metaTokens/maxDepth 的消费点、_requestForm 未走 env.FormData 是否有意,以及本篇新增的《19》2.2 节示例页文案与实际执行顺序的出入。这些标记既是诚实的边界,也是后来者最好的入手点。