export default function foo() { console.log("hello"); }
次のようにコンパイルされる。
"use strict"; exports.__esModule = true; function foo() { console.log("hello"); } exports["default"] = foo;
exports["default"] は、mudule.exports.default でも同じ。とにかく、defaultというプロパティ名でセットされる。
次は良くない(僕は嫌いな)構文。
function foo() { console.log("hello"); } export = foo;
"use strict"; function foo() { console.log("hello"); } module.exports = foo;
module.exports 自体に関数がセットされる。
次は好きな構文。
export {foo} function foo() { console.log("hello"); }
"use strict"; exports.__esModule = true; exports.foo = void 0; function foo() { console.log("hello"); } exports.foo = foo;
以下でもいい。
export function foo() { console.log("hello"); }
"use strict"; exports.__esModule = true; exports.foo = void 0; function foo() { console.log("hello"); } exports.foo = foo;
以下の無名関数のエクスポートはコンパイルできない。
export function() { console.log("hello"); }
次ならエクスポートはできる。
export default function() { console.log("hello"); }
"use strict"; exports.__esModule = true; function default_1() { console.log("hello"); } exports["default"] = default_1;
default_1 という一時的な名前を付けて、modules.exports.default にセットしている。
export default とうのは、何かを無名でエクスポートしたい。元の名前があっても、その名前は消し去ってエクスポートしたい。名前はインポート側で、あるいは別ななんかのメカニズムで決めて欲しい、ということになる。無名だから元の名前(仮にあっても)の影響を受けないが、同一物が異なる複数の名前で呼ばれる(エイリアシングの)リスクはある。