---
title: "配置"
description: "了解如何从 Nuxt 2 迁移到 Nuxt 3 的新配置。"
canonical_url: "https://nuxt.zhcndoc.com/docs/3.x/migration/configuration"
---
# 配置

> 了解如何从 Nuxt 2 迁移到 Nuxt 3 的新配置。

## `nuxt.config`

Nuxt 应用的起点仍然是你的 `nuxt.config` 文件。

::note
Nuxt 配置将使用 [`unjs/jiti`](https://github.com/unjs/jiti) 和 [`unjs/c12`](https://github.com/unjs/c12) 加载。
::

### 迁移

1. 你应该迁移到新的 `defineNuxtConfig` 函数，它提供了类型化的配置模式。
   ::code-group
   ```ts [Nuxt 2]
   export default {
     // ...
   }
   ```

   ```ts [Nuxt 3]
   export default defineNuxtConfig({
     // ...
   })
   ```
   ::
2. 如果你曾经使用过 `router.extendRoutes`，你可以迁移到新的 `pages:extend` 钩子：
   ::code-group
   ```ts [Nuxt 2]
   export default {
     router: {
       extendRoutes (routes) {
         //
       },
     },
   }
   ```

   ```ts [Nuxt 3]
   export default defineNuxtConfig({
     hooks: {
       'pages:extend' (routes) {
         //
       },
     },
   })
   ```
   ::
3. 如果你曾经使用过 `router.routeNameSplitter`，你可以通过在新的 `pages:extend` 钩子中更新路由名称生成逻辑来实现相同的效果：
   ::code-group
   ```ts [Nuxt 2]
   export default {
     router: {
       routeNameSplitter: '/',
     },
   }
   ```

   ```ts [Nuxt 3]
   import { createResolver } from '@nuxt/kit'

   export default defineNuxtConfig({
     hooks: {
       'pages:extend' (routes) {
         const routeNameSplitter = '/'
         const root = createResolver(import.meta.url).resolve('./pages')

         function updateName (routes) {
           if (!routes) {
             return
           }

           for (const route of routes) {
             const relativePath = route.file.substring(root.length + 1)
             route.name = relativePath.slice(0, -4).replace(/\/index$/, '').replace(/\//g, routeNameSplitter)

             updateName(route.children)
           }
         }
         updateName(routes)
       },
     },
   })
   ```
   ::

#### ESM 语法

Nuxt 3 是一个 [ESM 原生框架](https://nuxt.zhcndoc.com/docs/3.x/guide/concepts/esm)。虽然 [`unjs/jiti`](https://github.com/unjs/jiti) 在加载 `nuxt.config` 文件时提供了半兼容性，但请避免在此文件中使用 `require` 和 `module.exports`。

1. 将 `module.exports` 改为 `export default`
2. 将 `const lib = require('lib')` 改为 `import lib from 'lib'`

#### 异步配置

为了让 Nuxt 的加载行为更可预测，异步配置语法已被弃用。建议使用 Nuxt 钩子进行异步操作。

#### Dotenv

Nuxt 内置支持加载 `.env` 文件。避免直接在 `nuxt.config` 中导入它。

## 模块

Nuxt 和 Nuxt 模块现在仅在构建时使用。

### 迁移

1. 将所有 `buildModules` 移动到 `modules` 中。
2. 检查模块的 Nuxt 3 兼容性。
3. 如果你有任何指向目录的本地模块，需要将其更新为指向入口文件：

```diff
  export default defineNuxtConfig({
    modules: [
-     '~/modules/my-module'
+     '~/modules/my-module/index'
    ]
  })
```

::tip
如果你是模块作者，可以查看[有关模块兼容性的更多信息](https://nuxt.zhcndoc.com/docs/3.x/migration/module-authors)和[我们的模块作者指南](https://nuxt.zhcndoc.com/docs/3.x/guide/modules)。
::

## 目录变更

用于存储静态资源的 `static/` 目录已重命名为 `public/`。你可以将 `static` 目录重命名为 `public`，或者通过在 `nuxt.config` 中设置 `dir.public` 保持原名称。

::read-more{to="https://nuxt.zhcndoc.com/docs/3.x/directory-structure/public"}
::

## TypeScript

如果你使用 Nuxt 的 TypeScript 集成，迁移应用会更加容易。这并不意味着你必须用 TypeScript 编写应用，只是 Nuxt 会为你的编辑器提供自动类型提示。

你可以在[文档](https://nuxt.zhcndoc.com/docs/3.x/guide/concepts/typescript)中阅读有关 Nuxt TypeScript 支持的更多信息。

::note
Nuxt 可以使用 [`vue-tsc`](https://github.com/vuejs/language-tools/tree/master/packages/tsc) 通过 `nuxt typecheck` 命令对你的应用进行类型检查。
::

### 迁移

1. 创建一个内容如下的 `tsconfig.json` 文件：
   ```json
   {
     "extends": "./.nuxt/tsconfig.json"
   }
   ```
2. 运行 `npx nuxt prepare` 以生成 `.nuxt/tsconfig.json`。
3. 按照[文档](https://nuxt.zhcndoc.com/docs/3.x/getting-started/installation#prerequisites)中的说明安装 Volar。

## Vue 变更

在 Vue 最佳实践方面有许多变更，同时 Vue 2 至 Vue 3 之间也存在诸多破坏性变更。

建议阅读 [Vue 3 迁移指南](https://v3-migration.vuejs.org)，特别是[破坏性变更列表](https://v3-migration.vuejs.org/breaking-changes)。

目前无法在 Nuxt 3 中使用 [Vue 3 迁移构建版本](https://v3-migration.vuejs.org/migration-build.html)。

## Vuex

Nuxt 不再提供 Vuex 集成。官方推荐使用内置 Nuxt 支持的 `pinia`，通过 [Nuxt 模块](https://pinia.vuejs.org/ssr/nuxt.html) 实现。你可以在这里了解更多关于 pinia 的内容：[pinia 官方文档](https://pinia.vuejs.org)。

用 pinia 提供全局状态管理的简单步骤：

安装 [`@pinia/nuxt`](https://nuxt.zhcndoc.com/modules/pinia) 模块：

```bash [Terminal]
yarn add pinia @pinia/nuxt
```

在 Nuxt 配置中启用该模块：

```ts [nuxt.config.ts]
import { defineNuxtConfig } from 'nuxt/config'

export default defineNuxtConfig({
  modules: ['@pinia/nuxt'],
})
```

在应用根目录创建 `store` 文件夹：

```ts [store/index.ts]
import { defineStore } from 'pinia'

export const useMainStore = defineStore('main', {
  state: () => ({
    counter: 0,
  }),
  actions: {
    increment () {
      // `this` 是 store 实例
      this.counter++
    },
  },
})
```

创建一个 [插件](https://nuxt.zhcndoc.com/docs/3.x/directory-structure/plugins) 文件，使 store 在全局可用：

```ts [plugins/pinia.ts]
import { useMainStore } from '~/store'

export default defineNuxtPlugin(({ $pinia }) => {
  return {
    provide: {
      store: useMainStore($pinia),
    },
  }
})
```

如果你想继续使用 Vuex，可以按照[这些步骤](https://vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html) 手动迁移到 Vuex 4。

完成后，你需要在 Nuxt 应用中添加以下插件：

```ts [plugins/vuex.ts]
import store from '~/store'

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.use(store)
})
```

对于大型应用，这次迁移工作量可能较大。如果更新 Vuex 仍然遇到障碍，推荐使用社区模块：[nuxt3-vuex-module](https://github.com/vedmant/nuxt3-vuex#nuxt3-vuex-module)，该模块应能开箱即用。


## Sitemap

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