Node 的 module.exports
和 ES6 的 export default
什么区别?我试图弄清楚为什么我在 Node.js 6.2.2 中尝试 export default
时得到“__ 不是构造函数”错误。
什么有效
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This works
module.exports = SlimShady
什么 不起作用
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This will cause the "SlimShady is not a constructor" error
// if in another file I try `let marshall = new SlimShady()`
export default SlimShady
原文由 Marty Chang 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题在于
ES6 到 CommonJS
在撰写本文时,没有任何环境原生支持 ES6 模块。在 Node.js 中使用它们时,您需要使用 Babel 之类的东西将模块转换为 CommonJS。但是这到底是怎么发生的呢?
很多人认为
module.exports = ...
等价于export default ...
和exports.foo ...
等价于export const foo = ...
。但这并不完全正确,或者至少不是 Babel 是如何做到的。ES6
default
导出实际上也 被命名为 导出,除了default
是一个“保留”名称并且有特殊的语法支持。让我们看看 Babel 是如何编译命名和默认导出的:在这里我们可以看到默认导出成为
exports
对象上的一个属性,就像foo
一样。导入模块
我们可以通过两种方式导入模块:使用 CommonJS 或使用 ES6
import
语法。您的问题: 我相信您正在做类似的事情:
期望
bar
被分配默认导出的值。但正如我们在上面的示例中看到的,默认导出分配给了default
属性!所以为了访问默认导出,我们实际上必须做
如果我们使用 ES6 模块语法,即
Babel 会将其转换为
可以看到每次访问
bar
都转换为访问.default
。