nuxt logo

文档翻译(非官方)

Nuxt.js
Version:v3.17

自动导入

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

Nuxt 自动导入组件、可组合函数和 Vue.js API,以便在应用程序中使用,而无需显式导入它们。

app.vue
const count = ref(1) // ref 是自动导入的

由于其特定的目录结构,Nuxt 可以自动导入您的 components/composables/utils/

与经典的全局声明相反,Nuxt 保留了类型、IDE 补全和提示,并且仅包含在生产代码中使用的内容

在文档中,所有未显式导入的函数都是由 Nuxt 自动导入的,可以直接在代码中使用。您可以在 API 部分找到自动导入的组件、可组合函数和实用程序的参考。

server 目录中,Nuxt 自动导入 server/utils/ 中导出的函数和变量。

您还可以通过配置 nuxt.config 文件的 imports 部分,从自定义文件夹或第三方包中自动导入导出的函数。

内置自动导入

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

/* useFetch() 是自动导入的 */
const { data, refresh, status } = await useFetch('/api/hello')

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

/* ref() 和 computed() 是自动导入的 */
const count = ref(1)
const double = computed(() => count.value * 2)

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

另请参阅 guide > going-further > experimental-features#asynccontext 另请参阅 github.com > nuxt > nuxt > issues > 14269

错误代码示例:

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

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

正确代码示例:

composables/example.ts
export const useMyComposable = () => {
  // 因为您的可组合函数在生命周期的正确位置被调用,
  // useRuntimeConfig 将在这里工作
  const config = useRuntimeConfig()

  // ...
}

基于目录的自动导入

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

示例代码的编辑与预览examples > features > auto-imports

自动导入的 refcomputed 不会在组件 <template> 中解包。 :br 这是由于 Vue 如何处理不在模板顶层的 refs。您可以在 Vue 文档 中阅读更多相关信息。

显式导入

Nuxt 使用 #imports 别名公开每个自动导入,如果需要,可以用来显式导入:

import { ref, computed } from '#imports'

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

禁用自动导入

如果您想禁用自动导入可组合函数和实用程序,可以在 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 目录中导入组件,尽管这与自动导入可组合函数和实用程序函数的配置是分开的。

另请参阅 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']
      }
    ]
  }
})