Работа с модулями в NodeJS на простых примерах

Рассмотрим систему модулей в NodeJS на простых примерах.

В Node.JS используется система модулей принятая в CommonJS.

Для подключения модулей используется функция require. Модули используют переменную exports для предоставления доступа к функционалу.

Простейший пример модуля

// hello.js
console.log('Hello World');
// app.js
require('hello.js'); // подключаем модуль hello.js

Пример с глобальной видимостью

// foo.js
foo = function () {
  console.log('foo!');
}
// app.js
require('./foo.js');
foo(); // функция foo видна глобально

Конечно же не рекомендуется засорять глобальную область видимости.

Пример с экспортированием анонимной функции

// bar.js
module.exports = function () {
  console.log('bar!');
}
// app.js
var bar = require('./bar.js');
bar();

Пример с экспортированием именованной функции

// fiz.js
exports.fiz = function () {
  console.log('fiz!');
}
// app.js
var fiz = require('./fiz.js').fiz;
fiz();

Пример с экспортированием анонимного объекта

// buz.js
var Buz = function () {};

Buz.prototype.log = function () {
  console.log('buz!');
};

module.exports = new Buz();
// app.js
var buz = require('./buz.js');
buz.log();

Пример с экспортированием именованного объекта

// baz.js
var Baz = function () {};

Baz.prototype.log = function () {
  console.log('baz!');
};

exports.Baz = new Baz();
// app.js
var baz = require('./baz.js').Baz;
baz.log();

Пример с экспортированием анонимного прототипа

// doo.js
var Doo = function () {};

Doo.prototype.log = function () {
  console.log('doo!');
}

module.exports = Doo;
// app.js
var Doo = require('./doo.js');
var doo = new Doo();
doo.log();

Пример с экспортированием именованного прототипа

// qux.js
var Qux = function () {};

Qux.prototype.log = function () {
  console.log('baz!');
};

exports.Qux = Qux;
// app.js
var Qux = require('./qux.js').Qux;
var qux = new Qux();
qux.log();

exports и module.exports

Вы уже заметили выше что иногда мы записывали просто exports, а в других местах module.exports.

Дело в том что exports это ссылка на module.exports и нужна только лишь для более короткой записи.

И нужно быть осторожным чтобы не перезаписать эту ссылку.

> module.exports.fiz = "fiz";
> exports.buz = "buz";
> module.exports === exports;
true

Если дать значение для exports напрямую (т.е. exports = "buz"; вместо exports.buz = "buz";), то мы потеряем эту ссылку и создадим новую переменную с именем exports. Т.е. она уже не будет указывать на module.exports

> module.exports.qux = "qux";
> exports
{ qux: "qux" }
> exports === module.exports
true
> exports = "wobble wibble wubble!";
> exports === module.exports
false
> exports
"wobble wibble wubble!"
> module.exports
{ qux: "qux" }
// module.exports is canonical