2012-01-22 5 views
23

Właśnie zacząłem pracować z nodejs. Zastanawiam się, czy istnieje sposób, aby "wymagać" pliku tylko raz w aplikacji. Używam struktury klasowej do uzyskania klasycznego OOPS w moim projekcie JS. Każda "klasa" zawarta jest we własnym pliku JS. Chcę "wymagać" struktury klasy w każdym pliku, aby mogły funkcjonować niezależnie, ale chcą, aby kod init był uruchamiany tylko raz.Czy istnieje sposób, aby "wymagać" pliku JS tylko raz w nodejs?

Mogę użyć flagi, aby zaimplementować to samodzielnie, ale wbudowany sposób byłby miły. Wyszukaj "wymagaj raz" prowadzi mnie do wszystkich pytań związanych z PHP.

Odpowiedz

59

require jest zawsze "wymagaj raz". Po pierwszym połączeniu require po raz pierwszy, require używa pamięci podręcznej i zawsze zwraca ten sam obiekt.

Dowolny kod wykonywalny poruszający się w module zostanie uruchomiony tylko jeden raz.

Z drugiej strony, jeśli chcesz, aby kilka razy uruchamiał kod inicjalizacyjny, po prostu wyślij ten kod do wyeksportowanej metody.

edit: Przeczytaj sekcję „buforowanie” z http://nodejs.org/docs/latest/api/modules.html#modules

+1

Świetnie! Dziękuję za szybką odpowiedź. – atlantis

+0

Czy możesz wyjaśnić lub podać przykład, kiedy wypowiadasz 'uruchom kod inicjalizacyjny wiele razy, po prostu wyślij ten kod do wyeksportowanej metody.' –

+1

@sudo zamiast zostawiać kod w treści modułu, umieść go w eksportowanej funkcji . Moduły wymagające Twojego modułu mogą następnie wykonać tę funkcję, aby ponownie uruchomić kod inicjalizacyjny. np. '' 'js var db = connect(); module.exports = db '' ' vs ' '' js module.exports = połączyć '' ' Inny sposób myślenia o to: moduły Node zawsze są samotnymi. Twój singleton może narazić konstruktora/fabrykę na tworzenie instancji. – timoxley

1

Jeśli naprawdę chcesz górną kod poziomu w module (kod, który nie jest zawarty w metodach lub funkcji w module), aby wykonać więcej niż jeden raz można moduł usunąć to obiekt, który jest w pamięci podręcznej na obiekt require.cache tak:

delete require.cache[require.resolve('./mymodule.js')]; 

Zrób to, zanim wymaga modułu po raz drugi.

W większości przypadków prawdopodobnie chcesz, aby kod najwyższego poziomu modułu był uruchamiany tylko raz, a kiedy indziej potrzebujesz modułu, do którego chcesz eksportować tylko ten moduł.

var myMod = require("./mymodule.js"); //the first time you require the 
             //mymodule.js module the top level code gets 
             //run and you get the module value returned. 


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js 
             //module you will only get the module value 
             //returned. Obviously the second time you 
             //require the module it will be in another 
             //file than the first one you did it in. 
Powiązane problemy