Nuxt Nation conference is coming. Join us on November 12-13.

app.config.ts

Предоставьте доступ к реактивной конфигурации в приложении с помощью конфигурационного файла приложения.

Nuxt предоставляет конфигурационный файл app.config для отображения реактивной конфигурации в приложении с возможностью ее обновления в рантайме в рамках жизненного цикла или с помощью nuxt-плагина и редактирования с помощью HMR (hot-module-replacement).

Вы можете легко настроить приложение в рантайме, используя файл app.config.ts. Он может иметь расширение .ts, .js или .mjs.

app.config.ts
export default 
defineAppConfig
({
foo
: 'bar'
})
Не помещайте никаких секретных значений в файл app.config. Он доступен для клиентского бандла пользователя.
When configuring a custom srcDir, make sure to place the app.config file at the root of the new srcDir path.

Использование

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

app.config.ts
export default 
defineAppConfig
({
theme
: {
primaryColor
: '#ababab'
} })

We can now universally access theme both when server-rendering the page and in the browser using useAppConfig composable.

pages/index.vue
<script setup lang="ts">
const appConfig = useAppConfig()

console.log(appConfig.theme)
</script>

The updateAppConfig utility can be used to update the app.config at runtime.

pages/index.vue
<script setup>
const appConfig = useAppConfig() // { foo: 'bar' }

const newAppConfig = { foo: 'baz' }

updateAppConfig(newAppConfig)

console.log(appConfig) // { foo: 'baz' }
</script>
Read more about the updateAppConfig utility.

Типизация конфигурации приложения

Nuxt пытается автоматически сгенерировать интерфейс TypeScript из предоставленной конфигурации приложения, поэтому вам не придется типизировать ее самостоятельно.

Однако есть некоторые случаи, когда вы можете захотеть типизировать ее самостоятельно. Есть две возможные вещи, которые вы можете захотеть типизировать.

Ввод конфигурации приложения

AppConfigInput может использоваться авторами модулей, которые объявляют допустимые параметры input при настройке конфигурации приложения. Это не повлияет на тип useAppConfig().

index.d.ts
declare module 'nuxt/schema' {
  interface AppConfigInput {
    /** Конфигурация темы */
    theme?: {
      /** Основной цвет приложения */
      primaryColor?: string
    }
  }
}

// Всегда важно убедиться, что вы импортируете/экспортируете что-либо при расширении типа.
export {}

Вывод конфигурации приложения

Если вы хотите типизировать результат вызова useAppConfig(), то вам нужно будет расширить AppConfig.

Будьте осторожны при типизации AppConfig, так как вы перезапишете типы, которые Nuxt выводит из вашей фактически определенной конфигурации приложения.
index.d.ts
declare module 'nuxt/schema' {
  interface AppConfig {
    // Это полностью заменит существующее выведенное свойство `theme`
    theme: {
      // Возможно, вам захочется ввести это значение, чтобы добавить более конкретные типы, чем те, которые может вывести Nuxt,
      // например, типы строковых литералов.
      primaryColor?: 'red' | 'blue'
    }
  }
}

// Всегда важно убедиться, что вы импортируете/экспортируете что-либо при расширении типа.
export {}

Стратегия слияния

Nuxt использует специальную стратегию слияния для AppConfig в слоях вашего приложения.

Эта стратегия реализуется с помощью Function Merger, который позволяет определить пользовательскую стратегию слияния для каждого ключа в app.config, имеющего массив в качестве значения.

Функцию merger можно использовать только в расширенных слоях, а не в основном файле app.config проекта.

Вот пример того, как это можно использовать:

export default 
defineAppConfig
({
// Значение массива по умолчанию
array
: ['hello'],
})

Known Limitations

As of Nuxt v3.3, the app.config.ts file is shared with Nitro, which results in the following limitations:

  1. You cannot import Vue components directly in app.config.ts.
  2. Some auto-imports are not available in the Nitro context.

These limitations occur because Nitro processes the app config without full Vue component support.

While it's possible to use Vite plugins in the Nitro config as a workaround, this approach is not recommended:

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    vite: {
      plugins: [vue()]
    }
  }
})
Using this workaround may lead to unexpected behavior and bugs. The Vue plugin is one of many that are not available in the Nitro context.

Related issues:

Nitro v3 will resolve these limitations by removing support for the app config. You can track the progress in this pull request.