运行时配置
Nuxt 提供了一个运行时配置 API,用于在应用程序中公开配置和密钥。
公开
要将配置和环境变量公开给应用程序的其他部分,您需要在 nuxt.config
文件中使用 runtimeConfig
选项定义运行时配置。
export default defineNuxtConfig({
runtimeConfig: {
// 仅在服务器端可用的私有密钥
apiSecret: '123',
// public 中的键也将暴露给客户端
public: {
apiBase: '/api'
}
}
})
将 apiBase
添加到 runtimeConfig.public
时,Nuxt 会将其添加到每个页面的负载中。我们可以在服务器和浏览器中通用地访问 apiBase
。
const runtimeConfig = useRuntimeConfig()
console.log(runtimeConfig.apiSecret)
console.log(runtimeConfig.public.apiBase)
公共运行时配置可以在 Vue 模板中通过 $config.public
访问。
序列化
您的运行时配置将在传递给 Nitro 之前进行序列化。这意味着任何无法序列化然后反序列化的内容(例如函数、Sets、Maps 等)不应在您的 nuxt.config
中设置。
与其从 nuxt.config
中将不可序列化的对象或函数传递到应用程序中,不如将此代码放在 Nuxt 或 Nitro 插件或中间件中。
环境变量
提供配置的最常见方法是使用环境变量。
Nuxt CLI 内置支持在开发、构建和生成时读取您的 .env
文件。但当您运行已构建的服务器时,您的 .env
文件将不会被读取。
运行时配置值在运行时会自动被匹配的环境变量替换。
有两个关键要求:
-
您希望的变量必须在您的
nuxt.config
中定义。这确保了任意环境变量不会暴露给您的应用程序代码。 -
只有一个特别命名的环境变量可以覆盖运行时配置属性。即以
NUXT_
开头的全大写环境变量,使用_
分隔键和大小写变化。
将 runtimeConfig
值的默认值设置为不同命名的环境变量(例如将 myVar
设置为 process.env.OTHER_VARIABLE
)仅在构建时有效,并将在运行时中断。
建议使用与 runtimeConfig
对象结构匹配的环境变量。
观看 Alexander Lichter 展示开发者在使用 runtimeConfig 时常犯的错误的视频。
示例
NUXT_API_SECRET=api_secret_token
NUXT_PUBLIC_API_BASE=https://nuxtjs.org
export default defineNuxtConfig({
runtimeConfig: {
apiSecret: '', // 可以被 NUXT_API_SECRET 环境变量覆盖
public: {
apiBase: '', // 可以被 NUXT_PUBLIC_API_BASE 环境变量覆盖
}
},
})
读取
Vue 应用
在 Nuxt 应用的 Vue 部分中,您需要调用 useRuntimeConfig()
来访问运行时配置。
客户端和服务器端的行为不同:
-
在客户端,只有
runtimeConfig.public
和runtimeConfig.app
(Nuxt 内部使用)中的键可用,并且对象是可写和响应式的。 -
在服务器端,整个运行时配置可用,但它是只读的,以避免上下文共享。
<script setup lang="ts">
const config = useRuntimeConfig()
console.log('运行时配置:', config)
if (import.meta.server) {
console.log('API 密钥:', config.apiSecret)
}
</script>
<template>
<div>
<div>检查开发者控制台!</div>
</div>
</template>
安全提示: 请注意不要通过渲染或传递给 useState
来将运行时配置键暴露给客户端。
插件
如果您想在任何(自定义)插件中使用运行时配置,可以在 defineNuxtPlugin
函数中使用 useRuntimeConfig()
。
export default defineNuxtPlugin((nuxtApp) => {
const config = useRuntimeConfig()
console.log('API 基础 URL:', config.public.apiBase)
});
服务器路由
您也可以在服务器路由中使用 useRuntimeConfig
访问运行时配置。
export default defineEventHandler(async (event) => {
const { apiSecret } = useRuntimeConfig(event)
const result = await $fetch('https://my.api.com/test', {
headers: {
Authorization: `Bearer ${apiSecret}`
}
})
return result
})
将 event
作为参数传递给 useRuntimeConfig
是可选的,但建议传递它以便在运行时通过环境变量覆盖服务器路由的运行时配置。
类型化运行时配置
Nuxt 尝试使用 unjs/untyped 自动从提供的运行时配置生成 TypeScript 接口。
但也可以手动为您的运行时配置进行类型化:
declare module 'nuxt/schema' {
interface RuntimeConfig {
apiSecret: string
}
interface PublicRuntimeConfig {
apiBase: string
}
}
// 在增强类型时,确保导入/导出某些内容始终很重要
export {}
nuxt/schema
为最终用户提供了一个便利,以访问 Nuxt 在其项目中使用的 schema 版本。模块作者应增强 @nuxt/schema
。
※此页面是 Nuxt.js 官方文档的非官方翻译页面。