なんかややこしい解説が多いが、そんなに難しい話ではない。
-
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 という記法が追加された。
多分そんなことだろうと思います。想像ですが。