Разница между " модулем.экспорт " и "экспорт" в системе модулей CommonJs



на этой странице (http://docs.nodejitsu.com/articles/getting-started/what-is-require), в нем говорится, что " если вы хотите установить объект экспорта в функцию или новый объект, вы должны использовать модуль.экспортирует объект."



мой вопрос почему.



// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}


Я консоль.зарегистрировал результат (result=require(example.js)) и первый из них [Function] второй -{}.



не могли бы вы объяснить причину? Я прочитал сообщение здесь: модуль.экспорт против экспорта в узле.js . Это полезно, но не объясняет причину, по которой он разработан таким образом. Будет ли проблема, если ссылка экспорта будет возвращена напрямую?

738   4  

4 ответов:

module - Это простой объект JavaScript с exports собственность. exports - это простая переменная JavaScript, которая имеет значение module.exports. В конце вашего файла, узел.js в основном "вернется"module.exports до

ответ Рене хорошо объяснен. Дополнение к ответу с примером:

узел делает много вещей для вашего файла, и одним из важных является упаковка вашего файла. Внутри nodejs исходный код " модуль.экспорт" возвращается. Давайте сделаем шаг назад и разберемся с оберткой. Предположим, у вас есть

приветствую.js

var greet = function () {
   console.log('Hello World');
};

module.exports = greet;

приведенный выше код завернут как IIFE (немедленно вызванное выражение функции) внутри исходного кода nodejs как следует:

(function (exports, require, module, __filename, __dirname) { //add by node

      var greet = function () {
         console.log('Hello World');
      };

      module.exports = greet;

}).apply();                                                  //add by node

return module.exports;                                      //add by node

и выше функция вызывается (.применить ()) и возвращенный модуль.поставляемый. На этот раз модуль.экспорт и экспорт, указывающие на одну и ту же ссылку.

теперь представьте, что вы снова пишите приветствовать.js as

exports = function () {
   console.log('Hello World');
};
console.log(exports);
console.log(module.exports);

выход будет

[Function]
{}

причина : модуль.экспорт-это пустой объект. Мы ничего не устанавливали на модуль.экспорт скорее мы устанавливаем exports = function ()..... в новом приветствии.js. Итак, модуль.экспорт пуст.

технически экспорт и модуль.экспорт должен указывать на ту же ссылку(это правильно!!). Но мы используем "=" при назначении функции().... для экспорта, который создает другой объект в памяти. Итак, модуль.экспорт и экспорт дают разные результаты. Когда дело доходит до экспорта, мы не можем обойти это.

теперь представьте, что вы переписываете (это называется мутацией) приветствовать.js (ссылаясь на ответ Рене) как

exports.a = function() {
    console.log("Hello");
}

console.log(exports);
console.log(module.exports);

выход будет

{ a: [Function] }
{ a: [Function] }

как вы можете увидеть модуль.экспорт и экспорт указывают на одну и ту же ссылку, которая является функцией. Если вы установите свойство на экспорт, то оно будет установлено на модуле.экспорт, потому что в JS объекты передаются по ссылке.

вывод всегда использовать модуль.экспорт, чтобы избежать путаницы. Надеюсь, это поможет. Счастливое кодирование:)

кроме того, одна вещь, которая может помочь понять:

математика.js

this.add = function (a, b) {
    return a + b;
};

клиент.js

var math = require('./math');
console.log(math.add(2,2); // 4;

отлично, в данном случае:

console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true

таким образом, по умолчанию "это" фактически равно модулю.поставляемый.

однако, если вы измените свою реализацию на:

математика.js

var add = function (a, b) {
    return a + b;
};

module.exports = {
    add: add
};

в этом случае он будет работать нормально, однако, "это" не равен модулю.экспорт больше, потому что новый объект был создан.

console.log(this === module.exports); // false
console.log(this === exports); // true
console.log(module.exports === exports); // false

и теперь то, что будет возвращено require-это то, что было определено внутри модуля.экспорт, а не это или экспорт, больше.

другой способ сделать это было бы:

математика.js

module.exports.add = function (a, b) {
    return a + b;
};

или:

математика.js

exports.add = function (a, b) {
    return a + b;
};

ответ Рене О связи между exports и module.exports вполне понятно, это все о ссылках javascript. Просто хочу добавить, что:

мы видим это во многих узловых модулях:

var app = exports = module.exports = {};

Это позволит убедиться, что даже если мы изменили модуль.экспорт, мы все еще можем использовать экспорт, заставляя эти две переменные указывать на один и тот же объект.

Comments

    Ничего не найдено.