Nodemodule.exports
と ES6 の違いは何ですか? Node.js 6.2.2 でexport default
実行しようとすると、「__ はコンストラクターではありません」というエラーが発生する理由を解明しようとしています。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
ベストアンサー1
問題は
- CommonJS で ES6 モジュールをエミュレートする方法
- モジュールをインポートする方法
ES6 から CommonJS へ
これを書いている時点では、ES6 モジュールをネイティブにサポートする環境はありません。Node.js でそれらを使用する場合は、Babel などを使用してモジュールを CommonJS に変換する必要があります。しかし、それはどのように行われるのでしょうか?
多くの人は、module.exports = ...
は と同等でありexport default ...
、exports.foo ...
は と同等であると考えていますexport const foo = ...
。しかし、これは必ずしも正しくありません。少なくとも、Babel ではそうではありません。
ES6default
エクスポートは実際には名前付きエクスポートでもありますが、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
。
モジュールをインポートする
モジュールをインポートするには、CommonJS を使用するか、ES6import
構文を使用するかの 2 つの方法があります。
あなたの問題:次のようなことをしていると思います:
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
。