2013-09-24 9 views
6

Chciałbym podzielić moją aplikację węzła na kilka oddzielnych plików, aby uczynić ją bardziej modułową i łatwiejszą w utrzymaniu.Czy istnieje odpowiednik kodu PHP w Node.js, więc kod ten ma dostęp do zmiennych pliku nadrzędnego?

Ale ponieważ nie ma sposobu na "dołączenie" pliku bezpośrednio do aktualnie analizowanego pliku, tak jak w innych językach, takich jak PHP, moje "moduły" lub "oddzielne pliki" nie uzyskują automatycznie dostępu do zmiennych zdefiniowanych w skrypcie to "wymaga" ich.

Jak mogę to zrobić?

myślałem o zrobieniu czegoś takiego w moim oddzielnych plikach:

module.exports = function(stuff) { 
    //I now have access to 'stuff'. 
} 

Ale to nieco kłopotliwe.

Jestem pewna, że ​​ktoś już zajął się tym przede mną, więc ... co sugerujesz?

+1

Czytaj docs: http://nodejs.org/docs/v0.5.5/api/modules.html Użycie obiektu 'exports' w module pozwala na dokonanie pewnych zmian ables lub funkcje public, podczas gdy inne zmienne pozostają prywatne. To całkiem miłe. –

+2

"Moje" moduły "lub" oddzielne pliki "nie uzyskują automatycznie dostępu do zmiennych zdefiniowanych w skrypcie, który" wymaga "ich" - czy nie utrudniłoby to Twojego kodu * do utrzymania? Idea modułów require.js polega na tym, że zapewniają funkcjonalność innym skryptom; jeśli chcą uzyskać dostęp do publicznych danych/metody innych modułów, powinni wymagać tych modułów samodzielnie. –

+0

Rozważ wzór "middleware" i pamiętaj - twój moduł jest w rzeczywistości tylko obiektem z listą funkcji 'export', które zostały wykonane podczas pierwszego 'require'. – moka

Odpowiedz

2

Najprostszym sposobem udostępniania zmiennych między modułami jest przypisanie zmiennych do globalnego obiektu przestrzeni nazw. Zmienne deklarowane w globalnej deklaracji są nadal specyficzne dla modułu w węźle, więc istnieje obiekt global.

Używanie zasięg globalny jest uważana za złą praktyką, ale może być znacznie prostsze niż w przypadku innych metod:

foo.js

global.num = 3; 
global.str = 'a string'; 
require('./bar'); 

bar.js

console.log(num); // 3 
console.log(str); // a string 
+0

To jest niesamowicie zła praktyka. Jest to dobre dla szybkich, brudnych testów lub naturalnych singletonów (na przykład utrzymujemy nasz globalny rejestrator). Właściwym sposobem jest użycie 'module.exports' lub' exports.NAME'. – Tony

+1

Nie o to pyta pytanie, a ja już oświadczyłem w odpowiedzi, że była to zła praktyka.Pytanie dotyczy prostego sposobu przekazywania zmiennych z głównego skryptu do modułu bez przypisywania funkcji do 'module.exports'. Poza tym nie eksportuję wartości z modułu do jego rodzica, przekazuję zmienne od rodzica do modułu. – hexacyanide

+0

Powtarzałem, że przyznałeś się do złej praktyki, co z pewnością było niejasne z mojego komentarza. Ale czy to rozwiązuje problem, czy powinniśmy promować złe praktyki? – Tony

Powiązane problemy