続:module.exportsとexports

CommonJS方式 exports と module.exports - (新) 檜山正幸のキマイラ飼育記 メモ編 の続き。CJSエクスポートのエミュレート - (新) 檜山正幸のキマイラ飼育記 メモ編 とも関係する。

https://jovi0608.hatenablog.com/entry/20111226/1324879536 に書いてある実験結果を以下にまとめる。

  1. module.exports に文字列など代入してみると急に name メソッドが使えなくなってしまいます。 → module.export設定で上書きされる現象。
  2. [Case1] exports, module.exports のプロパティに変数を代入 → 両方が反映される。
  3. [Case2] module.exports にオブジェクト、exports のプロパティに変数を代入 → module.exports設定
  4. [Case3] exports にオブジェクト、module.exports のプロパティに変数を代入 → module.exports設定
  5. [Case4] exports, module.exports の両方にオブジェクトを代入 → module.exports設定
  6. [Case5] moduleにオブジェクト、exports のプロパティに変数を代入 → exports設定
  7. [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"]
}
```