2012-12-17 8 views
5

Zajmuję moduł węzła my-module który z kolei zależy od innego modułu other-module. other-module jest więc zależnością jawnie wymienioną w pliku package.json mojego modułu.Jak uniknąć węzeł wymaga ładowania sam moduł dwukrotnie

Jak mój moduł modyfikuje zachowanie other-module tylko będąc require d, ważne jest, że other-module jest ładowany tylko raz, a że to jeden i tylko „przypadek” jest jednym odwołuje całym dowolnej aplikacji, która wymaga zarówno my i other.

Spodziewałem to prawdziwe według węzła modułu zasad buforowania ale co ja natrafiłem podczas pisania prostych aplikacji testowej jest taka:

Jeśli my-module jest npm install ed przedother-module wtedy ostatni doprowadza jako zależność tego pierwszego. npm install ing other-module następnie przenosi go do hierarchii node_modules po raz drugi. Następnie, gdy mój moduł wymaga other-module, węzeł ładuje "lokalną" kopię mojego modułu, a kiedy jest to drugi węzeł czasowy ponownie ładuje ją (tym razem wersja, która została zainstalowana z powodu drugiego npm install). To oczywiście nie jest zamierzony rezultat.

Jeśli my-module jest npm installe d poother-module potem skończyć z tylko jednej kopii z other-module w node_modules i moja aplikacja Test działa zgodnie z oczekiwaniami.

Takie zachowanie got me ponownie przeglądając odpowiednich polityk węźle i na pewno wystarczy natknąłem opisu modułu buforowania Ostrzeżenia ':

Moduły są buforowane na podstawie ich rozwiązany pliku. Ponieważ moduły mogą rozwiązać inną nazwę pliku w oparciu o lokalizację modułu wywołującego (ładowanie z folderów node_modules), nie jest to gwarancja, która wymaga ("foo") zawsze zwróci dokładnie ten sam obiekt, jeśli byłaby to odpowiedź na różne pliki .

W tym momencie wygląda na to, że mój moduł może lub nie może zachowywać się zgodnie z oczekiwaniami w zależności od kolejności npm install s.

Czy istnieją najlepszych praktyk mi brakuje? Czy istnieje sposób na uniknięcie tego bałaganu bez zmiany sposobu działania mojego modułu?

Odpowiedz

4

Krótka odpowiedź: Nie możesz.

Jak wskazał węzeł będzie załadować wymaganych moduł z najbardziej lokalnym miejscu. Jest to, o ile wiem, unikalne dla menedżera pakietów i pozwala ci nie dbać o dokładne drzewo zależności modułów. Węzeł i npm wymyślą to za Ciebie. Moim zdaniem jest to coś naprawdę dobrego.

piekło zależności jest po prostu unikać dając moduły możliwość zażądania dokładną wersję czego potrzebują.

myślę, co staramy się robić, chyba nie rozumiem Twoje pytanie pełni, nie jest dobra praktyka węzeł. Moduły są ładowane i przypisywane do zmiennej lokalnej. Należy unikać globalnego stanu, ponieważ może to prowadzić do dość niewygodnego i niezrównanego kodu.Dodatkowo, jeśli uda Ci się wprowadzić wstrzyknąć swój zmodyfikowany moduł do kodu innej osoby, nie może być żadnej gwarancji, że ich kod nadal będzie działał. Byłoby to tak, jak w starym Prototype.js _ dni, w których można było hackować za pomocą wbudowanych globalnych skryptów JavaScript, takich jak String lub Array, co doprowadziło do jakiegoś katastrofalnego kodu.

Należy jednak pamiętać, że jest to tylko opinia jednej osoby. Jeśli nie znajdziesz tutaj więcej odpowiedzi, opublikuj swoje pytanie w innym miejscu, takim jak kanał IRC węzła.

0

Miałem podobny problem podczas opracowywania testów z żartem.

Poniższa instrukcja pozwoli Ci załadować sam moduł ponownie w innym kontekście:

jest.resetModules();