---
title: "app.config.ts"
description: "使用 App Config 文件在应用内暴露响应式配置。"
canonical_url: "https://nuxt.zhcndoc.com/docs/3.x/directory-structure/app-config"
---
# app.config.ts

> 使用 App Config 文件在应用内暴露响应式配置。

Nuxt 提供了一个 `app.config` 配置文件，用于在应用内暴露响应式配置，支持在运行时通过生命周期函数或 Nuxt 插件更新配置，并支持热模块替换（HMR）进行编辑。

你可以使用 `app.config.ts` 文件轻松提供运行时应用配置。该文件可以使用 `.ts`、`.js` 或 `.mjs` 扩展名。

```ts twoslash [app.config.ts]
export default defineAppConfig({
  foo: 'bar',
})
```

::caution
请不要在 `app.config` 文件中放入任何秘密值。它将被暴露到用户客户端包中。
::

::note
配置自定义 [`srcDir`](https://nuxt.zhcndoc.com/docs/3.x/api/nuxt-config#srcdir) 时，请确保将 `app.config` 文件放在新的 `srcDir` 路径的根目录下。
::

## 用法

要将配置和环境变量暴露给应用的其他部分，需要在 `app.config` 文件中定义配置。

```ts twoslash [app.config.ts]
export default defineAppConfig({
  theme: {
    primaryColor: '#ababab',
  },
})
```

现在，我们可以使用 [`useAppConfig`](https://nuxt.zhcndoc.com/docs/3.x/api/composables/use-app-config) 组合式函数，在服务端渲染页面和浏览器中统一访问 `theme`。

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

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

[`updateAppConfig`](https://nuxt.zhcndoc.com/docs/3.x/api/utils/update-app-config) 工具可用于在运行时更新 `app.config`。

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

const newAppConfig = { foo: 'baz' }

updateAppConfig(newAppConfig)

console.log(appConfig) // { foo: 'baz' }
</script>
```

::read-more{to="https://nuxt.zhcndoc.com/docs/3.x/api/utils/update-app-config"}
详细了解 `updateAppConfig` 工具。
::

## 类型定义 App Config

Nuxt 会尝试自动从提供的应用配置生成 TypeScript 接口，这样你不必手动定义类型。

但有些情况下你想自己定义类型。可能想要定义两种类型。

### App Config 输入类型

`AppConfigInput` 可能由模块作者使用，用于声明设置应用配置时有效的 *输入* 选项。这不会影响 `useAppConfig()` 的类型。

```ts [index.d.ts]
declare module 'nuxt/schema' {
  interface AppConfigInput {
    /** 主题配置 */
    theme?: {
      /** 主应用颜色 */
      primaryColor?: string
    }
  }
}

// 为了增强类型时总是确保导入或导出某个内容
export {}
```

### App Config 输出类型

如果你想为调用 [`useAppConfig()`](https://nuxt.zhcndoc.com/docs/3.x/api/composables/use-app-config) 后的结果指定类型，则需要扩展 `AppConfig`。

::warning
定义 `AppConfig` 类型时请谨慎，因为这会覆盖 Nuxt 根据你实际定义的应用配置推断出的类型。
::

```ts [index.d.ts]
declare module 'nuxt/schema' {
  interface AppConfig {
    // 这会完全替换已有的 `theme` 属性的推断类型
    theme: {
      // 你可能想为此值指定更具体的类型，比如字符串字面量类型
      primaryColor?: 'red' | 'blue'
    }
  }
}

// 为了增强类型时总是确保导入或导出某个内容
export {}
```

## 合并策略

Nuxt 会在应用的[层](https://nuxt.zhcndoc.com/docs/3.x/getting-started/layers)中对 `AppConfig` 使用自定义合并策略。

此策略使用 [Function Merger](https://github.com/unjs/defu#function-merger) 实现，允许为 `app.config` 中值为数组的每个键定义自定义合并策略。

::note
函数合并器只能在扩展层中使用，不能用于项目中的主 `app.config`。
::

以下是用法示例：

::code-group
```ts twoslash [layer/app.config.ts]
export default defineAppConfig({
  // 默认数组值
  array: ['hello'],
})
```

```ts twoslash [app.config.ts]
export default defineAppConfig({
  // 使用合并函数覆盖默认数组值
  array: () => ['bonjour'],
})
```
::

## 已知限制

截至 Nuxt v3.3，`app.config.ts` 文件和 Nitro 共享，因此存在以下限制：

1. 不能在 `app.config.ts` 中直接导入 Vue 组件。
2. Nitro 上下文中，有些自动导入不可用。

这些限制是因为 Nitro 处理应用配置时不完整支持 Vue 组件。

虽然可以在 Nitro 配置中通过使用 Vite 插件作为变通方案，但不推荐这样做：

```ts [nuxt.config.ts]
export default defineNuxtConfig({
  nitro: {
    vite: {
      plugins: [vue()],
    },
  },
})
```

::warning
使用此变通方法可能会导致意外行为和错误。Vue 插件只是 Nitro 上下文中不可用的众多插件之一。
::

相关问题：

- [Issue #19858](https://github.com/nuxt/nuxt/issues/19858)
- [Issue #19854](https://github.com/nuxt/nuxt/issues/19854)

::note
Nitro v3 将通过移除对应用配置的支持来解决这些限制。
你可以在[此拉取请求](https://github.com/nitrojs/nitro/pull/2521)中跟踪进展。
::


## Sitemap

See the full [sitemap](https://nuxt.zhcndoc.com/sitemap.md) for all pages.
