Рассмотрим систему модулей в 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
и нужна только лишь для более короткой записи.
И нужно быть осторожным чтобы не перезаписать эту ссылку.
> 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