Node.js: В чём разница между exports и module.exports

Вы знаете в чём разница между exports и module.exports в Node.js?

В чем разница между 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 какое-либо значение.

  1. Node.js — объект module
  2. Node.js — module.exports

Дополнительные материалы

Предыдущая Статья

Всё что нужно знать о HTTP протоколе

Следующая Статья

Выпущена бета-версия Livewire v3