nextJS 如何正确加载环境变量

nextJS how to load an environment variable properly

我习惯了 React,最近转向了 NextJs,但遇到了一个奇怪的场景。 在演示页面中呈现此演示组件;

import React from 'react';

import { Hello, Header } from './demo.styled';

export const Demo = () => {

  const name = process.env.userName || 'world';
  console.log("env vars userName v2: ", name)
  // env vars userName v2:  John Doe

  return (
    <Header>
      <Hello>Hello {name}!</Hello>
    </Header>
  );
};

我有一个 .env 文件,其中用户名是 John Doe,正如您在下面看到的控制台日志是输出,它加载得很好。

但是当我的页面加载时,我得到了。

Hello world!

我的项目是最近的,我正在使用

"next": "^12.1.4", "react": "17", "react-dom": "17",

而且,我的页面非常简单,它所做的只是呈现演示组件。

更新

The logs set above are in server side, but in the client side, I have this message: next-dev.js?3515:25 Warning: Text content did not match. Server: "Jhon Doe" Client: "world"

我的理解是我的 .env 文件只在服务器端,所以我怎么可能在客户端也有这些信息。

根据this document

By default environment variables are only available in the Node.js environment, meaning they won't be exposed to the browser.

至于你的情况,process.env.userName 仅在 build-time 期间编译,仅在 server-side 上可用。

如果你想在 client-side 上使用它,你需要为你的配置添加前缀 NEXT_PUBLIC_userName(但按照名称约定,我建议你将其修改为 NEXT_PUBLIC_USERNAME)

NEXT_PUBLIC_USERNAME=Jhon Doe

然后您可以将代码更改为

const name = process.env.NEXT_PUBLIC_USERNAME || 'world';

如果您想在 client-side 上显式公开 userName。您可以像下面这样更新您的 next.config.js

你原来的环境

userName=Jhon Doe

next.config.js

module.exports = {
  //add other configs here too
  env: {
    userName: process.env.userName,
  },
}

使用第二种解决方案,您无需修改​​环境变量。