自动导入

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

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

app.vue
<script setup lang="ts">
const count = ref(1) // ref 被自动导入
</script>

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

与传统的全局声明不同,Nuxt 保留了类型支持、IDE 自动补全和提示,并且仅在生产代码中包含实际使用的内容

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

内置自动导入

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

<script setup lang="ts">
/* useFetch() 被自动导入 */
const { data, refresh, status } = await useFetch('/api/hello')
</script>

Vue 提供了响应式 API(如 refcomputed),以及生命周期钩子和辅助函数,这些都被 Nuxt 自动导入。

<script setup lang="ts">
/* ref() 和 computed() 被自动导入 */
const count = ref(1)
const double = computed(() => count.value * 2)
</script>

Vue 和 Nuxt 组合式函数

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

在组件生命周期中,Vue 会通过一个全局变量跟踪当前组件的临时实例(类似地,Nuxt 跟踪 nuxtApp 的临时实例),并在同一 tick 内将其取消设置。这在服务端渲染时尤为重要,既能避免跨请求状态污染(两个用户之间共享引用泄漏),也能避免不同组件之间的泄漏。

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

如果你遇到类似 Nuxt instance is unavailable 的错误信息,很可能是因为你在 Vue 或 Nuxt 生命周期的错误位置调用了 Nuxt 组合式函数。

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

错误代码示例:

composables/example.ts
// 在组合式函数之外尝试访问运行时配置
const config = useRuntimeConfig()

export const useMyComposable = () => {
  // 在此处访问运行时配置
}

正确代码示例:

composables/example.ts
export const useMyComposable = () => {
  // 因为你的组合式函数在生命周期的正确位置被调用,
  // useRuntimeConfig 在此处可以正常工作
  const config = useRuntimeConfig()

  // ...
}

基于目录的自动导入

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

阅读并编辑实时示例中的内容 Docs > Examples > Features > Auto Imports.
自动导入的 refcomputed 在组件 <template> 中不会被解包。
这是由于 Vue 处理非顶级模板引用的方式。你可以在 Vue 文档 中了解更多。

显式导入

Nuxt 提供了 #imports 别名,可以用来显式导入每个自动导入的内容:

<script setup lang="ts">
import { ref, computed } 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 目录导入组件,尽管这与自动导入组合式函数和工具函数的配置是分开的。
阅读更多 Docs > Guide > Directory Structure > 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']
      }
    ]
  }
})