我发现这篇很棒的帖子可以正确管理 Nuxt v2.13 应用程序中的环境变量。我只是尝试实现建议的逻辑,但我遇到了一些我想问你的问题。
我将 publicRuntimeConfig 和 privateRuntimeConfig 设置如下。我正在使用 Contentful,所以我必须正确设置 Contentful 令牌才能进行 API 调用。
export default {
// Nuxt target - See https://nuxtjs.org/api/configuration-target
target: 'static',
// Nuxt rendering mode - See https://nuxtjs.org/api/configuration-mode
mode: 'universal',
// Both server and client.
publicRuntimeConfig: {
backendApi: process.env.BACKEND_API_URL
shopUrl: process.env.SHOP_URL
},
// Only available on server using same $config (it overrides publicRuntimeConfig)
privateRuntimeConfig: {
ctfSpaceId: CTF_SPACE_ID,
ctfCdaAccessToken: CTF_CDA_ACCESS_TOKEN,
ctfCpaAccessToken: CTF_CPA_ACCESS_TOKEN,
ctfEnvironment: CTF_ENVIRONMENT
},
上面的模块导出语句我必须从 .env 定义数据,所以:
require('dotenv').config()
const {
CTF_SPACE_ID,
CTF_CDA_ACCESS_TOKEN,
CTF_CPA_ACCESS_TOKEN,
CTF_ENVIRONMENT,
} = process.env
接下来,进入 Nuxt 页面组件(选择 pages/index.vue 作为参考),记住 privateRuntimeConfig 仅在服务器端可用,我使用 $config 提升 asyncData 钩子:
async asyncData({ app, $config: { ctfSpaceId, ctfCdaAccessToken } }) {
const $i18n = app.i18n
const client = contentful.createClient({
space: ctfSpaceId,
accessToken: ctfCdaAccessToken,
})
...
}
酷,我刷新了运行 Nuxt 的浏览器选项卡,asyncData 完成了它的工作,并且适当地设置了私有配置变量。
接下来,我浏览其他应用程序页面,然后返回索引和 .
Nuxt 崩溃并且 $config 私有变量未定义。
我不想找到解决方法,因为我们正在谈论安全性,因此我只能询问我的配置是否正确以及 Nuxt 在幕后发生了什么。
Nuxt.js 文档是明确的:
每次加载页面组件之前都会调用 asyncData。它将在服务器端调用一次(在对 Nuxt 应用程序的第一次请求时)和在导航到更多路由时在客户端调用。
所以问题是如何在客户端正确加载私有配置变量。
一位导师朋友会说这个神奇的词:Noob。