なんかややこしい解説が多いが、そんなに難しい話ではない。
-
exports = module.exports = {}
が予め実行されていて、 - 最終的に評価されるのは
module.exports
ということ。
心配だったら常に module.exports
を使えば OK だし、(正しく記述されているコードを)読む時は全部脳内で module.exports
と読み替えてしまって良い。
じゃあどこで差が出るのか、なんでややこしい解説がされてるのか。
exports = なんたら
という式は、exports
の中身をごっそり入れ替えてしまうので、exports == module.exports
の関係が壊れる。
exports.hoge = 1
はこの関係を崩さない。
歴史的経緯によれば(ぶっちゃけ想像ですが)もともとは exports しか無かった。つまり、
var hoge = require('./hoge');
hoge.foo();
hoge.bar();
という形の使い方しか想定してなかった。
ところが、誰かが new hoge
したい、と言い出した。(恐らく他の誰かが new hoge.Hoge
とすればいいじゃん、と反論しただろうが、美しくない、と却下された)
exports だけではこれは実現出来ない。そこで、あとから module.exports という記法が追加された。
多分そんなことだろうと思います。想像ですが。