Dodawanie pliku .env do projektu React


94

Próbuję ukryć mój klucz API, gdy zdecyduję się na github, i przejrzałem forum w poszukiwaniu wskazówek, szczególnie następujący post:

Jak ukryć klucz API w aplikacji create-react-app?

Wprowadziłem zmiany i ponownie uruchomiłem przędzę. Nie jestem pewien, co robię źle –– Dodałem .envplik do katalogu głównego projektu (nazwałem go process.env) i do pliku, który właśnie umieściłem REACT_APP_API_KEY = 'my-secret-api-key'.

Myślę, że może to być sposób, w jaki fetchdodaję klucz do mojego w App.js i próbowałem wielu formatów, w tym bez użycia literału szablonu, ale mój projekt nadal się nie kompiluje.

Każda pomoc jest bardzo ceniona.

performSearch = (query = 'germany') => {
    fetch(`https://api.unsplash.com/search/photos?query=${query}&client_id=${REACT_APP_API_KEY}`)
    .then(response => response.json())
    .then(responseData => {
        this.setState({
            results: responseData.results,
            loading: false
        });
     })
     .catch(error => {
            console.log('Error fetching and parsing data', error);
     });
}


zamiast process.envnazywać go .env.local or .env.process i przechowywać poza katalogiem src
RIYAJ KHAN

1
Cześć @RIYAJKHAN Zmieniłem plik na .env.local i jest zdecydowanie poza katalogiem src, ale nadal otrzymuję REACT_APP_API_KEY nie jest zdefiniowany: /
Bianca M

2
Naprawiło to po prostu zamknięcie terminala, na którym działa mój lokalny serwer deweloperski i ponowne uruchomienie npm run start.
n00bAppDev

3
Nie możesz ukrywać tajemnic w aplikacji Reaguj. Zobacz stackoverflow.com/a/46839021/4722345
JBallin

5
NIE używaj tego do przechowywania sekretów. Z dokumentacji ...WARNING: Do not store any secrets (such as private API keys) in your React app! Environment variables are embedded into the build, meaning anyone can view them by inspecting your app's files.
Nishant Mehta

Odpowiedzi:


112

4 kroki

  1. npm install dotenv --save

  2. Następnie dodaj następujący wiersz do swojej aplikacji.

    require('dotenv').config()

  3. Następnie utwórz .envplik w katalogu głównym aplikacji i dodaj do niego zmienne.

// contents of .env 

REACT_APP_API_KEY = 'my-secret-api-key'
  1. Na koniec dodaj .envdo swojego.gitignore pliku, aby Git go zignorował i nigdy nie trafiał na GitHub.

Jeśli używasz aplikacji create-react-app , potrzebujesz tylko kroku 3 i 4, ale pamiętaj, że zmienna musi zacząć się od zmiennej REACT_APP_, aby działała.

Odniesienie: https://create-react-app.dev/docs/adding-custom-environment-variables/

UWAGA - Konieczność ponownego uruchomienia aplikacji po dodaniu zmiennej w pliku .env.

Źródła - https://medium.com/@thejasonfile/using-dotenv-package-to-create-environment-variables-33da4ac4ea8f


36
po dodaniu zmiennej do pliku .env trzeba zrestartować aplikację .use "REACT_APP_" przed nazwą zmiennej, jeśli tworzysz aplikację do reagowania za pomocą "create-react-app".
Vikash

@tarzen chugh co zrobić, jeśli na przykład wdrażam moją aplikację na AWS. Skoro .env jest częścią gitignore, czy nie zostanie zignorowany? jak mogę zabrać się do włączenia produkcji?
user2763557

2
gdzie dodać require('dotenv').config()? który plik?
aqteifan

1
@aqteifan u nie musisz dodawać tego fragmentu, ale nazewnictwo plików .ENV odgrywa kluczową rolę
testowano

1
@ user2763557 wzorzec, którego używam, to utworzenie .env.examplepliku, w którym są ułożone definicje kluczy env. Następnie możesz skopiować .env.examplei utworzyć .envplik (w fazie rozwoju i produkcji) zawierający prawidłowe wartości, np. Klucze, podstawowe adresy URL itp. Musisz dodać .envplik do .gitignore.
Adis Azhar

88

Jestem więc nowy w React i znalazłem sposób, aby to zrobić.

To rozwiązanie nie wymaga żadnych dodatkowych pakietów.

