Node.js从12.x自动升级到16.x后调用.NET Web服务时出现ERR_REQUIRE_ESM错误
Node.js从12.x自动升级到16.x后调用.NET Web服务时出现ERR_REQUIRE_ESM错误
嘿,这个问题我太熟了!Node.js 16对ES模块(ESM)和CommonJS(CJS)的边界把控比12.x严格多了,你遇到的错误本质是:dateformat这个包在新版本里改成了纯ES模块,但你的依赖ws.js里的security.js还在用传统的require()去加载它,这就触发了Node.js的兼容性限制。
给你几个可行的解决办法,按优先级排序:
修改
security.js的引入方式(官方推荐)
把原来的同步require改成动态import(),这是Node.js允许在CommonJS模块里加载ES模块的唯一合法方式。如果你的代码是异步环境,直接用await就行:// 替换原来的 const dateformat = require('dateformat'); async function yourSecurityLogic() { const { default: dateformat } = await import('dateformat'); // 这里继续写原来用dateformat的代码 }如果代码没法改成异步,也可以用Promise回调:
import('dateformat').then(({ default: dateformat }) => { // 在这里执行依赖dateformat的逻辑 });注意要解构出
default,因为ES模块的默认导出在动态import里是挂在default属性上的。降级
dateformat到兼容CommonJS的版本
如果你暂时不想改代码,可以安装dateformat的旧版本——比如3.0.3,这个版本还是CommonJS格式的,不会触发ESM错误:npm install dateformat@3.0.3 --save不过这只是临时方案,长远来看还是建议适配ES模块的加载方式。
检查并升级依赖包
看看ws.js和WCF.js有没有更新到修复了这个ESM兼容性问题的版本,直接升级可能一步到位:npm update ws.js wcf.js
其实这个问题是Node.js版本升级后很典型的模块格式冲突问题,16.x开始对ESM的规范执行更严格,很多老包要么升级成ESM,要么就需要调用方用动态import适配,选哪个方案看你项目的维护节奏啦!
备注:内容来源于stack exchange,提问作者Jason Kilhoffer
相关产品推荐
相关产品推荐

