今更ながらNode.jsのexportsとmodule.exportsについて理解する

NO IMAGE

自分は6,7年くらい前にjQueryやJavaScriptをゴリゴリ書き続けるフロントエンドの仕事をしていました。
そのついでにNode.jsを知り、【Electronを】hello worldするまで【Lubuntu14.04で】なんて記事を書いたりしていました。

ところが、ある企業の入社試験で、確かReact.jsだったと思うんだけど、

module.exports = Hoge;

これの意味が分からずその企業の面接は見事に落ちました。
それからというもの、あまりNode.js、React.jsに携わる機会がなく、exportsやmodule.exportsについて考えてきませんでした。

exportsとmodule.exportsの違い

簡単にいうと、

  • exports : exportsを付けた関数を他ファイルから呼び出せる。
  • module.exports: module.exportsはクラスとして、他のファイルから呼び出せる(参照できる)
exportsの例

exportsの例を示す。例えば、calc.jsというファイルを以下のように記述する。

calculate.js

exports.calcAdd = function(a, b) {
  calc(a + b);
}
exports.calcSubtract = function(a, b) {
  calc(a - b);
}
calc = function(number) {
  console.log(number);
}

たとえば、このようにexportsを付けた関数たちを用意する。
calc関数にだけexportsを付与していない。

main.js

var calculate = require('./calculate');
calculate.calcAdd(1, 2); // 3
calculate.calcSubtract(2, 1); //1
calculate.calc // error. caluculate.calc is not a function

上記caluculate.jsのcalcだけはexportsを付けなかったので関数とみなされない。
ちなみに1行目のrequireは他のjsファイルを呼び出す際に必要。
※この例だとmain.jsとutil.jsは同一ディレクトリにいる必要がある。

module.exportsの例

module.exportsはクラスとして外部からオブジェクトや関数などを呼び出せるようにしてくれる。ここで、Nameというクラスを作ってみます。

name.js

// コンストラクタ
var Name = function(name) {
  this.name = name;
}

Name.prototype.sayName = function() {
  say(this.name);
}

say = function(name) {
  console.log(name);
}

module.exports = Name;

最後の行で、Nameクラスとして外部から呼び出せるようにしています。

途中にあるprototypeについてはJavaScript初級者から中級者になろう 九章第二回 prototypeの活用 | uhyohyo.netを参考にしてください。まあ要は、外部から参照できるようするために必要なのですが、ここでは詳しく解説しません(てかできません)。今はおまじない程度に思ってください。メモリ節約などいろいろメリットがありますのでまた時間ができたら再学習して解説します。・゚・(ノД`)・゚・。

main2.js

var Name = require('./name');
var nameA = new Name('Jon');
nameA.sayName(); //Jon

var nameB = new Name('Emily');
nameB.sayName(); // Emily

nameB.say(); // error. movieB.say is not a function

最終行の nameB.say(); はエラーになります。

name.jsの途中にあった、

Name.prototype.sayName = function() {
  say(this.name);
}

のように外部から参照できるようにprototypeを付けていないのでエラーになります。Javaでいうカプセルの概念に近いだろうか。

module.exportsするということは、外部からモジュールあるいはクラスとして参照できるようにする、という理解で一旦この記事を締めたいと思います。


参考資料