ノードの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
問題はあります
これを書いている時点では、ES6モジュールをネイティブにサポートしている環境はありません。 Node.jsでそれらを使用するときは、モジュールをCommonJSに変換するためにBabelのようなものを使用する必要があります。しかし、それはどのように正確に起こりますか?
多くの人がmodule.exports = ...
をexport default ...
に、exports.foo ...
をexport const foo = ...
に相当すると同等と見なしています。しかしそれは必ずしも真実ではない、あるいは少なくともBabelがどのようにそれをしているのかはそうではない。
ES6のdefault
エクスポートは、実際には named exportsでもあります。ただし、default
は「予約済み」の名前であり、特別な構文サポートがあります。 Babelが名前付きおよびデフォルトのエクスポートをどのようにコンパイルするかを見てみましょう。
// 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;
ここで、デフォルトのエクスポートがexports
のようにfoo
オブジェクトのプロパティになることがわかります。
モジュールをインポートする方法は2つあります。CommonJSを使用するか、ES6のimport
構文を使用する。
あなたの問題: /あなたはこんなことをしていると思います:
var bar = require('./input');
new bar();
bar
にデフォルトのエクスポートの値が割り当てられることを期待しています。しかし、上の例でわかるように、デフォルトのエクスポートはdefault
プロパティに割り当てられています。
そのため、デフォルトのエクスポートにアクセスするには、実際に行う必要があります。
var bar = require('./input').default;
ES6モジュールの構文を使うと、
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);
bar
へのすべてのアクセスが.default
へのアクセスに変換されていることがわかります。