CommonJS方式 exports と module.exports - (新) 檜山正幸のキマイラ飼育記 メモ編 の続き。CJSエクスポートのエミュレート - (新) 檜山正幸のキマイラ飼育記 メモ編 とも関係する。
https://jovi0608.hatenablog.com/entry/20111226/1324879536 に書いてある実験結果を以下にまとめる。
- module.exports に文字列など代入してみると急に name メソッドが使えなくなってしまいます。 → module.export設定で上書きされる現象。
- [Case1] exports, module.exports のプロパティに変数を代入 → 両方が反映される。
- [Case2] module.exports にオブジェクト、exports のプロパティに変数を代入 → module.exports設定
- [Case3] exports にオブジェクト、module.exports のプロパティに変数を代入 → module.exports設定
- [Case4] exports, module.exports の両方にオブジェクトを代入 → module.exports設定
- [Case5] moduleにオブジェクト、exports のプロパティに変数を代入 → exports設定
- [Case6] module と exports にオブジェクトを代入 → {} 両方が反映されない。
module.exports = "Hi"; exports.name = function() { console.log("My Name is jovi0608."); };
// Case1 exports.hoge = "hoge"; moduel.exports.foo = "foo";
// Case2 exports.hoge = "hoge"; module.exports = {foo: "foo"};
// Case3 exports = {hoge : "hoge"}; module.exports.foo = "foo";
// Case4 exports = {hoge : "hoge"}; module.exports = {foo: "foo"};
// Case5 exports.hoge = "hoge"; module = {exports: {foo: "foo"}};
// Case6 exports = {hoge : "hoge"}; module = {exports: {foo: "foo"}};
Graphvizによる説明図:
```graphviz digraph { base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] base -> module var1 -> module[label="module"] var2 -> exports[label="exports"] module -> exports[label="exports"] } ``` ```graphviz digraph { label="Case1" base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] hoge[label="\"hoge\""] foo[label="\"foo\""] base -> module var1 -> module[label="module"] var2 -> exports[label="exports"] module -> exports[label="exports"] exports -> hoge[label="hoge"] exports -> foo[label="foo"] } ``` ```graphviz digraph { label="Case2" base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] hoge[label="\"hoge\""] foo[label="\"foo\""] new_exports[label="(new)"] base -> module var1 -> module[label="module"] var2 -> exports[label="exports"] module -> new_exports[label="exports"] exports -> hoge[label="hoge"] new_exports -> foo[label="foo"] } ``` ```graphviz digraph { label="Case3" base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] hoge[label="\"hoge\""] foo[label="\"foo\""] new_exports[label="(new)"] base -> module var1 -> module[label="module"] var2 -> new_exports[label="exports"] module -> exports[label="exports"] exports -> foo[label="foo"] new_exports -> hoge[label="hoge"] } ``` ```graphviz digraph { label="Case4" base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] hoge[label="\"hoge\""] foo[label="\"foo\""] new_exports[label="(new 1)"] new2_exports[label="(new 2)"] base -> module var1 -> module[label="module"] var2 -> new_exports[label="exports"] module -> new2_exports[label="exports"] new2_exports -> foo[label="foo"] new_exports -> hoge[label="hoge"] } ``` ```graphviz digraph { label="Case5" base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] hoge[label="\"hoge\""] foo[label="\"foo\""] new_module[label="(new 1)"] new_exports[label="(new 2)"] base -> module var1 -> new_module[label="module"] var2 -> exports[label="exports"] module -> exports[label="exports"] new_module -> new_exports[label="exports"] new_exports -> foo[label="foo"] exports -> hoge[label="hoge"] } ``` ```graphviz digraph { label="Case6" base [shape=none, label="*"] var1 [shape=none, label="1"] var2 [shape=none, label="2"] module[label="(module)"] exports[label=""] hoge[label="\"hoge\""] foo[label="\"foo\""] new_exports[label="(new 1)"] new_module[label="(new 2)"] new_mod_exports[label="(new 3)"] base -> module var1 -> new_module[label="module"] var2 -> new_exports[label="exports"] module -> exports[label="exports"] new_module -> new_mod_exports[label="exports"] new_mod_exports -> foo[label="foo"] new_exports -> hoge[label="hoge"] } ```