#typescript #environment-variables #next.js
#typescript #переменные среды #next.js
Вопрос:
У меня есть .env.local
файл, в котором заданы три переменные:
NEXT_PUBLIC_MAGIC_PUBLISHABLE_KEY=pk_test_<get-your-own>
MAGIC_SECRET_KEY=sk_test_<get-your-own>
TOKEN_SECRET=some-secret
Я распечатываю их в pages/login.ts
:
import UserAuthenticationPage from 'client/features/user-authentication/user-authentication-container';
import redirectIfLoggedIn from 'client/hocs/redirect-if-logged-in';
import { NextPage } from 'next';
(UserAuthenticationPage as NextPage).getInitialProps = async () => {
console.log('env in login.ts getInitialProps', process.env);
return {
namespacesRequired: ['common', 'user-authentication'],
};
};
console.log('env in login.ts client side', process.env);
export default redirectIfLoggedIn('/')(UserAuthenticationPage);
что приводит к:
env in login.ts getInitialProps {
__NEXT_PROCESSED_ENV: 'true',
NEXT_PUBLIC_MAGIC_PUBLISHABLE_KEY: 'pk_test_BD092E437FE31429',
MAGIC_SECRET_KEY: 'sk_test_C02E14264C276A40',
TOKEN_SECRET: 'my-secret-token-thingy'
}
на сервере и
env in login.ts client side {}
на клиенте. Я также вижу Loaded env from /Users/dev/my-nextjs-project/.env.local
распечатку при запуске next dev
.
Какие общедоступные переменные среды не отображаются в браузере?
Комментарии:
1. Я бы предположил, что они устанавливаются для клиента во время сборки , а не во время выполнения (это может быть проблемой, особенно в нескольких средах, по причинам, которые я раскрываю в blog.jonrshar.pe/2020/Sep/19/spa-config.html ). Как выглядит ваш процесс развертывания?
2. @jonrsharpe Спасибо, это решило проблему. Мне пришлось использовать publicRuntimeConfig .
Ответ №1:
Как указал JonRSharpe, я смог решить эту проблему, используя: publicRuntimeConfig .
import getConfig from 'next/config';
/**
* @param key The key of the environment variable you want to get.
* @throws Throws if the environment variable is absent.
* @returns The value of the environment variable.
*/
function getEnvironmentVariable(key: string, checkRuntime = false) {
const variable = process.env[key];
if (variable) {
return variable;
}
if (checkRuntime) {
const { publicRuntimeConfig } = getConfig();
const runtimeVariable = publicRuntimeConfig[key];
if (runtimeVariable) {
return runtimeVariable;
}
}
throw new Error(`Missing environment variable for key: ${key}.`);
}
export default getEnvironmentVariable;