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
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)
参考:这里
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)
参考:这里
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)
参考:这里
@DarrylR 已经提到 usingnext.config.js
和 Next 的运行时配置,但您也可以使用 Next 的构建时配置。
这让您可以将process.env.XXXX
权限放入代码中(如下面的第 3 步所示),并且您无需导入任何内容。但是,如果您在使用Next.js本地构建和部署到ZEIT Now时都应设置环境变量,我不知道您是否可以使用此方法将它们保存在一个文件中(请参阅下面的第 2 步)。
运行时配置文档建议您通常希望使用构建时配置:
警告:通常您希望使用构建时配置来提供您的配置。这样做的原因是运行时配置增加了渲染/初始化开销,并且与自动预渲染不兼容。
脚步:
NODE_ENV
构建过程如果部署使用现在ZEIT,您可以设置在构建时使用的ENV变量中now.json
:
{
"version": 2,
"build": {
"env": {
"NODE_ENV": "production"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您也想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
构建之外的其他脚本进行设置。
process.env.NODE_ENV
将其添加到此处next.config.js
所述:
$ NODE_ENV=production npm run build
Run Code Online (Sandbox Code Playgroud)
"build": "NODE_ENV=production next build"
Run Code Online (Sandbox Code Playgroud)
另一个简单的解决方案:
在根文件夹中创建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)
从 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
有关文档,请参阅此处