如何在 Nuxt 2 或 3 中使用 .env 变量?

IT技术 javascript vue.js vuejs2 nuxt.js recaptcha
2021-01-16 03:49:08

我在项目根目录中有 .env 文件,在我的 nuxt 配置中,我使用变量来配置 ReCaptcha,如下所示:

import dotenv from 'dotenv'
dotenv.config()

export default {
    modules: [
        ['@nuxtjs/recaptcha', {
          siteKey: process.env.RECAPTCHA_SITE_KEY,
          version: 3,
          size: 'compact'
        }],
    ]
}

在 .env 中是这样的:

RECAPTCHA_SITE_KEY=6L....

但应用程序总是因控制台日志错误而失败:

ReCaptcha 错误:未提供密钥

当我像这样直接对 ReCaptcha 密钥进行硬编码时:siteKey: 6L....应用程序开始工作,所以我猜问题在于在 nuxt.config 中读取 .env props

你知道如何解决它吗?

编辑:我尝试通过@kissu 推荐和我在此处找到的示例更新我的 nuxt.config:https ://www.npmjs.com/package/@nuxtjs/recaptcha

所以有新的 nuxt.config 也不起作用:

export default {
    modules: [
       '@nuxtjs/recaptcha',
    ],
    publicRuntimeConfig: {
       recaptcha: {
         siteKey: process.env.RECAPTCHA_SITE_KEY,
         version: 3,
         size: 'compact'
       }
  }
}
3个回答

如果您的 Nuxt 版本是2.13 或更高版本不需要使用@nuxtjs/dotenv或类似的东西,因为它已经支持到框架中。

要使用某些变量,您需要.env在项目的根目录下有一个文件。这个应该被 git 忽略。然后你可以在那里输入一些键

PUBLIC_VARIABLE="https://my-cool-website.com"
PRIVATE_TOKEN="1234qwer"

在您的 中nuxt.config.js,您必须将这些输入到 2 个对象中,具体取决于您的用例,publicRuntimeConfig或者privateRuntimeConfig

export default {
  publicRuntimeConfig: {
    myPublicVariable: process.env.PUBLIC_VARIABLE,
  },
  privateRuntimeConfig: {
    myPrivateToken: process.env.PRIVATE_TOKEN
  }
}

区别publicRuntimeConfig基本上可以在任何地方使用,而privateRuntimeConfig只能在 SSR 期间使用(密钥只有在不发送到浏览器的情况下才能保持私密)。

的一个流行用例privateRuntimeConfignuxtServerInit在构建过程中或在构建过程中使用它(或yarn buildyarn generate)以使用无头 CMS 的 API 调用填充应用程序。

更多信息可以在这篇博文中找到:https : //nuxtjs.org/blog/moving-from-nuxtjs-dotenv-to-runtime-config/


  • 然后,您将能够.vue直接将其访问到任何文件中
this.$config.myPublicVariable
  • 您也可以/plugins使用此语法将其访问到 Nuxt 中
export default ({ $axios, $config: { myPublicVariable } }) => {
  $axios.defaults.baseURL = myPublicVariable
}
  • 如果 Nuxt module或nuxt.config.js文件中的任何键需要此变量,请直接使用
process.env.PRIVATE_TOKEN

有时,语法可能会有所不同,在这种情况下,请参阅您的 Nuxt module文档。

// for @nuxtjs/gtm
publicRuntimeConfig: {
  gtm: {
    id: process.env.GOOGLE_TAG_MANAGER_ID
  }
},

PS:如果你使用target: server(默认值),你可以yarn buildyarn start部署你的应用到生产中。然后,yarn start一次又一次地更改您想要的任何环境变量将不需要重建。因此名称RuntimeConfig

Nuxt3 更新

如前所述在这里,你可以使用Nuxt3以下

nuxt.config.js

import { defineNuxtConfig } from 'nuxt3'

export default defineNuxtConfig({
  publicRuntimeConfig: {
    secret: process.env.SECRET,
  }
}

在任何组件中

<script setup lang="ts">
  const config = useRuntimeConfig()
  config.secret
</script>
是的,我多次检查站点密钥和秘密,都是正确的,因为当我直接在 nuxt.config 中编写它而不是使用 env 变量时一切正常,所以问题一定是在 nuxt config 中读取 env
2021-03-18 03:49:08
感谢您的回答,我尝试根据您的建议进行编辑,但仍然出现相同的错误。我也更新了我的问题。
2021-03-20 03:49:08
.env你的项目中有填充吗?
2021-03-26 03:49:08
你有 Github 仓库吗?你有一个有效的密钥.env,没有错字?你怎么试试这个?
2021-03-28 03:49:08
@PirateApp 这是您实现此目的的方法:stackoverflow.com/a/68338032/8816585
2021-04-09 03:49:08

这很容易。为您提供 axios/nuxt 示例

  1. .env文件中定义变量

    baseUrl=http://localhost:1337

  2. 在 env-object 中的 nuxt.config.js 中添加变量(并在 axios 配置中使用它):

    export default {env: {baseUrl: process.env.baseUrl},axios: {baseURL: process.env.baseUrl},}

  3. 在任何文件中使用 env 变量,如下所示:

    console.log(process.env.baseUrl)

请注意console.log(process.env)将输出 {} 但console.log(process.env.baseUrl)仍将输出您的值!

你不应该使用process.env.baseUrlmyPublicVariable正如我的回答中所解释的那样。
2021-03-17 03:49:08

您还可以在envNuxt nuxt.config.js 中使用该属性:

export default {
  // Environment variables
  env: {
    myVariable: process.env.NUXT_ENV_MY_VAR
  },
  ...
}

然后在你的插件中:

const myVar = process.env.myVariable