Krok 1 ReactDocs

W powyższych dokumentach wspominają o eksporcie w Shell i innych opcjach, ta, którą spróbuję wyjaśnić, to użycie pliku .env

1.1 Utwórz plik Root / .env

#.env file
REACT_APP_SECRET_NAME=secretvaluehere123

Ważne uwagi MUSI zaczynać się od REACT_APP_

1.2 Dostęp do zmiennej ENV

#App.js file or the file you need to access ENV
<p>print env secret to HTML</p>
<pre>{process.env.REACT_APP_SECRET_NAME}</pre>

handleFetchData() { // access in API call
  fetch(`https://awesome.api.io?api-key=${process.env.REACT_APP_SECRET_NAME}`)
    .then((res) => res.json())
    .then((data) => console.log(data))
}

1.3 Problem dotyczący budowania koperty

Więc po wykonaniu kroku 1.1 | 2 nie działało, wtedy znalazłem powyższy problem / rozwiązanie. React read / create env, gdy jest skompilowany, więc musisz uruchomić npm start za każdym razem, gdy modyfikujesz plik .env, aby zmienne zostały zaktualizowane.


7
Moim zdaniem to poprawna odpowiedź! Żadne dodatkowe pakiety nie są potrzebne i właściwy sposób Reacta na importowanie zmiennych środowiskowych. Inne sposoby będą działać, ale po co dodawać pakiet i konfigurację kodu, skoro jest to już zrobione za Ciebie? Świetna odpowiedź!
ryanm

12
Brakowało mi tego, REACT_APP_dziękuję. Żadna inna osoba o tym nie wspomniała.
rotimi-best

Z jakiegoś powodu to nie zadziałało. Dostajęundefined
Si8

@ Si8 czy mógłbyś rozwinąć swój błąd / proces. Który krok undefinedwykonałeś, czy zrestartowałeś aplikację po dodaniu nowej zmiennej do .env patrz 1.3
T04435

1
Próbowałem wszystkiego. process.env.REACT_APP_API_KEYmówi undefined.
Michale Rezene,

36

Dziś jest na to prostszy sposób.

Po prostu utwórz plik .env.local w swoim katalogu głównym i ustaw tam zmienne. W Twoim przypadku:

REACT_APP_API_KEY = 'my-secret-api-key'

Następnie nazywasz go swoim plikiem js w ten sposób:

process.env.REACT_APP_API_KEY

React obsługuje zmienne środowiskowe od czasów act-scripts@0.5.0. Nie potrzebujesz do tego zewnętrznego pakietu.

https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#adding-development-environment-variables-in-env

* uwaga: proponuję .env.local zamiast .env, ponieważ create -ago-app dodaje ten plik do gitignore podczas tworzenia projektu.

Priorytet plików:

npm start: .env.development.local, .env.development, .env.local, .env

npm run build: .env.production.local, .env.production, .env.local, .env

npm test: .env.test.local, .env.test, .env (brak pliku .env.local)

Więcej informacji: https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables


Odpowiednie nazewnictwo wykonało pracę za mnie. Użyłem .env.dev i React wróciłem do .env, ponieważ szukałem .env.development
Omnibyte

26

Użytkownicy pakietu Webpack

Jeśli używasz webpacka, możesz zainstalować i używać dotenv-webpackwtyczki, aby to zrobić, wykonaj poniższe czynności:

Zainstaluj pakiet

yarn add dotenv-webpack

Utwórz .envplik

// .env
API_KEY='my secret api key'

Dodaj do webpack.config.jspliku

// webpack.config.js
const Dotenv = require('dotenv-webpack');

module.exports = {
  ...
  plugins: [
    new Dotenv()
  ]
  ...
};

Użyj go w swoim kodzie jako

process.env.API_KEY

Aby uzyskać więcej informacji i informacji o konfiguracji, odwiedź tutaj


jeśli używasz webpack-devserver, nie zobaczysz zmian, dopóki go nie zrestartujesz.
Isaac Pak

To było dla mnie najlepsze rozwiązanie. Dzięki. Jedna uwaga: używam renderowania po stronie serwera, więc musiałem zaktualizować oba pliki webpacka (również klienta).
Jorge Mauricio

@Aminu Kano, czy mógłbyś mi wyjaśnić, jaki jest sens korzystania z tego podejścia, jeśli klucz api jest nadal widoczny, jeśli przeglądam plik bundle.js online w źródłach?
Linas M.

