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