supermannerの落書き

基礎からおさらい。おさらいが何よりも大事なのです。ふわっとした知識、撲滅!

nodeのmodule.exportとexportについておさらい

大分日付があいてしまった....。

今年はアドベントカレンダーに参加してみました!
こちらの8日目の記事を書かせていただいてます。qiita.com


実はもう1回自分のターンがあるのですが、そこで最近はじめたnodeを使ってみようかなと思い
ふわっとした部分を落としこむために今回のエントリを書きます。

nodeのmoduleについて

ブラウザで使用するJSについては外部JSはscriptタグを用いてよみこんできますが、
node.jsではrequire('/path/to/module')という形で読み込みます。
私は、普段の開発ではPHPでサーバサイドを記述することが多いのですが、
一般的なMVCフレームワークでいうところの, controllerからmodelのmethodを呼び出す感覚
みたいなものと思うとやりやすいなと思いました。
まぁ、よく使う機能がきちんと一つのmoduleとしてカプセル化できていれば当たり前ですね...。
JSではよくゴミコードを書きなぐっているので気をつけなければ、と思います。

exportsとmodule.exports

node.jsの学習の仕方として大きく間違っている可能性大なのですが、
PHPで昔作ったWEBアプリを載せ替えてみようとおもい、expressにリプレイスする計画を立てました。
とりあえず初期状態のコードをリーディングしてると、module.exportsに出会います。
よくmodule.exportsとexportsは一緒だから、迷ったらmodule.exportsを使えと
書いている記事を見ますが、この2この違いに関しては次こちらの記事が分かりやすかったです。

d.hatena.ne.jp

exportsをあえて使う要素があまり見当たらないような...????
例えばですが

exports.apple = 1;
exports.banana = 2;

単純にこういうプロパテイ定義だけをしたい時とかですかね....???

var fruits = { apple: 1, banana: 2};
module.exports = fruits;

こっちのほうがいい気もする...

※exportsはオブジェクトとか突っ込めない

先ほどの記事でありました、最後に全滅していた例。
結局exportsにつっこむのは、module.exports = {}というオブジェクトの参照にたいして
プロパティにアクセス掛けて突っ込んでいるので、exportsそのものを書き換えてしまう行為をすると残念な感じになる
ということらしいです。

exports = {
    have: function(food) {
        console.log('i have ' + foor);
    },
    cook: function(food) {
        console.log('i cook ' 
    }
}

こういうことしても、requireされるのは{}になっちゃうってことですね。

さて, 話を戻して先述の記事で、結局module.exportsの値を返す様になってると解説されていましたね。
だからみなさん、わからなければmodule.exportsを使いましょうと言っていたわけか。
直感的にnewとかして使いたいときはexportsだとわかりにくいコードになりそうです。