javascript - это - require js




Разница между «module.exports» и «export» в модуле CommonJs Module (3)

На этой странице ( 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")
}

I console.logged результат ( result=require(example.js) ), а первый - [Function] второй - {} .

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


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

math.js

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

client.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

Таким образом, по умолчанию «это» фактически равно module.exports.

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

math.js

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

module.exports = {
    add: add
};

В этом случае он будет работать нормально, однако «это» больше не больше, чем module.exports, потому что был создан новый объект.

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

И теперь, что будет возвращено требованием, это то, что было определено внутри module.exports, а не этого или экспорта.

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

math.js

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

Или же:

math.js

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

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

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

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

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


module - это простой объект JavaScript с свойством exports . exports - это простая переменная JavaScript, которая, как правило, устанавливается в module.exports . В конце вашего файла node.js будет в основном «возвращать» module.exports в функцию require . Упрощенный способ просмотра JS-файла в узле может быть следующим:

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

// your code

return module.exports;

Если вы устанавливаете свойство при exports , например exports.a = 9; , который также установит module.exports.a потому что объекты передаются как ссылки в JavaScript, а это означает, что если вы установите несколько переменных для одного и того же объекта, они все одинаковые объекты; поэтому exports и module.exports - это один и тот же объект.
Но если вы установите exports на что-то новое, он больше не будет установлен в module.exports , поэтому module.exports и module.exports перестали быть module.exports и тем же объектом.





commonjs