На этой странице ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ) говорится, что «Если вы хотите установить объект экспорта в функцию или новый объект, вы должны используйте объект module.exports. "
У меня вопрос почему.
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
Я console.logged результат ( result=require(example.js)
) и первый из них [Function]
второй {}
.
Не могли бы вы объяснить причину этого? Я прочитал пост здесь: module.exports против экспорта в Node.js . Это полезно, но не объясняет причину, по которой он разработан таким образом. Будет ли проблема, если ссылка на экспорт будет возвращена напрямую?
javascript
node.js
commonjs
Сяо Пэн - ZenUML.com
источник
источник
module.exports
.exports
, например, github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?module.exports
, вы никогда не будете ошибаться, но вы можете использовать ,exports
если вы не заменяете по умолчанию экспортируются объект на, то есть, если вы просто прикрепить свойства , как это:var foo = require('foo').foo
. Этоfoo
свойство может быть экспортировано следующим образом:exports.foo = ...
и, конечно, также сmodule.exports
. Это личный выбор, но я в настоящее время используюmodule.exports
иexports
соответственно.Ответы:
module
простой объект JavaScript соexports
свойствомexports
простая переменная JavaScript, для которой установлено значениеmodule.exports
. В конце вашего файла node.js в основном «вернется»module.exports
кrequire
функции. Упрощенный способ просмотра файла JS в Node может быть таким:Если установить свойство на
exports
, какexports.a = 9;
, что будет установленmodule.exports.a
, а потому , что объекты передаются вокруг как ссылки в JavaScript, а это значит , что если установить несколько переменных на тот же объект, они являются все тот же объект; так тогдаexports
иmodule.exports
есть один и тот же объект.Но если вы установите
exports
что-то новое, оно больше не будет установленоmodule.exports
, поэтомуexports
иmodule.exports
больше не будет тем же объектом.источник
module.exports
этого также описывает: nodejs.org/api/modules.html#modules_module_exportsОтвет Рене хорошо объяснен. Дополнение к ответу с примером:
Node делает много вещей с вашим файлом, и одна из важных задач - это ОБРАБОТКА вашего файла. Внутри nodejs возвращается исходный код "module.exports". Давайте сделаем шаг назад и поймем оболочку. Предположим, у вас есть
greet.js
приведенный выше код заключен в IIFE (выражение для немедленного вызова функции) внутри исходного кода nodejs следующим образом:
и вышеупомянутая функция вызывается (.apply ()) и возвращает module.exports. В настоящее время module.exports и export указывают на одну и ту же ссылку.
Теперь представьте, что вы переписываете greet.js как
выход будет
причина в том, что module.exports является пустым объектом. Мы ничего не установили в module.exports, мы установили export = function () ..... в новом greet.js. Итак, module.exports пуст.
Технически export и module.exports должны указывать на одну и ту же ссылку (это правильно !!). Но мы используем "=" при назначении функции () .... для экспорта, который создает другой объект в памяти. Таким образом, module.exports и export дают разные результаты. Когда дело доходит до экспорта, мы не можем это переопределить.
Теперь представьте, что вы переписали (это называется Mutation) greet.js (ссылаясь на ответ Рене) как
выход будет
Как вы можете видеть, module.exports и export указывают на одну и ту же ссылку, которая является функцией. Если вы установите свойство для экспорта, то оно будет установлено в module.exports, потому что в JS объекты передаются по ссылке.
Вывод: всегда используйте module.exports, чтобы избежать путаницы. Надеюсь это поможет. Удачного кодирования :)
источник
Кроме того, одна вещь, которая может помочь понять:
math.js
client.js
Отлично, в этом случае:
Таким образом, по умолчанию «this» фактически равно module.exports.
Однако, если вы измените свою реализацию на:
math.js
В этом случае он будет работать нормально, однако «this» больше не равно module.exports, потому что был создан новый объект.
И теперь то, что будет возвращено требованием, - это то, что было определено внутри модуля. Экспорт, а не этот или экспорт, больше.
Еще один способ сделать это будет:
math.js
Или:
math.js
источник
Ответ Рене об отношениях между ними
exports
иmodule.exports
совершенно ясен, все дело в ссылках на JavaScript. Просто хочу добавить, что:Мы видим это во многих модулях узлов:
var app = exports = module.exports = {};
Это гарантирует, что даже если мы изменили module.exports, мы все равно можем использовать экспорт, заставив эти две переменные указывать на один и тот же объект.
источник
module.exports
иexports
просто отдельные переменные инициализируются ссылаться на тот же объект. Если вы измените ссылку на одну переменную, две переменные больше не будут ссылаться на одно и то же. Строка кода выше обеспечивает инициализацию обеих переменных для одного и того же нового объекта.myTest.js
exports
иmodule.exports
являются одинаковыми и ссылкой на один и тот же объект. Вы можете добавить свойства обоими способами, как вам удобно.источник