import { fileURLToPath } from 'node:url';
import path from 'node:path';
const dir = path.dirname(fileURLToPath(import.meta.url));

给项目加了模块类型声明之后,原来读配置文件的代码直接报 ReferenceError: __dirname is not defined in ES module scope,同一段代码上一步还能跑,现在只能换别的方式取路径。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:这两个目录变量是 CommonJS 注入进来的,新的模块作用域里根本没有,得自己从模块的地址推出所在目录,再拼出需要的文件路径。

这次卡住的地方就在「ESM __dirname」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:先用内置方法把模块地址转成普通的文件路径;再用路径模块取出这个文件所在的那层目录来;把这套取路径的逻辑封成函数,各处统一调用。

确认没问题再收工,配置文件能正常读到,启动时不再报未定义,写日志的路径也正确。

作者 9823189