Меню

Module Wrapper Function — функция обертка для модулей

30.06.2018 - Back-end, NodeJS

Module Wrapper Function

Возможно у Вас затаился вопрос, как nodejs делаем модули приватными. Давайте посмотрим.

Давайте самое первой строкой в нашем модуле logger.js напишем следующую запись, с содержанием синтаксической ошибки: var x = ;. Убедитель что эта запись на самой самой первой строчке.

var x =;
var url = 'http://mylogger.io/log';

function log(message) {
    //Send an HTTP Request
    console.log(message);
}

module.exports.log = log;

Теперь идём в терминал и запускаем наш app.js.
Мы получаем ошибку Unexprected token ;.

Но посмотрите, что мы видим перед этой ошибкой?

(function (exports, require, module, __filename, __dirname) { var x=;

Мы видим IIFE. У этой функции есть несколько параметров.
Посути, nodejs обёртывает наши модули в функции.
Т.е. под катом, наш модуль будет выглядеть примерно так:

(function (exports, require, module, __filename, __dirname) { 
var x =;
var url = 'http://mylogger.io/log';

function log(message) {
    //Send an HTTP Request
    console.log(message);
}

module.exports.log = log;
});

Конечно же, в реальности код которые работает за кулисами, сложнее.
Как Вы уже поняли, node не исполняет код в модулях напрямую. Он всегда обёртывает его в функцию. Теперь посмотрите на аргументы этой функции. Обратите внимание на функцию required. Мы говорили, что функция required выглядит как глобальная, но таковой не является. По факту, она локальная для каждого модуля. Т.е. каждый модуль затребует аргументы, которые передаются этой функции. Эта функция называется — Module Wrapper Function. Также среди аргументов мы видим module, который мы используем при экспорте. Также есть exports, которая является краткой версией module.exports, для того, чтобы мы могли экспортировать сразу в него.

module.exports.log = log;
exports.log = log
//одно и тоже

Но вы не сможете сбросить объект exports через это сокращение, например, когда мы передавали функцию напрямую. Т.е. нельзя сделать так: exports = log. Потому что exports это ссылка на module.exports. Мы не можем поменять эту ссылку.

Осталось еще два аргумента: __dirname и __filename, которые отражают путь и имя текущего модуля (файла). Первый будет содержать только путь, второй путь + имя файла.

Метки: , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *