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
imodule.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
?
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
są , 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
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
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.
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.
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