Даже если вопрос был дан ответ и принят давно, я просто хочу поделиться своими двумя центами:
Вы можете себе представить, что в самом начале вашего файла есть что-то вроде (только для объяснения) :
var module = new Module(...);
var exports = module.exports;
[/g1]
Итак, что бы вы ни делали, помните, что module.exports
и NOT exports
будут возвращены из вашего модуля, когда вы 're требующий этого модуля откуда-то еще.
Итак, когда вы делаете что-то вроде:
exports.a = function() {
console.log("a");
}
exports.b = function() {
console.log("b");
}
Вы добавляете к объекту 2 функции' a 'и' b ' module.exports тоже, поэтому typeof
возвращаемый результат будет object
: { a: [Function], b: [Function] }
Конечно, это тот же результат, который вы получите, если используете module.exports
в этом вместо exports
.
Это тот случай, когда вы хотите, чтобы ваш module.exports вел себя как контейнер экспортируемых значений. Принимая во внимание, что если вы хотите экспортировать функцию-конструктор, вы должны знать об использовании module.exports
или exports
; (помните еще раз, что module.exports будет возвращен, когда вам потребуется что-то, а не экспорт).
module.exports = function Something() {
console.log('bla bla');
}
Теперь тип возвращаемого результата равен 'function'
, и вы можете потребовать его и сразу вызвать: var x = require('./file1.js')();
, потому что вы возвращаете возвращаемый результат как функцию.
Однако, используя exports
вы не можете использовать что-то вроде:
exports = function Something() {
console.log('bla bla');
}
var x = require('./file1.js')(); //Error: require is not a function
Поскольку с exports
ссылка больше не указывает на объект, где module.exports
указывает, поэтому нет отношения между exports
и module.exports
. В этом случае module.exports все еще указывает на пустой объект {}
, который будет возвращен.
Принятый ответ из другой темы также должен помочь: Проходит ли Javascript по ссылке?