记录一下那天晚上的排查过程。Node 20 项目是 CommonJS,升级 openai 到 5.2.0 后 require('openai') 直接抛 ERR_REQUIRE_ESM,提示模块是 ES Module,回退到 4.x 就正常。

刚开始盯着「打包工具按 CJS 解析依赖」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。5.x 只发 ESM 不再提供 CJS 入口。少数情况下是项目 package.json 没有声明 type。

还有一种情况,运行时用了旧版 ts-node 配置。

第一件事是确认项目的模块类型

node -p "require('./package.json').type"

接着改成动态 import 加载 SDK

node -e "import('openai').then(m=>console.log(typeof m.default))"

然后把入口改成 mjs 并声明 type

node -p "JSON.stringify({type:'module'})"

剩下的就是用官方写法跑一次冒烟

node --input-type=module -e "import OpenAI from 'openai';console.log(typeof OpenAI)"

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

改完先别撤,确认这几项。动态导入成功,客户端能创建并返回模型列表,运行日志里不再出现 ERR_REQUIRE_ESM。

容易忽略的是,不要靠降级 SDK 拖着,5.x 的响应类型和错误类都变了,早改模块格式比后期补兼容便宜。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189