Node的
'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
问题在于
在编写本文时,还没有任何环境支持ES6模块。在Node.js中使用它们时,需要使用Babel之类的方法将模块转换为CommonJS。但这到底是怎么发生的呢?
许多人认为
ES6
// input
export const foo = 42;
export default 21;
// output
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;
这里我们可以看到,默认导出成为
我们可以通过两种方式导入模块:使用CommonJS或使用ES6
你的问题:我相信你正在做如下的事情:
var bar = require('./input');
new bar();
期望
null
var bar = require('./input').default;
null
import bar from './input';
console.log(bar);
巴别塔会把它变成
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
您可以看到,对
Felix Kling对这两者做了一个很好的比较,对于那些想知道如何在nodejs中使用module.exports与命名exports一起执行导出默认值的人来说
module.exports = new DAO()
module.exports.initDAO = initDAO // append other functions as named export
// now you have
let DAO = require('_/helpers/DAO');
// DAO by default is exported class or function
DAO.initDAO()
您需要在项目中正确配置babel,以使用export default和export const foo
npm install --save-dev @babel/plugin-proposal-export-default-from
然后在。babelrc中添加以下配置
"plugins": [
"@babel/plugin-proposal-export-default-from"
]