Help us understand the problem. What is going on with this article?

exports と module.exports の違い

More than 5 years have passed since last update.

なんかややこしい解説が多いが、そんなに難しい話ではない。
1. exports = module.exports = {} が予め実行されていて、
2. 最終的に評価されるのは 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 という記法が追加された。

多分そんなことだろうと思います。想像ですが。

heartrails
ハートレイルズは、新規事業の立ち上げに伴うウェブサービス、スマホアプリの企画、開発、運用に特化した開発会社です。
http://www.heartrails.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away