我发现这篇很棒的文章可以在 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
},
Run Code Online (Sandbox Code Playgroud)
在模块导出语句上方,我必须定义 .env 中的数据,因此:
require('dotenv').config()
const {
CTF_SPACE_ID,
CTF_CDA_ACCESS_TOKEN,
CTF_CPA_ACCESS_TOKEN,
CTF_ENVIRONMENT,
} = process.env
Run Code Online (Sandbox Code Playgroud)
接下来,移入 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,
})
...
}
Run Code Online (Sandbox Code Playgroud)
酷,我刷新了 Nuxt 正在运行的浏览器选项卡,asyncData 完成了它的工作,并且私有配置变量也得到了适当的设置。
接下来,我浏览其他应用程序页面,然后返回索引和 .
Nuxt 崩溃并且 $config 私有变量未定义。
我不想找到解决方法,因为我们正在讨论安全性,因此我只能询问我的配置是否正确以及 Nuxt 在幕后发生了什么。
Nuxt.js 文档很明确:
asyncData 每次在加载页面组件之前都会被调用。它将在服务器端调用一次(在对 Nuxt 应用程序的第一个请求时),在导航到其他路线时在客户端调用。
所以问题是如何在客户端正确加载私有配置变量。
一位导师朋友会说出一个神奇的词:Noob。
无法在客户端正确加载私有变量。这样做就会暴露你所有的秘密,而这正是privateRuntimeConfig现在存在的原因。之前,很多人都犯了一个错误,将他们的秘密添加到 Nuxt 中env,从而暴露了客户端。
不幸的是,如果您想在运行时访问这些 API,则需要更改执行此操作的方式。
您要么需要静态生成项目,要么需要运行一个 API 来处理使用 API 密钥调用第 3 方服务。
请参阅https://nuxtjs.org/guide#static- generated-pre-rendering- 静态生成项目(不需要服务器)。您可能还需要使用https://nuxtjs.org/api/configuration-generate#routes来生成动态页面(例如_product.vue)
请参阅https://nuxtjs.org/api/configuration-servermiddleware/了解可能是让 API 与 Nuxt 服务器一起运行的最简单方法。
如果您只是经营博客或小商店,我强烈建议您使用静态生成。托管更简单,更便宜,并且您的项目可能已经能够按原样导出。您只需要找到一个好的主机,例如 Netlify。
| 归档时间: |
|
| 查看次数: |
5565 次 |
| 最近记录: |