Next.js将NODE_ENV传递给客户端

Jac*_*ild 11 javascript environment-variables node.js reactjs next.js

我正在使用Next.js构建一个React SSR应用程序。

我希望能够在客户端访问NODE_ENV,因为这将告诉我的应用程序要使用哪些API端点。

我正在努力为此找到一个体面的方法。第一次在服务器上呈现页面时,我想将NODE_ENV定义为窗口变量,然后在进行API调用的辅助函数中,检查是否在服务器或客户端上调用了代码,并根据需要使用window或process.env变量。

有没有人对这个问题有好的解决方案。这肯定是一个普遍的问题,但是我找不到任何好的解决方案。

Dar*_*ert 35

1.您可以将其包含在webpack配置中(使用dotenv-webpack依赖项):

require('dotenv').config()

const path = require('path')
const Dotenv = require('dotenv-webpack')

module.exports = {
  webpack: (config) => {
    config.plugins = config.plugins || []

    config.plugins = [
      ...config.plugins,

      // Read the .env file
      new Dotenv({
        path: path.join(__dirname, '.env'),
        systemvars: true
      })
    ]

    return config
  }
}
Run Code Online (Sandbox Code Playgroud)

参考:这里


2.使用babel插件将变量导入整个应用程序:

env-config.js

const prod = process.env.NODE_ENV === 'production'

module.exports = {
  'process.env.BACKEND_URL': prod ? 'https://api.example.com' : 'https://localhost:8080'
}
Run Code Online (Sandbox Code Playgroud)

.babelrc.js

const env = require('./env-config.js')

module.exports = {
  presets: ['next/babel'],
  plugins: [['transform-define', env]]
}
Run Code Online (Sandbox Code Playgroud)

index.js

export default () => (
  <div>Loading data from { process.env.BACKEND_URL }</div>
)
Run Code Online (Sandbox Code Playgroud)

参考:这里

3.使用next / config:

next.config.js

module.exports = {
  publicRuntimeConfig: {
    API_URL: process.env.API_URL
  }
}
Run Code Online (Sandbox Code Playgroud)

index.js

import React from 'react'
import getConfig from 'next/config'

const {publicRuntimeConfig} = getConfig()
const {API_URL} = publicRuntimeConfig

export default class extends React.Component {
  static async getInitialProps () {
    // fetch(`${API_URL}/some-path`)
    return {}
  }

  render () {
    return <div>
            The API_URL is {API_URL}
    </div>
  }
}
Run Code Online (Sandbox Code Playgroud)

参考:这里

  • 我认为最后一个是最好的解决方案,谢谢! (7认同)
  • 谢谢,这是一个非常有用的答案! (2认同)

Arn*_*ugo 8

使用 Next 的构建时配置

@DarrylR 已经提到 usingnext.config.js和 Next 的运行时配置,但您也可以使用 Next 的构建时配置

这让您可以将process.env.XXXX权限放入代码中(如下面的第 3 步所示),并且您无需导入任何内容。但是,如果您在使用Next.js本地构建和部署到ZEIT Now时都应设置环境变量,我不知道您是否可以使用此方法将它们保存在一个文件中(请参阅下面的第 2 步)。

运行时配置文档建议您通常希望使用构建时配置:

警告:通常您希望使用构建时配置来提供您的配置。这样做的原因是运行时配置增加了渲染/初始化开销,并且自动预渲染不兼容。


脚步:

1. 设置NODE_ENV构建过程

1.1立即使用ZEIT

如果部署使用现在ZEIT,您可以设置在构建时使用的ENV变量now.json

{
  "version": 2,
  "build": {
    "env": {
      "NODE_ENV": "production"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

1.2 本地运行时(可选)

如果您也想NODE_ENV在本地运行时进行设置,则不会由now.json. 但是,您可以通过其他方式设置它,例如:

$ NODE_ENV=production npm run build
Run Code Online (Sandbox Code Playgroud)

或将构建脚本更改package.json

"build": "NODE_ENV=production next build"
Run Code Online (Sandbox Code Playgroud)

如果需要,您当然也可以为NODE_ENV构建之外的其他脚本进行设置。

2.使下一个内联值 process.env.NODE_ENV

将其添加到此处next.config.js所述:

$ NODE_ENV=production npm run build
Run Code Online (Sandbox Code Playgroud)

3.在代码中使用

"build": "NODE_ENV=production next build"
Run Code Online (Sandbox Code Playgroud)


Yuv*_*evy 8

另一个简单的解决方案:

在根文件夹中创建2个文件:

.env.development
.env.production
Run Code Online (Sandbox Code Playgroud)

根据需要在里面添加变量,例如在 .env.development 文件中:

NEXT_PUBLIC_ENV="development"
Run Code Online (Sandbox Code Playgroud)

并在 .env.Production 文件中:

NEXT_PUBLIC_ENV="production"
Run Code Online (Sandbox Code Playgroud)

然后使用它例如:

console.log('Version: ', process.env.NEXT_PUBLIC_ENV);
Run Code Online (Sandbox Code Playgroud)


Mel*_*hia 8

从 Next.js 9.4 开始,NextJs 现在内置了对环境变量的支持,这允许您使用 .env 文件执行以下操作:

.env.local 示例:

DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
Run Code Online (Sandbox Code Playgroud)

如果要将环境变量公开给客户端,则必须在变量前加上前缀,NEXT_PUBLIC_例如:

NEXT_PUBLIC_API_PORT=4000
Run Code Online (Sandbox Code Playgroud)

如果你想使用该变量,你可以这样使用它:process.env.NEXT_PUBLIC_API_PORT

有关文档,请参阅此处