Co zrobić "moduł.exports "oraz" exports.metody " oznacza w NodeJS / Express?

Patrząc na losowy plik źródłowy z express frameworku dla NodeJS, są dwie linie kodu, których nie rozumiem (te linie kodu są typowe dla prawie wszystkich plików NodeJS).

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

exports = module.exports = Router;

I

/**
 * Expose HTTP methods.
 */

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

Rozumiem, że pierwszy kawałek kodu pozwala na wystawienie reszty funkcji w pliku na działanie aplikacji nodejs, ale nie rozumiem dokładnie Jak to działa , ani co oznacza kod w linii.

Co właściwie oznaczają exports i module.exports?

Wierzę, że drugi fragment kodu pozwala funkcjom w pliku uzyskać dostęp methods, ale znowu, jak dokładnie to robi.

Zasadniczo, co to są te magiczne słowa: module oraz exports?

Author: nbro, 2011-05-25

4 answers

Mówiąc dokładniej:

module jest zmienną global scope wewnątrz pliku.

Więc jeśli zadzwonisz require("foo") to:

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

Działa w taki sam sposób jak window działa w przeglądarce.

Istnieje również inny globalny obiekt o nazwie global, z którego można zapisywać i odczytywać dowolny plik, ale wiąże się to z mutacją globalnego zakresu i jest to EVIL

exports jest zmienną, która żyje na module.exports. To w zasadzie to, co wy eksportujecie kiedy plik jest wymagany.

// foo.js
module.exports = 42;

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

Jest mały problem z exports na własną rękę. _global scope context+ I module, a nie tym samym. (W przeglądarce kontekst zakresu globalnego i window są takie same).

// 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

Czytaj więcej o eksporcie

 79
Author: Raynos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:07

Aby rozwinąć odpowiedź Raynosa...

exports jest w zasadzie aliasem dla module.exports - polecam po prostu nie używać go. Możesz ujawnić metody i właściwości z modułu, ustawiając je na module.exports, Jak Następuje:

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

Następnie uzyskasz do niego dostęp w swoim kodzie:

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

Możesz także nadpisać module.exports w 2007 roku został wybrany do Izby Gmin.]}

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

Teraz masz ładny prototyp:

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

Są mnóstwo innych sposobów na zabawę z module.exports i require. Tylko pamiętaj, require('foo') zawsze zwraca tę samą instancję , nawet jeśli wywołujesz ją wielokrotnie.

Uwaga

Aby wykonać następujące czynności,

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

this musi zostać zwrócona w funkcji przypisanej do module.exports. W przeciwnym razie otrzymasz TypeError:

console.log(g1.foo())
          ^
TypeError: Cannot read property 'foo' of undefined
 33
Author: Thom Blake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 16:53:51

Najlepszą odpowiedź znajdziesz w node.kod źródłowy js. Jeśli ktoś potrzebuje twojego modułu js, Twój skrypt zamienia się w funkcję przez węzeł w następujący sposób (zobacz src / node.js).

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

Node zawija Twój skrypt. Następnie powyższy skrypt zostanie wykonany w następujący sposób:

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

Więc w Twoim skrypcie,

exports is just module.exports.

W skrypcie możesz dodać coś do tego obiektu exports (functions..). funkcja require zwróci ten obiekt. Tu node.system modułowy js (commonJS Specyfikacja).

Ale uważaj, aby nie modyfikować modułu.eksport. W przeciwnym razie twój obecny eksport będzie bez znaczenia.

 15
Author: jeremyko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 16:35:36

Moduł jest obiektem, który reprezentuje to, co dany plik źródłowy chciałby publicznie ujawnić. Zamiast mieć coś podobnego do plików nagłówkowych w świecie c / C++, opisujesz co moduł eksportuje definiując ten obiekt. node runtime używa tego obiektu do określenia, co z Twoim modułem jest publiczne.'

Jest to podobna koncepcja do eksportowania funkcji z biblioteki dll w świecie skompilowanym. musisz wyraźnie określić, jakie funkcje mogą być dostępne przez świat zewnętrzny. pomaga to w enkapsulacji i pozwala organizować biblioteki w czysty sposób.

 1
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 22:05:30