君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

module.exportsとは何か、どうもわからなかったので実験してみた〜Node.jsにて外部moduleをrequireする〜

f:id:karoten512:20180128191834p:plain

いきさつ

今まで何も考えずに

npm install

して、

var module = require('module-name');

して使ってきたが、

Node.jsについて知らなさすぎて、

node_moduleディレクトリ配下に格納されているmoduleをみても、

ぜんぜん読めないことに気づいた。

exports.moduleが分かればだいぶ読めるようになるかな、と思い、

まずはexports.moduleについて理解することにした。

ディレクトリ構造

├── main.js
└── node_modules
    └── weather-module.js

やってること

main.jsからweather-module.jsを読み込む。

// main.js
var weather = require('weather-module');
weather.today();
weather.yesterday();
// weather-module.js
/** weatherオブジェクトの生成 */
var weather = {}; 

weather.today = function() {
  console.log('晴れだよ');
}

weather.yesterday = function() {
  console.log('雨だったよ');
}

module.exports = weather;

わからないこと

module.exports = weather;

の部分で何をやっているのかわからない。

結論

// main.js
require('weather-module');

requireが、

weather-module.jsでmodule.exportsに渡されているオブジェクトを

返してくれるので、それを使用することができる。

実験手順

何を読み込んでいるのか調べる

これを外部ファイル(main.js)から読み込んで使いたい。

// main.js
var weatherModule = require('weather-module');
console.log(weatherModule);

main.jsを実行

$ node main.js
{ today: [Function], yesterday: [Function] }

weatherオブジェクトそのものが渡っているようである。

weatherオブジェクトはmodule.exportsに渡されているのものなので、

require('weather-module');

module.exportsに渡されているオブジェクトを返す、と考えられる。

module.exportsに複数のオブジェクトを渡してみる

/** weatherオブジェクトの生成 */
var weather = {}; 

weather.today = function() {
  console.log('晴れだよ');
}

/** 関数の追加2 */
weather.yesterday = function() {
  console.log('雨だったよ');
}

/** temperatureオブジェクトの生成 */
var temperature = {}; 

temperature.today = function() {
  console.log('25');
}

temperature.yesterday = function() {
  console.log('15');

}

module.exports = { 
  weather: weather,
  temperature: temperature // もう一個渡す
};

main.jsを実行

$ node main.js
{ weather: { today: [Function], yesterday: [Function] },
  temperature: { today: [Function], yesterday: [Function] } }

やはり、

require('weather-module');

module.exportsに渡されているオブジェクトを返すようだ。

まとめ

require('hoge-module');

hoge-module.jsにて、

module.exportsに渡されているオブジェクトを返す。

逆に言えば、

module.exportsに渡していないオブジェクトは使えない。

外部から使用したいオブジェクトは、必ずmodule.exportsに渡すこと。

参考

numb86-tech.hatenablog.com