Подтвердить что ты не робот

Что означают "module.exports" и "export.methods" в NodeJS/Express?

Глядя на случайный исходный файл структуры express для NodeJS, есть две строки кода, которые я не понимаю (эти строки код типичны для почти всех файлов NodeJS).

/**
 * Expose `Router` constructor.
 */

exports = module.exports = Router;

и

/**
 * Expose HTTP methods.
 */

var methods = exports.methods = require('./methods');

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

Что означают exports и module.exports?

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

В основном, каковы эти волшебные слова: module и exports?

4b9b3361

Ответ 1

Более конкретно:

module - глобальная переменная области видимости внутри файла.

Итак, если вы вызываете require("foo"), то:

// foo.js
console.log(this === module); // true

Он действует так же, как window действует в браузере.

Существует также еще один глобальный объект с именем global, который вы можете писать и читать из любого файла, который вы хотите, но это связано с изменением глобальной области видимости, и это EVIL

exports - переменная, которая живет на module.exports. Это в основном то, что вы экспортируете, когда требуется файл.

// foo.js
module.exports = 42;

// main.js
console.log(require("foo") === 42); // true

Существует небольшая проблема с exports по своему усмотрению. Контекст контекста _global + и module являются не одинаковыми. (В браузере контекст глобальной области видимости и window совпадают).

// foo.js
var exports = {}; // creates a new local variable called exports, and conflicts with

// living on module.exports
exports = {}; // does the same as above
module.exports = {}; // just works because its the "correct" exports

// bar.js
exports.foo = 42; // this does not create a new exports variable so it just works

Подробнее об экспорте

Ответ 2

Чтобы расширить ответ Raynos...

exports - это в основном псевдоним для module.exports - я рекомендую просто не использовать его. Вы можете выставить методы и свойства из модуля, установив их на module.exports, как показано ниже:

//file 'module1.js'
module.exports.foo = function () { return 'bar' }
module.exports.baz = 5

Затем вы получите доступ к нему в своем коде:

var module1 = require('module1')
console.log(module1.foo())
console.log(module1.baz)

Вы также можете переопределить module.exports, чтобы просто предоставить один объект по требованию:

//glorp.js
module.exports = function () {
  this.foo = function () { return 'bar' }
  this.baz = 5
  return this // need to return `this` object here
}

Теперь у вас хороший прототип:

var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz)

Есть много других способов играть с module.exports и require. Просто помните, что require('foo') всегда возвращает тот же экземпляр, даже если вы вызываете его несколько раз.

Примечание

Для выполнения следующих действий

var g1 = new require('glorp')()
console.log(g1.foo())
console.log(g1.baz) 

this должен быть возвращен в функции, назначенной module.exports. В противном случае вы получите TypeError:

console.log(g1.foo())
          ^
TypeError: Cannot read property 'foo' of undefined

Ответ 3

Вы можете найти лучший ответ в исходном коде node.js. Если кому-то нужен ваш js-модуль, ваш script превращается в функцию node следующим образом (см. src/node.js).

// require function does this..
(function (exports, require, module, __filename, __dirname) {
    ... your javascript contents...
});

Node перенесет ваш script. Затем над script будет выполняться следующим образом:

//module.js
var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

Итак, в script,

exports is just module.exports.

В script вы можете добавить что-то к этому объекту экспорта (функции..). require функция вернет этот объект. Это node.js модульная система (стандартная спецификация JS).

Но будьте осторожны, чтобы не изменять module.exports. В противном случае ваш текущий экспорт будет бессмысленным.

Ответ 4

module - это объект, представляющий то, что хотел бы опубликовать в этом конкретном исходном файле. Вместо того, чтобы иметь что-то похожее на файлы заголовков в мире c/С++, вы описываете, что экспортирует модуль, определяя этот объект. среда выполнения node использует этот объект для определения того, что ваш модуль является "общедоступным".

его аналогичная концепция для экспорта функций из dll в скомпилированном мире. вы должны четко определить, к каким функциям может обращаться внешний мир. это помогает с инкапсулированием и позволяет организовать ваши библиотеки в чистом виде.

Ответ 5

Код модуля находится в файле module.exports (модуль может быть составлен другим модулем). Есть много способов построить модуль, но это один из самых распространенных (и мой личный фаворит).

// Dependencies
// const module = require('module');

// Module object
var foo = {}

// Internal property
foo._a = 'a';

// "Public" property
foo.b = 'b';

// Method
foo.fu = function() { return 'fu' };

// Export
module.exports = foo;