React env variables with .env - reactjs

I'm trying to follow docs on adding env variables from react-create-app without success:
https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables
inside root of the document I have a ".env" file (default .env properties)
.env file contains only one variable 'REACT_APP_API_HOST=http://localhost:8080'
trying to access process.env inside my app (created with create react app) gives me undefined
This is app.js where I'm trying to access process.env without success.
I can't access process.env inside the code. Is there any working example on how to do it?

You can use .env file on root.
start: react-scripts start - uses .env.development
build_staging: "set REACT_APP_ENV=staging & react-scripts build" - uses .env.staging
build: "react-scripts build" - uses .env.production

In your package.json you will eventually have to add NODE_ENV=development at your start script. E.g. NODE_ENV=development && node scripts/start.js for the ejected create-react-app and NODE_ENV=development react-scripts start for the unejected one.
Edit: Apparently NODE_ENV=development is not required since it is already hardcoded when you run the start or build script. Per the docs your custom environment variables should have the following format REACT_APP* as you have already done.
A snippet would be helpful.

Related

How to set NODE_ENV on Amplify for React app

I am trying to run multiple environments of an AWS Amplify react app. So have set up a single environment, created two versions pointing to a master and a staging branch of GIT, assigned them to two different domains, and all working.
However, now I need to start one as production and one as staging so dotenv will read .env.production and .env.staging. (which is my actual objective :) )
So I set up an environment variable called NODE_ENV and set it to staging and production. However, Amplify seems to ignore it, and if I print out the environment variables, I get production on both systems
And the output from console.log(process.env)
Object
FAST_REFRESH: true
NODE_ENV: "production"
PUBLIC_URL: ""
OK, so I may have found a solution, it AIN'T pretty, but it works for me.
My solution is
Create two files,
env.production
env.stagign
Notice the missing .
They will be like your good old .env files
REACT_APP_VARIABLE=VALUE
Then you create an environment variable called BUILD_ENV like above, with an override. In my case, I have a master and staging based on the git branches.
The ugly magic comes in the build script. In amplify.yml we'll add BUILD_ENV, one line to write it, because I had a lot of problems getting it to work.
The second is that we add a new build type, called build:$BUILD_ENV
version: 2
frontend:
phases:
preBuild:
commands:
- npm ci
build:
commands:
- echo "Build environment is ${BUILD_ENV}"
- npm run build:${BUILD_ENV}
artifacts:
baseDirectory: build
files:
- '**/*'
cache:
paths:
- node_modules/**/*
The last step is that we need to get around that react build cares little about what you want to do, so we'll just build production, but with our env. So we will copy the relevant env.environment to .env.production I told you it would be ugly :)
"scripts": {
"start": "PORT=8082 react-scripts start",
"build": "react-scripts build",
"build:staging": "cp env.staging .env.production && NODE_ENV=staging react-scripts build",
"build:production": "cp env.production .env.production && react-scripts build",
=========================================
So the problem is (I think) that between react, node, AWS amplify, there are a lot of people who feel that things should be in very specific ways, like react deciding that there can only be production and dev, and amplify limiting what we're allowed to do to the environment in regards to variables.
This is probably not the right way of doing this, but it DOES work, so that's OK?

REACT env variables

I am trying to setup a project for staging between dev to prod. I am trying to follow this article as it seems kind simple just to have a config file.
https://serverless-stack.com/chapters/manage-environments-in-create-react-app.html
However early in the article he states you set the variable by doing this:
REACT_APP_TEST_VAR=123 npm start
When i start by app like that I get following:
The term 'REACT_APP_STAGE=123' is not recognized as the name of a cmdlet, function. Any pointers?
I also tried:
you need to put the "REACT_APP_TEST_VAR=123" inside the script of npm start. For example when I run a npm build command it runs the following command (Where ENVIRONMENT is a env variable):
ENVIRONMENT=production webpack --mode production
So let's assume your cnpm start runs the regular "react-scripts start". You should define in your package json that the script "start" will do "REACT_APP_TEST_VAR=123 react-scripts start":
"start": "REACT_APP_TEST_VAR=123 react-scripts start",

dotenv : how to set custom path

This is my architecture and I want to access the.env file
I tried all the solutions, __dirname, find-config, ckey and read all the stack solutions. I can't understand why my .env file is not loaded....
console output is always :
{NODE_ENV: "development", PUBLIC_URL: ""}
If you're using create-react-app to bootstrap your application, the react-scripts module handles setting up environment variables for you. However, there's a catch. All React environment variable needs to be prefixed with REACT_APP. Thus, your environment variable would be: REACT_APP_MY_ENV_VARIABLE.
You should not import dotenv. After changing .env files, you must restart the development server. This is the excerpt from the create-react-app docs. The .env must appear in the root of your project.
Note: You must create custom environment variables beginning with
REACT_APP_. Any other variables except NODE_ENV will be ignored to
avoid accidentally exposing a private key on the machine that could
have the same name. Changing any environment variables will require
you to restart the development server if it is running.
You can read more about environment variables and .env files with create-react-app in the create-react-app documentation.
If you really need to set a custom path, you can use env-cmd. It requires small changes in scripts section like this:
// from
"start": "react-scripts start"
// to
"start": "env-cmd -f ./custom/path/.env react-scripts start"

Set react-scripts test environment file

We're using react-scripts to run our tests, via the command react-scripts test. Locally we have our own test environments, and use the .env.test file as the environment file (it uses this automatically).
However, in our CircleCI environment we want to run the tests using the development environment, i.e. using .env.development. I can't figure out how to tell react-scripts to use the dev env file, I've tried setting various values before running the command like REACT_APP_ENV and NODE_ENV. I've tried using the env-cmd module to specify it to use the dev env file (e.g. env-cmd .env.development react-scripts test), but it STILL uses the test one.
I know in the CircleCI test command I could just overwrite the test env file with the dev one (something like cp -rf .env.development .env.test && react-scripts test), but I was wondering if there was a cleaner way of doing it (since if I did it that way, if we wanted to test using dev environment locally, it'd overwrite our personal .env.test files)?
The only thing you need to do is to modify the react-scripts test command by adding the following:
--env=jsdom
So the end result would be
// package.json
{
"scripts": {
...
"test": "react-scripts test --env=jsdom"
...
}
}
https://serverless-stack.com/chapters/environments-in-create-react-app.html

create react app not picking up .env files?

I am using create react app to bootstrap my app.
I have added two .env files .env.development and .env.production in the root.
My .env.development includes:
API_URL=http://localhost:3000/api
CALLBACK_URL=http://localhost:3005/callback
When I run my app using react-scripts start and console out process.env it spits out
{ NODE_ENV: "development", PUBLIC_URL: "" }
I've tried different things, but its just not picking up the veriables in my development file, what am I doing wrong?!
Directry structure is:
/.env.development
/src/index.js
Package.json script is:
"start": "export PORT=3005; npm-run-all --parallel server:start client:start",
"client:start": "export PORT=3005; react-scripts start",
"server:start": "node server.js",
"build": "react-scripts build",
Edit:
#jamcreencia correctly pointed out my variables should be prefixed with REACT_APP.
Edit 2
It works okay if I name the file .env but not if I use .env.development or .end.production
With create react app, you need to prefix REACT_APP_ to the variable name. ex:
REACT_APP_API_URL=http://localhost:3000/api
REACT_APP_CALLBACK_URL=http://localhost:3005/callback
** Make sure your .env file is in the root directory, not inside src folder.
CRA Docs on Adding Custom Environment Variables:
Note: You must create custom environment variables beginning with REACT_APP_. Any other variables except NODE_ENV will be ignored to avoid accidentally exposing a private key on the machine that could have the same name
Make sure your .env file is in the root directory, not inside src folder.
Had this same problem! The solution was to close the connection to my node server (you can do this with CTRL + C). Then re-start your server with 'npm run start' and .env should work properly.
Source: Github
If you want to use multiple environment like .env.development .env.production
use dotenv-cli package
add .env.development and .env.production in project root folder
and your package.json
"scripts": {
"start": "react-app-rewired start",
"build-dev": "dotenv -e .env.development react-app-rewired build",
"build-prod": "dotenv -e .env.production react-app-rewired build",
"build": "react-app-rewired build",
"test": "react-app-rewired test --env=jsdom",
"eject": "react-scripts eject"
},
then build according to environment like
npm run-script build-dev
I was having the same problem, but it was because I had my .env file in YAML format instead of JS.
It was
REACT_APP_API_PATH: 'https://my.api.path'
but it needed to be
REACT_APP_API_PATH = 'https://my.api.path'
For people who apply all those answers above and didn't work just restart the terminal of npm start, stop the live server and run it again and it will work because it works for me
Regarding env-cmd. As per VMois's kind post on gitHub, env-cmd has been updated ( version 9.0.1 as of writing ), environment variables will work as follows on your React project:
"scripts": {
"build:local": "env-cmd -f ./.env.production.local npm run build",
"build:production": "env-cmd -f ./.env.production npm run build"
}
In your package.json file.
1- Make sure .env file is based your react app root directory
2- for react app you need to prefix REACT_APP_ to the variable name. ex: REACT_APP_API_URL
3- kill server and npm start again after .env file modify
For this purpose there is env-cmd module. Install via npm npm i env-cmd then in your package.json file in scripts section:
"scripts": {
"start": "env-cmd .env.development react-scripts start",
"build": "GENERATE_SOURCEMAP=false env-cmd .env.production react-scripts build",
}
In your project root you have to create two files with the same env variables but with different values:
.env.development
.env.production
Then exclude them from public. For this in your .gitignore file add two lines:
.env.development
.env.production
So this is a proper way to use different env variables for dev and prod.
While working with .env file, be it frontend or backend.
Whenever you modify the .env file, you must restart the respective server for the changes to take effect in the application.
Hot reloading doesn't read changes from .env file.
If the .env file works but .env.development or .env.production don't, then create an empty .env file alongside those two. I don't know why but this works for me.
Your project can consume variables declared in your environment as if they were declared locally in your JS files. By default you will have NODE_ENV defined for you, and any other environment variables starting with REACT_APP_.
Reference: https://create-react-app.dev/docs/adding-custom-environment-variables
that doc creates confusion.
So you actually need to put prefix REACT_APP_ within the .env to make it work.
And make sure that you restart the test/dev/prod server because the .env content change was loaded on the build stage.
And remember not to have semi-colon after the API key in the env-file.
REACT_APP_API_KEY = 'ae87cec695cc4heheh639d06c9274a';
should be
REACT_APP_API_KEY = 'ae87cec695cc44heheh1639d06c9274a'
that was my error
when you get undefined from the environment file then just stop the terminal and restarts with npm start command.
For any VS Code users, be aware that the .env.local env file is auto-sourced, but also auto-ignored from search results when you do a project wide search for MY_ENV_VAR(probably due to it being git ignored by default). This means that if you have MY_ENV_VAR= in your .env.local like me and forgot about it, it'll break things and you'll spend 15 mins being very confused.
Was struggling for a good hour before I noticed my kind IDE added an import:
import * as process from "process";
just remove it and you're fine, if that's your case as well.
After you add .env file, you need to
restart your application
kill the server
run npm start again
And it should work
I had same issue that I wasn't able to access .env variable in App.js.
and I had solved the problem use create correct .env file.
in my case I was copy file from different OS and use in ubuntu system
so just I did "sudo touch .env" and added my variables and restart app again then it's working for me.
I forget to add process.env.
It looks like this
const domain = process.env.REACT_APP_AUTH0_DOMAIN;
first step:
in your .env.local file add REACT_APP_your_API_key in this way
second step:
Add your config file ${process.env.REACT_APP_Your_API_key}
the third step:
must restart your React App and then Test whether it works.
mainly, I forget the last step
If none of the solutions above worked for you, give these potential solutions a shot:
Make sure all the import statements within the file that is requiring defined environmental variables are being imported from the local project and not some other project(VSCode wrongly autocompleted some of my import statements in this manner)
Try exiting your current Terminal instance and running the app in a new instance
I made the silly mistake of naming my file secret.env because that's how I always did it in Node.js.
After changing the name to .env, restarting the terminal, and running npm start again, everything worked like a charm
I didn't get any value back as well. For some reason, I thought the environment file should be dev.env, qa.env etc. Actually, it's just ".env". That's that. In case some else makes this mistake.
create-react does not supports hot reload feature .env files since they are not Javascript. So, when you change the env files make sure to manually start your server to see the effect of new changes.
In my case, a manual restart of the server worked fine :)
What worked for me was to install env-cmd and after that in my package.JSON add the following line of code
"scripts": {
"start": "env-cmd -f .env.development react-scripts start ",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
As of latest react-scripts (3.2.0) it's a simple as putting say
PORT=4000
BROWSER=none
in your .env or .env.development file (..etc) which is supposed to be in the root folder.
It will NOT work with then REACT_APP prefix (the docs are outdated I guess) and it does NOT require any extra npm packages (react-scripts already includes dotenv 6.2.0)

Resources