Zapytałem tutaj: node.js wymagają dziedziczenia?
i powiedziano mi, że mogę ustawić zmienne w zakresie globalnym, pomijając zmienną.
To mi nie działa.
to znaczy:
_ = require('underscore');
Nie udostępnia _ dla wymaganych plików. Mogę ustawić za pomocą ekspresu app.set
i mieć go dostępnego gdzie indziej.
Czy ktoś może potwierdzić, że to ma zadziałać? Dzięki.
javascript
node.js
express
Złupić
źródło
źródło
exports
. Jest o wiele lepszy.Odpowiedzi:
Możesz użyć
global
tak:źródło
window
znajduje się obiekt globalny.document
jest własnościąwindow
.W węźle można ustawić zmienne globalne za pomocą obiektu „global” lub „GLOBAL”:
lub bardziej pożytecznie ...
Ze źródła węzła widać, że są one aliasy do siebie:
W powyższym kodzie „to” jest kontekstem globalnym. W systemie modułów commonJS (z którego korzysta węzeł) obiekt „ten” w module (tj. „Twój kod”) NIE jest kontekstem globalnym. Aby to udowodnić, zobacz poniżej, gdzie wypluwam „ten” obiekt, a następnie gigantyczny „GLOBALNY” obiekt.
** Uwaga: jeśli chodzi o ustawienie „GLOBAL._”, ogólnie powinieneś po prostu to zrobić
var _ = require('underscore');
. Tak, robisz to w każdym pliku używającym podkreślenia, tak jak robisz to w Javieimport com.foo.bar;
. Ułatwia to określenie działania kodu, ponieważ powiązania między plikami są „jawne”. Lekko irytujące, ale dobre. .... To jest głoszenie.Istnieje wyjątek od każdej reguły. Miałem dokładnie JEDEN przykład, w którym musiałem ustawić „GLOBAL._”. Tworzyłem system do definiowania plików „config”, które były w zasadzie JSON, ale zostały „napisane w JS”, aby umożliwić nieco większą elastyczność. Takie pliki konfiguracyjne nie miały instrukcji „wymagają”, ale chciałem, aby miały one dostęp do podkreślenia (system ENTIRE był oparty na szablonach podkreślenia i podkreślenia), dlatego przed oceną „config” ustawiłbym „GLOBAL._”. Więc tak, dla każdej reguły jest gdzieś wyjątek. Ale powinieneś mieć naprawdę dobry powód i nie tylko „mam dość pisania„ wymagaj ”, więc chcę zerwać z konwencją”.
źródło
.js
pliku i zadzwonićrequire
przed wyeksportowaniem konfiguracji?Inne rozwiązania wykorzystujące słowo kluczowe GLOBAL to koszmar w utrzymaniu / czytelności (+ zanieczyszczenie przestrzeni nazw i błędy), gdy projekt staje się większy. Widziałem ten błąd wiele razy i miałem problem z jego naprawieniem.
Użyj pliku JS, a następnie użyj eksportu modułów.
Przykład:
globals.js
Następnie, jeśli chcesz ich użyć, użyj wymagają.
źródło
globals.domain
?A co z globalną przestrzenią nazw
global.MYAPI = {}
Edytuj po komentarzu camilo-martin : Wszyscy inni plakaty mówią o związanym z tym złym wzorcu. Pomijając tę dyskusję, najlepszym sposobem globalnego zdefiniowania zmiennej (pytanie OP) jest użycie przestrzeni nazw.
@tip: http://thanpol.as/javascript/development-using-namespaces
źródło
require
jest! Można używać przestrzeni nazw, ale nie wszystkieglobal.foo = global.foo || {}
na wszystkich plikach czy coś w tym stylu. Wymagaj pliku, który definiuje przestrzeń nazw. Zrób to dla dzieci.Możesz po prostu użyć obiektu globalnego.
źródło
Zgadzam się, że używanie globalnej / GLOBALNEJ przestrzeni nazw do ustawiania czegokolwiek globalnego jest złą praktyką i nie używam jej wcale w teorii ( teoretycznie jest to słowo operacyjne). Jednak (tak, operacyjny) używam go do ustawiania niestandardowych klas błędów:
Tak, tabu tutaj, ale jeśli twoja strona / projekt używa niestandardowych błędów w całym miejscu, w zasadzie musisz go zdefiniować wszędzie lub przynajmniej gdzieś, aby:
Definiowanie własnych niestandardowych błędów w globalnej przestrzeni nazw oszczędza mi kłopotów z wymaganiem mojej biblioteki błędów klienta. Obrazowanie zgłaszające błąd niestandardowy, w przypadku gdy błąd niestandardowy jest niezdefiniowany.
Również jeśli jest to źle, proszę dać mi znać, ponieważ dopiero niedawno zacząłem to robić
źródło