Когато за първи път започнах да играя с node.js, имаше едно нещо, което винаги ме караше да се чувствам неудобно. Колкото и да е неудобно, говоря за module.exports. Казвам неудобно, защото това е толкова фундаментална част от node.js и е доста проста.

Всъщност, поглеждайки назад, нямам представа какво беше моето затваряне... просто си спомням, че бях размит. Ако приемем, че не съм единственият, който е трябвало да вземе втори, и трето, погледнете го, преди най-накрая да започне да потъва, реших, че мога да напиша малко.

В Node нещата са видими само за други неща в същия файл. Под неща имам предвид променливи, функции, класове и членове на класа. И така, даден е файл misc.js със следното съдържание:

const x = 5;
const addX = function(value) {
  return value + x;
};

Друг файл няма достъп до променливата x или функцията addX. Това няма нищо общо с използването на ключовата дума const. По-скоро основният градивен блок на Node се нарича модул, който се преобразува директно във файл. Така че можем да кажем, че горният файл съответства на модул с име file1 и всичко в този модул (или който и да е модул) е лично.

Сега, преди да разгледаме как да изложим неща извън модул, нека да разгледаме зареждането на модул. Тук идва require. require се използва за зареждане на модул, поради което неговата върната стойност обикновено се присвоява на променлива:

const misc = require('./misc');

https://media.giphy.com/media/3ohhwoWSCtJzznXbuo/giphy.gif

Разбира се, докато нашият модул не излага нищо, горното не е много полезно. За да разкрием нещата, които използваме module.exports и да експортираме всичко, което искаме:

const x = 5;
const addX = function(value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

Сега можем да използваме нашия зареден модул:

var misc = require('./misc');
console.log("Adding %d to 10 gives us %d", misc.x, misc.addX(10));

Има друг начин да изложите нещата в модул:

var User = function(name, email) {
  this.name = name;
  this.email = email;
};
module.exports = User;

Разликата е фина, но важна. Виж го? Изнасяме user директно, без никаква индиректност. Разликата между:

module.exports.User = User;
//vs
module.exports = User;

всичко е свързано с това как се използва:

const user = require('./user');
const u = new user.User();
//vs
const u = new user();

До голяма степен е въпрос на това дали вашият модул е ​​контейнер на експортирани стойности или не. Всъщност можете да смесите двете в един и същ модул, но мисля, че това води до доста грозен API.

И накрая, последното нещо, което трябва да имате предвид, е какво се случва, когато директно експортирате функция:

const powerLevel = function(level) {
  return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;

Когато ви е необходим горният файл, върнатата стойност е действителната функция. Това означава, че можете да направите:

require('./powerlevel')(9050);

Което всъщност е просто съкратена версия на:

const powerLevel = require('./powerlevel')
powerLevel(9050);

Надявам се това да помогне!