module.exports
to obiekt, który jest faktycznie zwracany w wyniku require
wywołania.
exports
Zmienna jest początkowo ustawione na tym samym obiekcie (czyli to skrót „alias”), więc w kodzie modułu prawda zazwyczaj napisać coś takiego:
let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
eksportować (lub „ujawniać”) funkcje o zasięgu wewnętrznym myFunc1
i myFunc2
.
A w kodzie wywoławczym użyłbyś:
const m = require('./mymodule');
m.myFunc1();
gdzie ostatni wiersz pokazuje, jak wynikiem require
jest (zwykle) tylko zwykły obiekt, do którego właściwości można uzyskać dostęp.
Uwaga: jeśli zastąpisz, exports
to nie będzie już dotyczyć module.exports
. Więc jeśli chcesz przypisać nowy obiekt (lub odwołanie do funkcji) exports
, powinieneś również przypisać ten nowy obiektmodule.exports
Warto zauważyć, że nazwa dodana do exports
obiektu nie musi być taka sama jak nazwa modułu o wewnętrznym zasięgu dla wartości, którą dodajesz, więc możesz mieć:
let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
śledzony przez:
const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
Na to już odpowiedziano, ale chciałem dodać wyjaśnienie ...
Możesz użyć obu
exports
imodule.exports
do importowania kodu do swojej aplikacji w następujący sposób:var mycode = require('./path/to/mycode');
Podstawowym przypadkiem użycia, który zobaczysz (np. W przykładowym kodzie ExpressJS), jest ustawienie właściwości
exports
obiektu w pliku .js, który następnie zaimportujesz za pomocąrequire()
W prostym przykładzie liczenia możesz mieć:
(counter.js):
... następnie w Twojej aplikacji (web.js lub naprawdę w innym pliku .js):
Mówiąc prościej, możesz myśleć o wymaganych plikach jako funkcjach, które zwracają pojedynczy obiekt, i możesz dodawać właściwości (ciągi, liczby, tablice, funkcje, cokolwiek) do zwracanego obiektu, ustawiając je na
exports
.Czasami chcesz, aby obiekt zwracany z
require()
wywołania był funkcją, którą możesz wywołać, a nie tylko obiektem o właściwościach. W takim przypadku musisz również ustawićmodule.exports
, tak jak poniżej:(sayhello.js):
(app.js):
Różnica między eksportem a modułem. Eksportami wyjaśniono lepiej w tej odpowiedzi tutaj .
źródło
require
zaczyna się w stosunku do folderu, w którym wykonujesznode app.js
. Zalecam opublikowanie nowego pytania z wyraźnym kodem + przykładami struktury folderów, aby uzyskać jaśniejszą odpowiedź.var sayHello = require('./ex6_module.js'); console.log(sayHello());
i moduł:module.exports = exports = function() { return "Hello World!"; }
module.exports = exports = function(){...}
2.exports
to tylko zmienna prawda? Innymi słowy, może byćmodule.exports = abc = function()
Należy pamiętać, że mechanizm modułu NodeJS jest oparty na modułach CommonJS , które są obsługiwane w wielu innych implementacjach, takich jak RequireJS , ale także SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js , a nawet Adobe Photoshop (przez PSLib ). Pełną listę znanych wdrożeń można znaleźć tutaj .
O ile moduł nie używa funkcji lub modułu specyficznych dla węzła, gorąco zachęcam do korzystania z niego,
exports
zamiastmodule.exports
którego nie jest częścią standardu CommonJS , a następnie w większości nie jest obsługiwany przez inne implementacje.Inną właściwością NodeJS jest przypisanie odwołania do nowego obiektu,
exports
zamiast dodawania do niego właściwości i metod, tak jak w ostatnim przykładzie podanym przez Jed Watsona w tym wątku. Osobiście odradzałbym tę praktykę, ponieważ przerywa to cykliczne wsparcie dla mechanizmu modułów CommonJS. Nie jest wtedy obsługiwany przez wszystkie implementacje, a przykład Jed powinien zostać napisany w ten sposób (lub podobny), aby zapewnić bardziej uniwersalny moduł:(sayhello.js):
(app.js):
Lub używając funkcji ES6
(sayhello.js):
(app.js):
PS: Wygląda na to, że Appcelerator implementuje również moduły CommonJS, ale bez obsługi referencji cyklicznych (patrz: Moduły Appcelerator i CommonJS (buforowanie i referencje cykliczne) )
źródło
Kilka rzeczy, na które musisz uważać, jeśli przypisujesz odniesienie do nowego obiektu do
exports
i / lubmodules.exports
:1. Wszystkie właściwości / metody wcześniej dołączone do oryginału
exports
lubmodule.exports
są oczywiście utracone, ponieważ eksportowany obiekt będzie się teraz odnosił do innej nowejTen jest oczywisty, ale jeśli dodasz wyeksportowaną metodę na początku istniejącego modułu, upewnij się, że rodzimy wyeksportowany obiekt nie odwołuje się do innego obiektu na końcu
2. W przypadku, gdy jedna z wartości
exports
lubmodule.exports
odwołuje się do nowej wartości, nie odnoszą się już do tego samego obiektu3. Podstępna konsekwencja. Jeśli zmienisz odniesienie do obu
exports
imodule.exports
, trudno powiedzieć, który interfejs API jest widoczny (wygląda namodule.exports
wygrany)źródło
właściwość module.exports lub obiekt eksportu pozwala modułowi wybrać, co powinno być współdzielone z aplikacją
Mam wideo na module module_export dostępne tutaj
źródło
Dzieląc kod programu na wiele plików,
module.exports
służy do publikowania zmiennych i funkcji konsumentowi modułu.require()
Połączenia w pliku źródłowym otrzymuje z odpowiednimimodule.exports
ładowany z modułu.Pamiętaj, pisząc moduły
module.exports
Obiekt jest dostępny także jakoexports
skrót. Ale zwracając jedyną funkcję, zawsze używajmodule.exports
.Zgodnie z: „Moduły część 2 - Pisanie modułów” .
źródło
odnośnik wygląda następująco:
właściwości
exports
lubmodule.exports
, takie jak funkcje lub zmienne, zostaną ujawnione na zewnątrzjest coś, na co należy zwrócić większą uwagę: nie
override
eksportuj.dlaczego ?
ponieważ eksportuje tylko odwołanie do module.exports, możesz dodać właściwości do eksportów, ale jeśli zastąpisz eksport, link referencyjny zostanie zerwany.
dobry przykład :
zły przykład :
Jeśli chcesz odsłonić tylko jedną funkcję lub zmienną, na przykład:
ten moduł ujawnił tylko jedną funkcję, a właściwość name jest prywatna na zewnątrz.
źródło
Istnieją pewne domyślne lub istniejące moduły w node.js podczas pobierania i instalowania node.js, takie jak http, sys itp.
Ponieważ są one już w node.js, kiedy chcemy korzystać z tych modułów, po prostu lubimy importować moduły , ale dlaczego? ponieważ są już obecne w pliku node.js. Importowanie przypomina pobieranie ich z node.js i umieszczanie ich w programie. A potem z nich korzystać.
Podczas gdy eksport jest dokładnie odwrotny, tworzysz moduł, który chcesz, powiedzmy, moduł add.js i umieszczając ten moduł w pliku node.js, robisz to, eksportując go.
Zanim cokolwiek tu napiszę, pamiętaj, moduł.exports.additionTwo jest taki sam jak exports.additionTwo
Huh, więc dlatego lubimy
Uważaj na ścieżkę
Powiedzmy, że utworzyłeś moduł add.js,
Po uruchomieniu w wierszu polecenia NODE.JS:
Spowoduje to błąd powiedzenia
Wynika to z faktu, że proces node.js nie może wykonać pliku add.js, ponieważ nie wspomnieliśmy o ścieżce. Tak więc możemy ustawić ścieżkę za pomocą NODE_PATH
Teraz powinno to działać poprawnie bez żadnych błędów !!
Jeszcze jedno, możesz również uruchomić plik add.js, nie ustawiając zmiennej NODE_PATH, z powrotem do wiersza poleceń nodejs:
Ponieważ podajemy tutaj ścieżkę, mówiąc, że znajduje się ona w bieżącym katalogu,
./
powinna ona również działać poprawnie.źródło
Moduł hermetyzuje powiązany kod w pojedynczą jednostkę kodu. Podczas tworzenia modułu można to interpretować jako przeniesienie wszystkich powiązanych funkcji do pliku.
Załóżmy, że istnieje plik Hello.js, który zawiera dwie funkcje
Piszemy funkcję tylko wtedy, gdy użyteczność kodu to więcej niż jedno wywołanie.
Załóżmy, że chcemy zwiększyć użyteczność funkcji do innego pliku, np. World.js, w tym przypadku eksport pliku pojawia się w obrazie, który można uzyskać w module.exports.
Możesz po prostu wyeksportować obie funkcje za pomocą kodu podanego poniżej
Teraz musisz tylko podać nazwę pliku w pliku World.js, aby korzystać z tych funkcji
źródło
Celem jest:
Wikipedia
Wyobrażam sobie, że pisanie dużych programów bez kodu modułowego / wielokrotnego użytku staje się trudne. W nodejs możemy tworzyć programy modułowe, wykorzystując
module.exports
definiowanie tego, co udostępniamy i z czym komponujemy nasz programrequire
.fileLog.js
stdoutLog.js
program.js
wykonać
Teraz spróbuj zamienić plik ./stdoutLog.js na plik ./fileLog.js .
źródło
Osiąga następujące rzeczy:
Posiadanie modułów ułatwia znajdowanie określonych części kodu, dzięki czemu nasz kod jest łatwiejszy w utrzymaniu.
NodejS
korzysta z systemu modułowego CommomJS, który działa w następujący sposób:module.export
składnirequire('file')
składniPrzykład:
test1.js
test2.js
Inne przydatne informacje:
require()
jest wywoływany w tym samym module, jest on pobierany z pamięci podręcznej.require()
razu.źródło
źródło
return "Hello world"
nie ma znaczenia), ale bez żadnego wyjaśnienia. Przed udzieleniem odpowiedzi upewnij się, że twoja odpowiedź doda coś do tematu.