Obecnie robię to:
foo.js
const FOO = 5;
module.exports = {
FOO: FOO
};
I używając go w bar.js
:
var foo = require('foo');
foo.FOO; // 5
Czy jest na to lepszy sposób? Dziwne jest deklarowanie stałej w obiekcie eksportu.
javascript
node.js
Wieża
źródło
źródło
exports
. Co jest w tym niewygodnego?export const FOO = 5;
.module.exports={FOO:5};
?Odpowiedzi:
Możesz jawnie wyeksportować go do zakresu globalnego za pomocą
global.FOO = 5
. Następnie musisz po prostu zażądać pliku, a nawet nie zapisać wartości zwracanej.Ale tak naprawdę nie powinieneś tego robić. Utrzymywanie rzeczy właściwie kapsułkowanych to dobra rzecz. Masz już dobry pomysł, więc rób dalej to, co robisz.
źródło
Moim zdaniem wykorzystanie
Object.freeze
pozwala na DRYer i bardziej deklaratywny styl. Mój preferowany wzór to:./lib/constants.js
./lib/some-module.js
Ostrzeżenie o przestarzałej wydajności
Następujący problem został rozwiązany w wersji 8 w styczniu 2014 roku i nie jest już istotny dla większości programistów:
Należy pamiętać, że zarówno ustawienie zapisywalnego na false, jak i użycie Object.freeze ma ogromny wpływ na wydajność w wersji 8 - https://bugs.chromium.org/p/v8/issues/detail?id=1858 i http://jsperf.com / performance-frozen-object
źródło
Technicznie
const
nie jest częścią specyfikacji ECMAScript. Za pomocą wzorca „Moduł CommonJS”, który zauważyłeś, możesz zmienić wartość tej „stałej”, ponieważ jest ona teraz tylko właściwością obiektu. (nie jestem pewien, czy spowoduje to kaskadowe zmiany w innych skryptach wymagających tego samego modułu, ale jest to możliwe)Aby uzyskać prawdziwy stałych, które można również podzielić, sprawdź
Object.create
,Object.defineProperty
iObject.defineProperties
. Jeśli ustawiszwritable: false
, wartości w „stałej” nie będzie można zmienić. :)Jest to trochę gadatliwe (ale nawet to można zmienić za pomocą małego JS), ale powinieneś to zrobić tylko raz dla modułu stałych. Korzystając z tych metod, domyślny jest dowolny atrybut, który pomijasz
false
. (w przeciwieństwie do definiowania właściwości za pomocą przypisania, które domyślnie przypisuje wszystkie atrybutytrue
)Tak więc, hipotetycznie, możesz po prostu ustawić
value
ienumerable
, pomijającwritable
iconfigurable
ponieważ będą domyślnie ustawione ,false
po prostu uwzględniłem je dla jasności.Aktualizacja - stworzyłem nowy moduł ( stałe węzłów ) z funkcjami pomocniczymi dla tego bardzo przypadkowego przypadku.
constants.js - Dobrze
constants.js - lepiej
script.js
źródło
Object.defineProperty()
. Wfalse
tym kontekście przyjmuje się wszystkie nieokreślone właściwości .Sposób ES6.
eksport do foo.js
importuj w bar.js
źródło
const
wbar.js
tym wymusza niezmienność zniszczonej zmiennej, a nieconst
wfoo.js
. Oznacza to, że można używaćlet {FOO} =
wbar.js
i mutować zmienną „stały”. AFAIK, aby wymusić niezmienność eksportu, nadal potrzebne są albo moduły ES, alboObject.freeze
.FOO
środkufoo.js
.Znalazłem rozwiązanie, które Dominic zaproponował jako najlepsze, ale wciąż brakuje mu jednej cechy deklaracji „const”. Gdy deklarujesz stałą w JS za pomocą słowa kluczowego „const”, istnienie stałej jest sprawdzane w czasie analizy, a nie w czasie wykonywania. Więc jeśli źle wpisałeś nazwę stałej gdzieś w kodzie później, pojawi się błąd podczas próby uruchomienia programu node.js. Co jest znacznie lepszym sprawdzaniem pisowni.
Jeśli zdefiniujesz stałą za pomocą funkcji defin (), jak sugerował Dominic, nie dostaniesz błędu, jeśli źle przeliterujesz stałą, a wartość błędnie stałej będzie niezdefiniowana (co może prowadzić do debugowania bólów głowy).
Ale myślę, że to najlepsze, co możemy dostać.
Dodatkowo, oto rodzaj ulepszenia funkcji Dominica w constans.js:
W ten sposób możesz użyć funkcji defin () w innych modułach i pozwala ona zdefiniować stałe zarówno wewnątrz modułu constants.js, jak i stałe w module, z którego wywołałeś funkcję. Deklarowanie stałych modułu można następnie wykonać na dwa sposoby (w script.js).
Pierwszy:
Druga:
Ponadto, jeśli chcesz, aby funkcja definiować () była wywoływana tylko z modułu stałych (nie nadmuchując obiektu globalnego), zdefiniuj ją w następujący sposób w constants.js:
i użyj go w następujący sposób w script.js:
źródło
Z wcześniejszych doświadczeń projektowych jest to dobry sposób:
W pliku constants.js:
W main.js (lub app.js itp.) Użyj go w następujący sposób:
źródło
Myślę, że to
const
rozwiązuje problem większości osób szukających tej odpowiedzi. Jeśli naprawdę potrzebujesz niezmiennej stałej, spójrz na inne odpowiedzi. Aby wszystko uporządkować, zapisuję wszystkie stałe w folderze, a następnie wymagam całego folderu.plik src / main.js
src / consts_folder / index.js
Ps. tutaj
deal
inote
będzie pierwszy poziom na main.jssrc / consts_folder / note.js
Ps.
obj
będzie drugi poziom na main.jssrc / consts_folder / deal.js
Ps.
str
będzie drugi poziom na main.jsOstateczny wynik w pliku main.js:
console.log(constants.deal);
Ouput:console.log(constants.note);
Ouput:źródło
import
iexport
(prawdopodobnie potrzebuje czegoś takiego jak Babel od 2018 roku, aby użyć importu)types.js
myApp.js
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
źródło
Alternatywnie możesz pogrupować swoje „stałe” wartości w obiekcie lokalnym i wyeksportować funkcję, która zwraca płytki klon tego obiektu.
Wtedy nie ma znaczenia, czy ktoś ponownie przydzieli FOO, ponieważ wpłynie to tylko na jego lokalną kopię.
źródło
Ponieważ Node.js używa wzorców CommonJS, możesz udostępniać zmienne tylko między modułami za pomocą
module.exports
lub ustawiając zmienną globalną tak jak w przeglądarce, ale zamiast używać okna, którego używaszglobal.your_var = value;
.źródło
Skończyło się na tym, że wyeksportowałem zamrożony obiekt z anonimowymi funkcjami pobierającymi, a nie same stałe. Zmniejsza to ryzyko wprowadzenia nieprzyjemnych błędów z powodu zwykłej literówki w nazwie stałej, ponieważ błąd wykonawczy zostanie wygenerowany w przypadku literówki. Oto pełny przykład, który używa również symboli ES6 dla stałych, zapewniając unikalność i funkcje strzałek ES6. Byłbym wdzięczny za informację zwrotną, jeśli coś w tym podejściu wydaje się problematyczne.
źródło
Zalecam robienie tego z webpackiem (zakładam, że używasz webpacka).
Definiowanie stałych jest tak proste, jak ustawienie pliku konfiguracyjnego pakietu WWW:
W ten sposób zdefiniujesz je poza swoim źródłem i będą one dostępne we wszystkich twoich plikach.
źródło
Nie sądzę, że dobrą praktyką jest inwazja GLOBALNEJ przestrzeni z modułów, ale w scenariuszach, w których może to być absolutnie konieczne do jej wdrożenia:
Należy wziąć pod uwagę wpływ tego zasobu. Bez odpowiedniego nazewnictwa tych stałych ryzyko NADPISYWANIA już zdefiniowanych zmiennych globalnych jest czymś realnym.
źródło