同一份代码在开发工具里跑得好好的,用 node 直接启动就报 Error [ERR_MODULE_NOT_FOUND]: Cannot find module ‘/app/utils’ imported from /app/index.js,路径肉眼看着完全没错,补上后缀才肯放行。日志里能对上时间点,这种反而好排。

ESM 的解析规则不允许省略扩展名,也不会自动补目录下的入口文件,而编译产物里的导入还是源码写法,运行时按严格路径去找自然落空。这一点先确认清楚,后面就不用反复试。

// 源码里就写 .js,编译后才对得上
import { fmt } from './utils/date.js';

「ERR_MODULE_NOT_FOUND」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

处理上按这个顺序:把相对导入的路径都补全成带文件后缀的写法;编译配置里用 NodeNext 让编译器提前检查;目录导入统一改写成显式写出的那个入口文件名。

结果对不对很好判断,启动不再报模块找不到,导入路径和编译产物对得上,功能也正常。

作者 9823189