#javascript #reactjs #next.js #create-react-app
Вопрос:
Я не могу динамически обращаться к переменным среды в NextJS. Во .env.local
мне есть:
NEXT_PUBLIC_TEST=test
Во _app.tsx
мне есть:
const test = "NEXT_PUBLIC_TEST";
console.log(process.env.NEXT_PUBLIC_TEST); // = 'test'
console.log(process.env[test]); // = undefined
Я попробовал то же самое в приложении Create React:
# .env
const test = 'REACT_APP_TEST'
console.log(process.env.REACT_APP_TEST) // = 'test'
console.log(process.env[test]) // = 'test'
Кто-нибудь знает, почему NextJS не разрешает этого и как это переопределить? Я знаю next.config.js
, что это вещь, но я бы хотел ее использовать .env
.
Комментарии:
1. @brc-dd это так, проверьте свою консоль, она ведет журнал неопределенно
2. Мне нужны значения в браузере, вот в чем была проблема
Ответ №1:
Согласно официальным документам:
Примечание: Чтобы сохранить в безопасности секреты только для сервера, Next.js
process.env.*
заменяет правильными значениями во время сборки. Это означает, чтоprocess.env
это не стандартный объект JavaScript.
Следовательно, то, что вы пытаетесь сделать, возможно только в режиме разработки, что тоже возможно в коде на стороне сервера.
Вы можете вручную создать объект, отображающий константы среды, и использовать его вместо process.env
, если вы действительно хотите использовать динамические значения.
// utils/config.js
export default {
TEST: process.env.NEXT_PUBLIC_TEST
};
// pages/index.js
import config from "../utils/config";
const test = "TEST";
console.log(config[test]);
const IndexPage = () => <div>Hello World</div>;
export default IndexPage;
Комментарии:
1. Ура, как жаль, что все так вышло. Приложение Create React обеспечивает тот же уровень безопасности (пропускает только переменные env с префиксами), не нарушая объект
2. @bdmason Вы можете попробовать создать объект самостоятельно, сопоставив все общедоступные среды, и использовать его вместо
process.env
.3. @bcr-dd Я видел, что это был способ сделать конфигурацию, но я хотел, чтобы она была помечена. Похоже, что для моего проекта тоже есть способ настроить его для каждой среды, что в любом случае может быть лучшим решением, поскольку клиентские переменные никогда не являются секретными, и это избавляет нас всех от передачи файлов env var. Спасибо за помощь