Разница между " модулем.экспорт " и "экспорт" в системе модулей 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 . Это полезно, но не объясняет причину, по которой он разработан таким образом. Будет ли проблема, если ссылка экспорта будет возвращена напрямую?
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