Next.js 路由「dev 崩 / 生产正常」分歧的静态复现法(SWC)
背景:2026-08-10 盲审 hsd-cashflow(glm_return)时,收据路由
amountWords内const n被重新赋值—— tsc 报TS2588 Cannot assign to 'n' because it is a constant,但生产构建(next build压缩产物)实测正常。 原因:minifier 把const n并成了let(e=Math.floor(a)+e%=1e6)。即「生产碰巧能跑,dev 必崩」。
复现方法(无需启动 dev 服务器,只读)
用项目自带的 node_modules/@swc/core(next 的编译器),以未压缩模式(= dev 编译形态)transform 目标函数,再 node 执行:
const swc = require("<project>/node_modules/@swc/core/index.js");
const out = swc.transformSync(src, {
jsc: { parser: { syntax: "ecmascript" }, target: "es2017" },
module: { type: "commonjs" },
}).code;
// 写 out 到临时文件 → node 执行 → 观察 TypeError实测结果:amountWords(1234.56) → TypeError: Assignment to constant variable(dev 必现);生产压缩产物输出 ONE THOUSAND TWO HUNDRED AND THIRTY-FOUR AND 56 SEN ONLY。
适用场景与要点
- 适用:审查/修复 Next.js API 路由、工具函数时,怀疑「构建后行为与源码不一致」; 也适用于复现纯函数在 dev 下的崩溃,而不必起 dev server、不必造数据。
- 判断口径:只要 tsc 报错(尤其 TS2588/TS2551),先默认 dev 会崩;
ignoreBuildErrors:true的项目(本 app 的 next.config.ts)构建绿灯不能作为「没 bug」的证据。 - 注意:本项目
next.config.ts有typescript.ignoreBuildErrors: true,64 个 tsc 错误全被吞; 压缩产物验证只说明「当前构建器下侥幸正常」,不说明源码正确。