自动导入

Nuxt 会自动导入组件、组合式函数 (composables)、辅助函数和 Vue API。

Nuxt 会自动导入组件、组合式函数和Vue.js API以便在你的应用程序中直接使用,无需显式导入。

app/app.vue
<script setup lang="ts">
const count = ref(1) // ref is auto-imported
</script>

得益于其带有明确约定的目录结构,Nuxt 可以自动导入你的 app/components/, app/composables/app/utils/ 中的内容。

与传统的全局声明不同,Nuxt 保留了类型提示、IDE 自动完成和提示,并且**只将实际使用的代码包含在你的生产代码中**。

在文档中,任何未显式导入的函数都由 Nuxt 自动导入,可以在代码中直接使用。你可以在 API 部分找到自动导入的组件、组合式函数和工具函数的参考。
server 目录中,Nuxt 会自动导入从 server/utils/ 导出的函数和变量。
你还可以通过配置 nuxt.config 文件中的 imports 部分来自动导入从自定义文件夹或第三方包导出的函数。

内置自动导入

Nuxt 会自动导入函数和组合式函数,用于执行数据获取、访问应用上下文运行时配置、管理状态或定义组件和插件。

<script setup lang="ts">
/* useFetch() is auto-imported */
const { data, refresh, status } = await useFetch('/api/hello')
</script>

Vue 暴露了诸如 refcomputed 等响应式 API,以及被 Nuxt 自动导入的生命周期钩子和辅助函数。

<script setup lang="ts">
/* ref() and computed() are auto-imported */
const count = ref(1)
const double = computed(() => count.value * 2)
</script>

Vue 和 Nuxt 组合式函数

当你使用 Vue 和 Nuxt 提供的内置组合式 API 函数时,请注意其中许多函数需要在正确的*上下文*中调用。

在组件生命周期期间,Vue 通过一个全局变量跟踪当前组件的临时实例(同样,Nuxt 通过一个全局变量跟踪临时的 nuxtApp 实例),然后在同一刻画周期内取消设置它。这在服务器渲染时至关重要,既可以避免跨请求状态污染(泄漏共享引用给两个用户),也可以避免不同组件之间的泄漏。

这意味着(除了极少数例外)你不能在 Nuxt 插件、Nuxt 路由中间件或 Vue setup 函数之外使用它们。除此之外,你必须同步使用它们——也就是说,你不能在调用组合式函数之前使用 await,除非是在 <script setup> 代码块内、使用 defineNuxtComponent 声明的组件的 setup 函数内、在 defineNuxtPlugin 中或在 defineNuxtRouteMiddleware 中,在这些地方我们会进行转换以在 await 之后仍然保持同步上下文。

如果你收到类似 Nuxt instance is unavailable 的错误消息,则很可能意味着你在 Vue 或 Nuxt 生命周期中的错误位置调用了 Nuxt 组合式函数。

当在非 SFC 组件中使用需要 Nuxt 上下文的组合式函数时,你需要使用 defineNuxtComponent 而不是 defineComponent 来包装你的组件
查看 asyncContext 实验性功能,以便在异步函数中使用 Nuxt 组合式函数。
请参阅此 GitHub 评论中的完整解释。

错误示例

composables/example.ts
// trying to access runtime config outside a composable
const config = useRuntimeConfig()

export const useMyComposable = () => {
  // accessing runtime config here
}

正确示例

composables/example.ts
export const useMyComposable = () => {
  // Because your composable is called in the right place in the lifecycle,
  // useRuntimeConfig will work here
  const config = useRuntimeConfig()

  // ...
}

基于目录的自动导入

Nuxt 直接自动导入在定义的目录中创建的文件

文档 > 4.X > 示例 > 功能 > 自动导入 中阅读并编辑实时示例。
自动导入的 refcomputed 在组件的 <template> 中不会被解包 (unwrapped)。
这是因为 Vue 处理非模板顶层 ref 的方式。你可以阅读更多相关信息在 Vue 文档中.

显式导入

Nuxt 使用 #imports 别名暴露所有自动导入的内容,如果需要,可以使用该别名进行显式导入。

<script setup lang="ts">
import { computed, ref } from '#imports'

const count = ref(1)
const double = computed(() => count.value * 2)
</script>

禁用自动导入

如果你想禁用组合式函数和工具函数的自动导入,可以在 nuxt.config 文件中将 imports.autoImport 设置为 false

nuxt.config.ts
export default defineNuxtConfig({
  imports: {
    autoImport: false,
  },
})

这将完全禁用自动导入,但仍然可以从 #imports 使用显式导入

部分禁用自动导入

如果你希望像 ref 这样的框架特定函数保持自动导入,但希望禁用对你自己的代码(例如自定义组合式函数)的自动导入,你可以在 nuxt.config.ts 文件中将 imports.scan 选项设置为 false

export default defineNuxtConfig({
  imports: {
    scan: false,
  },
})

使用此配置后

  • refcomputedwatch 这样的框架函数仍然可以在无需手动导入的情况下工作。
  • 自定义代码,例如组合式函数,需要在文件中手动导入。
注意: 此设置存在某些限制
  • 如果以分层结构组织项目,你需要从每个层显式导入组合式函数,而不是依赖自动导入。
  • 这会破坏分层系统的覆盖功能。如果你使用 imports.scan: false,请确保了解此副作用并相应地调整你的架构。

自动导入的组件

Nuxt 也会自动导入你 ~/components 目录中的组件,尽管这与自动导入组合式函数和工具函数的配置是分开的。

请在 **文档 > 4 X > 目录结构 > App > Components** 中阅读更多内容。

要禁用从你自己的 ~/components 目录自动导入组件,你可以将 components.dirs 设置为一个空数组(但请注意,这不会影响模块添加的组件)。

nuxt.config.ts
export default defineNuxtConfig({
  components: {
    dirs: [],
  },
})

从第三方包自动导入

Nuxt 也允许从第三方包自动导入。

如果你正在为该包使用 Nuxt 模块,那么该模块很可能已经为该包配置了自动导入。

例如,你可以像这样启用从 vue-i18n 包自动导入 useI18n 组合式函数

nuxt.config.ts
export default defineNuxtConfig({
  imports: {
    presets: [
      {
        from: 'vue-i18n',
        imports: ['useI18n'],
      },
    ],
  },
})