Node.js: В чём разница между exports и module.exports
В чем разница между exports
и module.exports
в Node.js
Для начала рассмотрим, что представляет собой объект модуля. Создадим файл run.js
со следующим содержимым.
console.log(module);
Затем выполните файл с помощью node
. Вы должны увидеть вывод, который выглядит примерно так:
$ node run.js
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/yaapa/projects/hacksparrow.com/run.js',
loaded: false,
children: [],
paths:
[ '/Users/yaapa/projects/hacksparrow.com/node_modules',
'/Users/yaapa/projects/node_modules',
'/Users/yaapa/node_modules',
'/Users/node_modules',
'/node_modules' ] }
Таким образом, похоже, что module
— это контекстная ссылка на только что выполненный файл.
Вы заметили, что у него есть свойство exports
? Это пустой объект. Именно в нем вы определяете "импортируемые" объекты вашего модуля.
Теперь отредактируйте файл run.js
и запустите его снова:
exports.a = 'A';
exports.b = 'B';
$ node run.js
Module {
id: '.',
exports: { a: 'A', b: 'B' },
...
Видно, что присвоение свойств объекту exports
добавило эти свойства в modules.exports
.
Это связано с тем, что exports
— это ссылка на modules.exports
.
exports.a = 'A';
console.log(exports === module.exports);
console.log(module.exports);
$ node run.js
true
{ a: 'A' }
Таким образом, присвоение свойств объекту exports
— это удобное сокращение, если вы хотите экспортировать объект из своего модуля:
Использование module.exports
:
module.exports = {
greet: function (name) {
console.log(`Hi ${name}!`);
},
farewell: function() {
console.log('Bye!');
}
}
Использование exports
:
exports.greet = function (name) {
console.log(`Hi ${name}!`);
}
exports.farewell = function() {
console.log('Bye!');
}
Определение свойств на exports
, конечно, выглядит лучше, чем определение их на объекте, назначенном на module.exports
.
Вам нравятся сюрпризы?
У вас нет выбора — exports
не является ссылкой на modules.exports
постоянно!
Если присвоить модулю module.exports
что-либо, то exports
перестанет быть ссылкой на него, и exports
потеряет всю свою силу.
module.exports = {a: 'A'};
exports.b = 'B';
console.log(exports === module.exports);
console.log(module)
$ node run.js
false
Module {
id: '.',
exports: { a: 'A' },
...
Итак, теперь вы знаете, что exports
— это сокращение для ссылки на module.exports
, если ваш модуль должен экспортировать объект. Это практически бесполезный объект, если ваш модуль экспортирует любой другой тип данных или вы присвоили модулю module.exports
какое-либо значение.
- Node.js — объект module
- Node.js — module.exports