Node.js使用require引入含import的JS模块报错该如何解决?
问题解决方案
报错原因
你要引入的simple_math/index.js属于ES模块(ESM)规范,内部使用import语法导入依赖,而你当前的脚本默认是CommonJS规范,不能直接用require导入ESM格式的模块,因此触发语法错误。
可选解决方案
方案1:将自己的脚本改为ESM规范
操作步骤:- 确保你使用的Node.js版本 >= 14.13(该版本开始稳定支持ESM规范)
- 二选一完成配置:
- 把你的脚本文件后缀改为
.mjs - 或者在项目根目录的
package.json文件中添加顶级字段"type": "module"
- 把你的脚本文件后缀改为
- 修改脚本代码为ESM导入语法,注意本地模块导入必须补全
.js后缀:
#!/usr/bin/env node import { pi } from './simple_math/index.js' console.log(pi)方案2:不改动脚本规范,使用动态
import()导入ESM模块
CommonJS规范支持调用动态import()方法,该方法返回Promise,你可以用链式调用或者async/await写法接收导出的常量:
链式调用写法:#!/usr/bin/env node import('./simple_math/index.js').then(simpleMath => { console.log(simpleMath.pi) })async/await简化写法:
#!/usr/bin/env node (async () => { const { pi } = await import('./simple_math/index.js') console.log(pi) })()可选方案:如果
simple_math是你自己维护的模块,可以将其编译为同时支持ESM和CommonJS的同构模块,后续两种规范的脚本都可以直接导入,第三方依赖无需做此改动。
内容的提问来源于stack exchange,提问作者David Davó
相关产品推荐
相关产品推荐

