English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное объяснение различий между exports и module.exports в nodejs

require используется для загрузки кода, а exports и module.exports используются для экспорта кода. Но многие новички могут быть смущены различием между exports и module.exports, чтобы лучше понять их взаимосвязь,我们先巩固一下 основы js. Пример:

app.js

var a = {name: 'nswbmw 1'};
var b = a;
console.log(a);
console.log(b);
b.name = 'nswbmw 2';
console.log(a);
console.log(b);
var b = {name: 'nswbmw 3'};
console.log(a);
console.log(b);

Результат выполнения app.js:

{ name: 'nswbmw 1' }
{ name: 'nswbmw 1' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 3' }

Оставим это объяснение на потом:a является объектом, b является ссылкой на a, то есть a и b указывают на один и тот же объект, то есть a и b указывают на одно и то же место в памяти, поэтому первые два вывода одинаковые. При изменении b, то есть при изменении содержимого места в памяти, на которое указывают a и b, a также изменяется, поэтому третий и четвертый выводы одинаковые. При полном покрытии b указывает на новое место в памяти (прежний блок памяти не изменяется), а a все еще указывает на прежний блок памяти, то есть a и b больше не указывают на одно и то же место в памяти, то есть в этот момент a и b больше не связаны, поэтому последние два вывода различаются.

После того как мы поняли приведенные примеры, перейдем к основному вопросу.

Чтобы понять разницу между exports и module.exports, нам нужно знать всего три вещи:

  • exports является ссылкой на module.exports
  • Инициальная стоимость module.exports составляет пустой объект {} и, следовательно, стоимость exports также пуста {}
  • require() возвращает module.exports, а не exports

Таким образом: мы через

var name = 'nswbmw';
exports.name = name;
exports.sayName = function() {
 console.log(name);
{}

Ассигнование значения exports на самом деле добавляет два свойства к пустому объекту module.exports,上面的 код эквивалентен:

var name = 'nswbmw';
module.exports.name = name;
module.exports.sayName = function() {
 console.log(name);
{}

Мы обычно используем exports и module.exports следующим образом

Пример, который можно использовать, чтобы вычислить площадь круга:

Использование exports

app.js

var circle = require('./circle');
console.log(circle.area(4));

circle.js

exports.area = function(r) {
 возврат r * r * Math.PI;
{}

Использование module.exports

app.js

var area = require('./area');
console.log(area(4));

area.js

module.exports = function(r) {
 возврат r * r * Math.PI;
{}

Результат вывода в предыдущих примерах одинаковый. Вы, возможно, спросите, почему не так?

app.js

var area = require('./area');
console.log(area(4));

area.js

exports = function(r) {
 возврат r * r * Math.PI;
{}

Запуск предыдущего примера вызовет ошибку. Это потому, что, добавляя свойства к exports, мы только изменяем память, указываемую exports, а

exports = function(r) {
 возврат r * r * Math.PI;
{}

Действительно, это покрытие exports, что означает, что exports указывает на новый участок памяти (содержимое - функция вычисления площади круга), что означает, что exports и module.exports больше не указывают на один и тот же участок памяти, что означает, что в этот момент exports и module.exports не имеют никакого отношения друг к другу, что означает, что участок памяти, указываемый module.exports, не был изменен и по-прежнему является пустым объектом {} , что означает, что area.js экспортировал пустой объект, поэтому при вызове area(4) в app.js возникает ошибка TypeError: object is not a function .

Таким образом, кратко подвести итог: когда мы хотим экспортировать объект модуля, мы можем использовать exports и module.exports (но exports также не может быть повторно покрыт новым объектом), а когда мы хотим экспортировать интерфейс, не являющийся объектом,我们必须 и только можем покрыть module.exports.

Мы часто видим такой стиль записи:

exports = module.exports = somethings;

Этот код эквивалентен

module.exports = somethings;
exports = module.exports;

Причина также очень проста, module.exports = somethings является покрытием module.exports, в этот момент разрывается связь между module.exports и exports, module.exports указывает на новый блок памяти, а exports все еще указывает на исходный блок памяти, чтобы module.exports и exports снова указывали на один и тот же блок памяти или объект, поэтому мы exports = module.exports.

Вот и все, что есть в этой статье, надеюсь, что содержание статьи принесет вам определенную пользу в изучении или работе, и также надеюсь на вашу поддержку и крики урока!

Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат их законным владельцам, материалы предоставлены пользователями Интернета в порядке добровольного участия и самостоятельной загрузки, сайт не обладает правами собственности, не underwent редактирование, и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для подачи жалоб, и предоставьте соответствующие доказательства. При подтверждении факта нарушения, сайт немедленно удалят涉嫌侵权的内容。

Рекомендуется к просмотру