[解決済み] Node.jsとES6におけるmodule.exportsとexport defaultの比較
質問
Nodeの
module.exports
とES6の
export default
? を実行しようとすると、 "__ is not a constructor" というエラーが表示されるのはなぜでしょうか?
export default
をNode.js 6.2.2で使用しています。
動作内容
'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
解決方法は?
問題は
- CommonJSでES6モジュールがどのようにエミュレートされているか
- モジュールのインポート方法
ES6からCommonJSへ
この記事を書いている時点では、ES6モジュールをネイティブでサポートしている環境はありません。Node.jsで使用する場合は、Babelのようなものを使ってモジュールをCommonJSに変換する必要があります。しかし、それは具体的にどのように行われるのでしょうか?
多くの人は
module.exports = ...
と同等です。
export default ...
と
exports.foo ...
と同等になるように
export const foo = ...
. しかし、それは全く正しくありませんし、少なくともBabelのやり方とは異なります。
ES6
default
のエクスポートは、実は
という名前
を除いては
default
はquot;reserved"の名前で、特別な構文がサポートされています。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
.
関連
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsのmodule.exportsとexportsの比較
-
[解決済み] JavaScriptの "export default "とは何ですか?
-
[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】エラーです。EACCES: 権限が拒否されました、アクセス '/usr/local/lib/node_modules' 。
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み] AWS s3 api error: specified bucket does not exist.
-
[解決済み] Heroku "状態が起動から停止に変更されました SIGTERMで全プロセスを停止"
-
[解決済み] express は `body-parser deprecated undefined extended` としてエラーを投げます。
-
[解決済み] ランタイム 'node' が PATH で見つからない - Visual Studio Code と Node.js
-
[解決済み] エラーです。Expressでビューの検索に失敗しました
-
[解決済み】ES6で "use strict "の使用は推奨されない?