@LinasM. tak, jasne, ale co masz na myśli mówiąc „online”?
Aminu Kano

1
@AminuKano, Tak, to bardzo jasno wyjaśniło sprawę. Dziękuję
Linas M.

10

1. Utwórz plik .env plik w folderze głównym

niektóre źródła preferują użycie .env.developmenti.env.production ale nie jest to obowiązkowe.

2. Nazwa Twojej VARIABLE -mus- zaczynać się od REACT_APP_YOURVARIABLENAME

wydaje się, że jeśli twoja zmienna środowiskowa nie zaczyna się w ten sposób, będziesz miał problemy

3. Dołącz swoją zmienną

aby dołączyć zmienną środowiskową, wystarczy umieścić w kodzie process.env.REACT_APP_VARIABLE

Nie musisz instalować żadnych zewnętrznych zależności


Robię to samo, ale w konsoli widać undefined
PRADIP GORULE

1
Jeśli otrzymujesz wartości jako niezdefiniowane, dokonaj ponownej kompilacji.
anonim

po ponownej kompilacji nadal jest niezdefiniowany. console.log('process', process.env.REACT_APP_BASE_URL);
Sanat Gupta

8

Musisz zainstalować npm install env-cmd

Utwórz .env w katalogu głównym i zaktualizuj w ten sposób & REACT_APP_ jest obowiązkowym przedrostkiem dla nazwy zmiennej.

REACT_APP_NODE_ENV="production"
REACT_APP_DB="http://localhost:5000"

Zaktualizuj plik package.json

  "scripts": {
    "start": "env-cmd react-scripts start",
    "build": "env-cmd react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  }

7
  1. Zainstaluj dotenvjako devDependencies:
npm i --save-dev dotenv
  1. Utwórz .envplik w katalogu głównym:
my-react-app/
|- node-modules/
|- public/
|- src/
|- .env
|- .gitignore
|- package.json
|- package.lock.json.
|- README.md
  1. Zaktualizuj .envplik jak poniżej & REACT_APP_ jest obowiązkowym prefiksem dla nazwy zmiennej.
REACT_APP_BASE_URL=http://localhost:8000
REACT_APP_API_KEY=YOUR-API-KEY
  1. [ Opcjonalne, ale dobra praktyka ] Teraz możesz utworzyć plik konfiguracyjny do przechowywania zmiennych i wyeksportować zmienną, aby móc jej używać z innych plików.

Na przykład utworzyłem plik o nazwie base.jsi zaktualizowałem go jak poniżej:

export const BASE_URL = process.env.REACT_APP_BASE_URL;
export const API_KEY = process.env.REACT_APP_API_KEY;
  1. Lub możesz po prostu wywołać zmienną środowiskową w pliku JS w następujący sposób:
process.env.REACT_APP_BASE_URL

Jak rozróżnić środowiska deweloperskie i prod, używając tylko jednego .envpliku? Zdaję sobie sprawę, że musimy tworzyć .env.developmenti .env.prodpliki, ale jak rozróżnić je za pomocą Twojej metody?
ameyaraje

@ameyaraje Zasadniczo ignorujemy .envplik w naszym .gitignore. Dlatego podczas wdrażania po prostu kopiujemy .envplik na nasz serwer i po prostu zmieniamy BASE_URL i inne niezbędne wartości. W ten sposób, gdy musi on wdrożyć najnowszy kod, po prostu ściągamy z git master i wdrażamy go. Nie myślimy o tym, .envbo go ignorujemy i na samym początku ustawiamy go na naszym serwerze. Dzięki!
Fatema T. Zuhora

process.env.REACT_APP_API_KEY nie podaje wartości pokazującej undefined. Zatrzymałem serwer i zrestartowałem go z npm start
vikramvi

@vikramvi Czy umieszczasz wartość w zmiennej o takiej samej nazwie REACT_APP_BASE_URLw pliku .env?
Fatema T. Zuhora

@ FatemaT.Zuhora to był mój błąd, przez pomyłkę umieściłem .env w katalogu podrzędnym zamiast umieścić go w katalogu głównym
vikramvi

2

Jeśli otrzymujesz wartości jako undefined, powinieneś rozważyć ponowne uruchomienie serwera węzłów i ponowną kompilację.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.