CommonJS模块通过require()加载ES Module触发实验性警告相关咨询
解决CommonJS模块用require()加载ES模块的实验性警告
警告内容翻译
实验性警告:CommonJS模块 /app/noop.js 正在使用require()加载ES模块 /app/...js;在require()中加载ES模块的支持为实验性功能,可能随时变更
问题本质
Node.js的CommonJS(CJS)与ES模块(ESM)是两套独立的模块规范,直接通过require()加载ESM属于未稳定的实验性功能,因此会触发该警告,且该特性的行为未来可能发生变化。
解决方案
- 把CommonJS模块转为ES模块
对/app/noop.js进行改造:将文件后缀改为.mjs,或者在项目根目录的package.json中添加"type": "module"字段,之后使用import语句替代require()来加载目标ES模块。 - 将目标ES模块转为CommonJS模块
修改被加载的/app/...js:将后缀改为.cjs,或者把代码中的export语句替换为module.exports,这样就能用require()正常加载,不会触发警告。 - 使用动态import()(官方推荐兼容方案)
在CommonJS模块中通过import()(返回Promise)异步加载ES模块,示例代码:async function loadTargetModule() { const targetModule = await import('/app/...js'); // 在这里使用模块导出的内容 } loadTargetModule(); - 临时屏蔽警告(不推荐)
若仅需临时隐藏该警告,可在启动Node时添加--no-warnings参数,但这会屏蔽所有警告信息,不利于排查其他潜在问题,仅作为应急方案:node --no-warnings /app/noop.js
内容的提问来源于stack exchange,提问作者ButteryAvocado
相关产品推荐
相关产品推荐

