如何在 nextjs 中使用不同的 .env 文件?

IT技术 reactjs environment-variables next.js
2021-04-09 19:16:36

我希望环境变量有不同的配置文件,并且能够在我的下一个项目中使用它们。我看到了dotenv的例子

但我不喜欢在 .env 文件中定义变量,也不想在 config.next.js 文件中定义它们。如果由于某种原因我将变量放在 .env 文件中但忘记将它们放在 config.next.js 文件中,则代码开始出现问题。有没有办法更有效地做到这一点?

我在 package.json 中的脚本:

"scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start",
    "lint": "eslint pages --ext .ts,.tsx,.js",
    "test": "jest",
    "commit": "git-cz",
    "dev:production": "dotenv next"
},

我的 .env 变量

TITULO=react, typescript, material ui App

零件

import { NextPage }          from 'next';
import { FunctionComponent } from 'react';

interface HelloWorldProps {
  nombre: string,
  saludo?: string
}


const HelloWorld: FunctionComponent<HelloWorldProps> = ({ nombre, saludo = 'noches' }: HelloWorldProps) => (
  <>
    <h1>Hola {nombre} buenas {saludo}</h1>
    {/* eslint-disable-next-line multiline-ternary */}
    <h2>{process.env.TITULO ? 'hola' : 'adios'}</h2>
  </>
);

const Home: NextPage = () => <HelloWorld nombre="cristian" />;

export default Home;

6个回答

Next 9.4 内置了对 .env 文件的支持:https ://nextjs.org/docs/basic-features/environment-variables

但是,如果您想拥有多个 .env 文件,例如:

  • .env.development
  • .env.staging
  • .env.presaging
  • .env.生产

使用内置的 env 变量支持是不可能的。目前官方支持的环境只有 3 种,分别是:“开发”、“测试”、“生产”。next dev你使用“开发”,next build && next start使用“生产”环境。

如果您需要为生产环境构建,但例如使用“.env.staging”,那么您需要添加env-cmd包,并将此行添加到您的 package.json 中:

"build:staging": "env-cmd -f .env.staging yarn build && yarn start"

接下来将使用“.env.staging”变量进行生产构建。

这很适合在本地启动应用程序。但是当你在我的情况下部署时,它不会加载环境变量。我有一个默认的 .env 并且在构建时我添加了 .env.staging 例如。在已部署的版本中,仅显示来自 .env 的变量?你能帮我解决这个问题吗?
2021-05-23 19:16:36
下一个开发使用“开发”,下一个构建 && 下一个启动使用“生产”环境,然后如何在“测试”环境中运行?
2021-06-05 19:16:36
关于cmd-env. 顺便说一句,看起来它应该是 nextJs 的一个选项 =)
2021-06-05 19:16:36
@WendellPereira 确实如此,我们需要安装外部库来处理环境,这太荒谬了——”
2021-06-08 19:16:36
这没问题,但是一旦在任何地方运行,它就无法与 Docker 构建一起使用,因为您需要使用不同的命令进行构建。这是解决方案:github.com/andrewmclagan/react-env
2021-06-20 19:16:36

大多数这些答案的问题在于它们违背了“一次构建随处运行”的原则,实际上我们大多数人都在使用这种技术来构建和运行 Docker 容器。不可能有多个这样的构建命令,这将是不好的做法。

最好让您的环境在运行时可用。我们创建了一个允许下一次静态优化的包,并且仍然有运行时环境变量window.__ENV

https://github.com/andrewmclagan/react-env

这是通过在运行时从列入白名单的 env vars 生成环境配置对象来实现的:

{
  ...
  "scripts": {
    "dev": "react-env -- next dev", // where .env.${APP_ENV}
    "start": "react-env --env APP_ENV -- next start" // where .env.${APP_ENV}
  }
  ...
}
构建后如何从流程环境中选择 API 基本 URL?如果实际 URL 在构建过程中未知,并且会在启动时传递给 Docker 容器?
2021-05-24 19:16:36
请参阅此包的文档。你可以这样做。
2021-05-27 19:16:36
来自其他环境并且对 NextJS 这样做绝对感到震惊,感谢您发出理性的声音。
2021-06-06 19:16:36
也在谷歌上搜索了一段时间,只是对接下来处理 env 的“默认”方式感到困惑 - 谢谢
2021-06-12 19:16:36

您可以通过以下两种方式在 nextjs 中拥有不同的 .env 文件:

1. 使用 env-cmd 包

在脚本中提供环境文件的路径,例如:

"scripts": {
    "start": "env-cmd path/to/prod/env/file next start",
    "start:dev": "env-cmd path/to/prod/env/file next dev",   
    "build:dev": "env-cmd path/to/dev/env/file next build",
    "build:test": "env-cmd path/to/test/env/file next build",
    "build:stage": "env-cmd path/to/stage/env/file next build",
    "build": "env-cmd path/to/stage/prod/file next build",        
},

2. 使用 dotenv 包

在 next.config.js 文件中添加以下内容:

require("dotenv").config({ path: `${process.env.ENVIRONMENT}` });

module.exports = {
      // your configs
}

并在您的脚本中,提供 ENVIRONMENT 变量,例如:

"scripts": {
    "start": "ENVIRONMENT=path/to/prod/env/file next start",
    "start:dev": "ENVIRONMENT=path/to/dev/env/file next dev",
    "build:dev": "ENVIRONMENT=path/to/dev/env/file next build",
    "build:test": "ENVIRONMENT=path/to/test/env/file next build",
    "build:stage": "ENVIRONMENT=path/to/stage/env/file next build",
    "build": "ENVIRONMENT=path/to/stage/prod/file next build",        
},

注意:不要将您的 .env* 文件放在根文件夹中,否则 NEXT 将自动从您的 .evn* 文件中选择并且它仅支持生产和开发阶段。所以它会忽略其他 .env.my-stage 文件。

找不到module:错误:无法解析“C:\admin\node_modules\dotenv\lib”中的“fs”
2021-05-26 19:16:36
@RichardTrembecký,是的,没错。如果没有生产构建,next start将无法工作并env-cmd在构建过程中注入变量。
2021-05-27 19:16:36
你好。命令env-cmd需要的next start吗?我认为变量是在构建过程中内联的,并且next start只是运行该构建,对吗?
2021-06-13 19:16:36

Next 9.4 支持开箱即用的环境变量包含对多种环境的支持

新环境变量支持

  • 默认情况下,环境变量仅在 Node.js 环境中可用
  • 前缀为 的环境变量NEXT_PUBLIC_暴露给浏览器

暴露环境变量

Next.js 允许您使用环境变量文件公开变量(.env),包括对多种环境的支持。它是这样工作的:

  • .env - 包含所有环境的环境变量
  • .env.local - 所有环境的局部变量覆盖
  • .env.[environment]- 一种环境的环境变量。例如:.env.development
  • .env.[environment].local- 一种环境的局部变量覆盖。例如:.env.development.local
但我怎样才能启动会使用的应用程序.env.staging
2021-05-25 19:16:36

npm i dotenv

然后将以下代码添加到next.config.js,重新启动应用程序,您就可以开始了!

// next.config.js

require('dotenv').config()
const webpack = require('webpack')

module.exports = {
  webpack: (config) => {
    config.plugins.push(
      new webpack.EnvironmentPlugin(process.env)
    )
    return config
  }
}

如果您的 .env 文件与next.config.js将路径添加到您的配置不在同一文件夹中,如下所示,

require('dotenv').config({ path: 'path/to/.env' })
在 Next 9.4.0 中添加 config.plugins.push 行对我有用;谢谢!
2021-06-03 19:16:36