Конфигурация времени выполнения

Nuxt предоставляет API конфигурации времени выполнения для доступа к настройкам и секретам в приложении.

Раскрытие

Чтобы передать конфигурацию и переменные окружения остальным частям вашего приложения, вам нужно определить конфигурацию времени выполнения в файле nuxt.config, используя опцию runtimeConfig.

nuxt.config.ts
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. Это означает, что все, что не может быть сериализовано и затем десериализовано (например, функции, Set, Map и так далее), не должно быть установлено в вашем nuxt.config.

Вместо того чтобы передавать несериализуемые объекты или функции в ваше приложение из вашего nuxt.config, вы можете поместить этот код в плагин или в middleware Nuxt или Nitro.

Переменные окружения

Наиболее распространённый способ задать конфигурацию — переменные окружения.

В Nuxt CLI встроена поддержка чтения файла .env при разработке, сборке и генерации. Но когда вы запускаете собранный сервер, ваш файл .env не будет прочитан.
Узнать больше Docs > 3 X > Directory Structure > Env.

Значения конфигурации времени выполнения автоматически заменяются соответствующими переменными окружения во время выполнения.

Существует два ключевых требования:

  1. Желаемые переменные должны быть определены в файле nuxt.config. Это гарантирует, что произвольные переменные окружения не попадут в код вашего приложения.
  2. Только переменная окружения со специальным именем может переопределить свойство конфигурации времени выполнения — то есть переменная окружения, начинающаяся с NUXT_ и использующая _ для разделения ключей и изменения регистра.
Установка по умолчанию значений runtimeConfig через переменные окружения с другими именами (например, привязка myVar к process.env.OTHER_VARIABLE) сработает только на этапе сборки и приведёт к ошибкам во время выполнения. Рекомендуется использовать переменные окружения, соответствующие структуре вашего объекта runtimeConfig.
Посмотрите видео Александра Лихтера о типичных ошибках при использовании runtimeConfig.

Пример

.env
NUXT_API_SECRET=api_secret_token
NUXT_PUBLIC_API_BASE=https://nuxtjs.org
nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    apiSecret: '', // может быть переопределена переменной окружения NUXT_API_SECRET
    public: {
      apiBase: '', // может быть переопределена переменной окружения NUXT_PUBLIC_API_BASE
    },
  },
})

Чтение

Приложение Vue

Во Vue-части вашего приложения Nuxt вам нужно вызвать useRuntimeConfig(), чтобы получить доступ к конфигурации времени выполнения.

Поведение объекта отличается на клиенте и на сервере:
  • На клиенте доступны только ключи в runtimeConfig.public и runtimeConfig.app (последний Nuxt использует внутренне); сам объект при этом доступен для записи и реактивен.
  • На сервере доступна вся конфигурация времени выполнения, но только для чтения — чтобы не смешивать контекст между запросами.
pages/index.vue
<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.

Плагины

Если вы хотите использовать конфигурацию времени выполнения внутри любого (пользовательского) плагина, вы можете использовать useRuntimeConfig() внутри вашей функции defineNuxtPlugin.

plugins/config.ts
export default defineNuxtPlugin((nuxtApp) => {
  const config = useRuntimeConfig()

  console.log('Базовый URL API:', config.public.apiBase)
})

Серверные маршруты

Вы можете получить доступ к конфигурации времени выполнения и внутри маршрутов сервера, используя useRuntimeConfig.

server/api/test.ts
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 пытается автоматически сгенерировать интерфейс TypeScript из предоставленного конфига времени выполнения, используя unjs/untyped.

Но можно также набрать свой конфиг вручную:

index.d.ts
declare module 'nuxt/schema' {
  interface RuntimeConfig {
    apiSecret: string
  }
  interface PublicRuntimeConfig {
    apiBase: string
  }
}
// Всегда важно убедиться, что вы импортируете/экспортируете что-то при дополнении типа
export {}
nuxt/schema предоставляется для удобства конечных пользователей, чтобы получить доступ к версии схемы, используемой Nuxt в их проекте. Авторы модулей должны вместо этого дополнять @nuxt/schema.