2011-03-18 20 views
7

w moim serwerze .js zawarłem bibliotekę podkreślników.node.js wymaga dziedziczenia?

var _ = require('underscore') 

mam trasy tak:

// require routes 
require('./routes/document'); 

W trasie dokumentu, chcę użyć podkreślenia. Wygląda jednak na to, że _ var nie jest dziedziczony/znajdujący się poza zasięgiem dokumentu. Czy to znaczy, że muszę ustawić _ var na każdej wymaganej trasie? Czy istnieje bardziej inteligentny sposób na zrobienie tego?

Dzięki.

Odpowiedz

6

Tak, powinieneś ustawić _ w plikach, które powinny być dostępne.

Można również umieścić go w zasięgu globalnym, usuwając część var.

_ = require('underscore'); 
require('./routes/document'); // _ will be visible in document as well 
+6

Jeśli używasz 'global._ = require ("podkreślenie"); wtedy znaczenie staje się bardziej oczywiste i nie ma "wątpliwości", czy zapomniałeś o 'var'. – Raynos

+4

Usunięcie 'var' umieszcza go w zasięgu modułu, a nie w zasięgu globalnym. – Raynos

+0

@Raynos Co to jest "zakres modułu"? Czy to oznacza, że ​​tylko ten moduł i wszystkie moduły wymagane z tego modułu mogą uzyskać do niego dostęp? – MiniGod

4

Sprawdź dokumentację modułu node.js, gdzie wymagane jest() wyjaśnienie.

http://nodejs.org/docs/v0.4.5/api/modules.html

Jak dla specyfiki.

„Moduły są buforowane po raz pierwszy są one załadowane oznacza to (między innymi), że każde wezwanie do require («foo») dostanie dokładnie ten sam obiekt został zwrócony, jeśli rozwiąże ten sam plik. "

Jeśli więc potrzebujesz ("podkreślenia") zarówno w bibliotece macierzystej, jak i "./routes/document", zostanie załadowana tylko jedna instancja modułu podkreślenia, a zatem obie wersje będą w rzeczywistości tym samym obiektem.

A przy okazji nie chcesz definiować zmiennych w zakresie globalnym, ponieważ może on generować efekty uboczne i potencjalnie nadpisywać właściwości w innych modułach.

Wreszcie, moduł util dostarcza dziedziczy metoda podklasa inny konstruktor i dziedziczą od swoich pierwowzorów.

http://nodejs.org/docs/v0.4.5/api/util.html#util.inherits

+0

'_' jest ogólną biblioteką narzędzi. Jeśli użyjesz, użyjesz go przez cały zestaw kodu. Jest używany do "ulepszania" JavaScript. Myślę, że można go włączyć globalnie, ponieważ w przeciwnym razie "wymagałbym" go w _every pliku single_ node.js. W większości przypadków tak należy tego unikać. – Raynos

+2

@Raynos Rozumiem, że jest to biblioteka ogólnego przeznaczenia. Moja odpowiedź była w ogólnej formie, niezależnie od wymaganego modułu. Niemniej i tak nie rozszerzyłbym globalnego zakresu. :-) – pdeschen

+0

jak uniknąć pisania 'require (" global-common ");' we wszystkich twoich plikach. (Zakładając, że masz coś, co jest zawarte w każdym pliku). – Raynos

1

O ile wiem, node.js silnik „wymaga/Opłaty” moduł/file.js w innym zakresie (Nie wiem dokładnie, jak wiemy), ze względów bezpieczeństwa (wyobraźmy sobie moduł może zmienić vars, jeśli jest to wymagane, to byłoby niebezpieczne !, więcej informacji na ten temat: http://en.wikipedia.org/wiki/Information_hiding).

Jedynym wyjątkiem są obiekty globalne http://nodejs.org/api/globals.html, które są narażone na zasięg modułu.

globalny obiekt jest właśnie Objet "globalny", a wszystko można zdefiniować bez słowa kluczowego var faktycznie dodaje się do tego globalnego obiektu:

foo_var = "Cokolwiek"

oznacza, że:

console.log (global.foo_var) // Rejestruje "Cokolwiek"

+0

nope. Sprawdź https://nodejs.org/api/globals.html#globals_global – Tivie

+0

@ Tivie Z której części się nie zgadzasz? Eksperyment "foo_var" działa dokładnie tak, jak to opisano. – chris

+0

Przepraszam, źle zinterpretowałem to, co napisałeś. – Tivie