文件a.js中有这么一个方法:
module.exports = (params) => {
...代码逻辑...
}
文件b.js中想调用a.js中的方法:
我的写法:
import obj from './a.js'
let a = new obj('参数')
结果报错:
_a.default is not a constructor
我在b.js中该如何调用?
文件a.js中有这么一个方法:
module.exports = (params) => {
...代码逻辑...
}
文件b.js中想调用a.js中的方法:
我的写法:
import obj from './a.js'
let a = new obj('参数')
结果报错:
_a.default is not a constructor
我在b.js中该如何调用?
9 回答10.2k 阅读
3 回答11.2k 阅读✓ 已解决
4 回答8.6k 阅读✓ 已解决
7 回答10.7k 阅读
2 回答11.2k 阅读✓ 已解决
6 回答2.4k 阅读
2 回答13.2k 阅读✓ 已解决
CommonJS 和 ESM 是两个不同的模块规范。如果混用的话,通常
import obj from "x.js"
是导入的默认对象,也就是.default
。试了,直接
import fn from "a.cjs"
是可以的注意在
"type": "module"
情况下,默认扩展名 (.js) 是 ESM,要 CommonJS 使用扩展名 .cjs。在默认 type 的情况下,默认扩展名是 CommonJS,ESM 要 .mjs 扩展名。
以上是 Node.js(我试验版本是 v16+)的处理,Babel 没试过。
Nodejs 文档 中说了,Node.js 的模块系统是按文件划分,每个文件可以是不同的模块系统
同时也说了,CommonJS 不能引用 ESM(即不能通过
reuqire()
来引用 ESM)在它的 ESM 文档 中 CommonJS Namespaces 一节提到了两种导入 default 的方法,也提到了可以通过
import * as something
来导入。如果module.exports
导出的是一个对象,import *
的时候会得到一个包含default
属性的对象,而它本身除default
属性外的基本属性和default
对象的属性相同。但如果module.exports
导出的是一个函数,import *
仍然是得到一个对象,而不是函数本身。但它的default
属性会是那个函数。具体可以自己去实测一下。