W dzisiejszym artykule przedstawię, w jaki sposób możemy skorzystać ze zmiennych środowiskowych w aplikacji React.

Plik .env

Zacznijmy od utworzenia czystej aplikacji za pomocą create-react-app. Następnie uruchamiamy aplikację.

Teraz w głównym folderze aplikacji tworzymy plik .env. W tym pliku będziemy przechowywać zmienne. Dla naszego przykładu, stworzymy jedną zmienną, której wartość będziemy chcieli wyświelić.

REACT_APP_TEST_KEY="value from test key"

Uwaga!
Zmienne definiowane w ten sposób powinny zaczynać się od prefixu REACT_APP_

Teraz spróbujemy pobrać zawartość w komponencie… Nowo dodany klucz powinien być widoczny w process.env. Wyświetlimy zatem zawartość obiektu w konsoli.

function App() {
    console.log(process.env)

    return (
        <div>test</div>
    );
}

Przyjrzyjmy się zawartości konsoli:

FAST_REFRESH: true
NODE_ENV: "development"
PUBLIC_URL: ""
WDS_SOCKET_HOST: undefined
WDS_SOCKET_PATH: undefined
WDS_SOCKET_PORT: undefined
__proto__: Object

Nasza wartość nie jest widoczna. Dzieje się tak dlatego, że jest ona dodawana podczas budowania aplikacji. Aby zobaczyć nowo dodaną wartość, wyłączmy i włączmy ponownie aplikację.

Teraz w konsoli powinna ukazać się nam wartość:

REACT_APP_TEST_KEY: "value from test key"

Polecam również sprawdzić zdefiniowanie tej wartości bez REACT_APP_ jako prefix… 🙂 Wtedy rzeczywiście tracimy dostęp do zmiennej.

Pamiętajmy, aby przy każdej zmianie wartości na nowo uruchomić aplikację, aby zmiany były widoczne, nawet jeżeli zmieniamy wartość, a nie dodajemy/usuwamy zmienną.

Warto tutaj przypomnieć, że w bardziej elegancki sposób możemy odwołać się do tej wartości, używając destrukturyzacji.

const { REACT_APP_TEST_KEY } = process.env;

UWAGA!
Wartości, które dodaliśmy w ten sposób będą osadzone w buildowanej aplikacji, zatem będą widoczne bezpośrednio w pliku .js. Warto po stworzeniu zmiennych zrobić build aplikacji i wyszukać frazę naszego klucza w plikach. W związku z tym nie przechowujemy w tym miejscu żadnych wrażliwych danych typu hasła!

Kilka plików .env

Czasami pojawiają się sytuacje, że chcemy stworzyć inne zmienne dla aplikacji produkcyjnych, a inne dla aplikacji w stanie deweloperskim. Może to być np. inny adres URL do naszego API itd.

W tej sytuacji wystarczy stworzyć pliki o nazwie .env.development oraz .env.production. Obsługę zapewni nam react-scripts (https://www.npmjs.com/package/react-scripts), które dołączone jest do create-react-app (https://create-react-app.dev/).

Dodajmy zatem dwa wyżej wymienione pliki o różnych zawartościach, aby sprawdzić zachowanie i to, co zostanie zwrócone.

.env.development

REACT_APP_TEST_KEY="test key development mode"

.env.production

REACT_APP_TEST_KEY="test key PRODUCTION mode"

Po dodaniu dwóch plików, nie pozostało nic innego jak ponownie uruchomić aplikację. Z związku z tym, że działamy w trybie developerskim, co też widoczne jest w process.env
NODE_ENV: "development"
powinniśmy otrzymać wartość test key development mode.

W przypadku create-react-app dla polecenia:
npm start = NODE_ENV="development"
npm test = NODE_ENV="test"
npm build = NODE_ENV="production"

Bardzo łatwo można to sprawdzić. Wystarczy uruchomić polecenie npm build i uruchomić zbudowaną aplikację. W konsoli powinniśmy zobaczyć:

NODE_ENV: "production"
PUBLIC_URL: ""
WDS_SOCKET_HOST: undefined
WDS_SOCKET_PATH: undefined
WDS_SOCKET_PORT: undefined
FAST_REFRESH: true
REACT_APP_TEST_KEY: "test key PRODUCTION mode"

Zmienne z kilku plików

Załóżmy, że chcemy zdefiniować różne wartości, część z nich jest wspólna, zaś część różni się w zależności od trybu. Nic prostszego 🙂 Zmienne wspólne możemy zdefiniować w pliku .env, zmienne do środowiska w trybie development w pliku .env.development, a te do trybu „production” w pliku .env.production.

Przykład:

.env

REACT_APP_TEST_KEY="value from test key"
REACT_APP_ENV_VARIABLE="variable env"

.env.production

ACT_APP_TEST_KEY="test key PRODUCTION mode"

Dla naszego przykładu wynikiem, który zobaczymy w konsoli dla zbuildowanej aplikacji będzie:

NODE_ENV: "production"
PUBLIC_URL: ""
WDS_SOCKET_HOST: undefined
WDS_SOCKET_PATH: undefined
WDS_SOCKET_PORT: undefined
FAST_REFRESH: true
REACT_APP_TEST_KEY: "test key PRODUCTION mode"
REACT_APP_ENV_VARIABLE: "variable env"

Dzięki i do następnego artykułu już za miesiąc! 🙂

Źródła:
Obraz: https://unsplash.com/photos/PXB7yEM5LVs
Create React App: https://create-react-app.dev/