Когато за първи път започнах да играя с 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);
Надявам се това да помогне!