Nuxt 自动导入组件、可组合函数和Vue.js API供您的应用程序使用,而无需显式导入它们。
<script setup lang="ts">
const count = ref(1) // ref is auto-imported
</script>
得益于其固定的目录结构,Nuxt 可以自动导入您的 app/components/、app/composables/ 和 app/utils/。
与经典的全局声明不同,Nuxt 保留了类型、IDE 补全和提示,并且**只包含您生产代码中使用的内容**。
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 暴露了响应式 API,如 ref 或 computed,以及生命周期钩子和辅助函数,这些都由 Nuxt 自动导入。
<script setup lang="ts">
/* ref() and computed() are auto-imported */
const count = ref(1)
const double = computed(() => count.value * 2)
</script>
当您使用 Vue 和 Nuxt 提供的内置 Composition API 可组合函数时,请注意其中许多函数都依赖于在正确的*上下文*中被调用。
在组件生命周期中,Vue 通过一个全局变量跟踪当前组件的临时实例(类似地,Nuxt 跟踪 nuxtApp 的临时实例),然后在同一个 tick 中将其取消设置。这在服务器渲染时至关重要,既可以避免跨请求状态污染(在两个用户之间泄漏共享引用),又可以避免不同组件之间的泄漏。
这意味着(除了极少数例外)您不能在 Nuxt 插件、Nuxt 路由中间件或 Vue setup 函数之外使用它们。最重要的是,您必须同步使用它们——也就是说,在调用可组合函数之前,您不能使用 await,除了在 <script setup> 块中,在用 defineNuxtComponent 声明的组件的 setup 函数中,在 defineNuxtPlugin 中或在 defineNuxtRouteMiddleware 中,我们在那里执行转换以在 await 之后保持同步上下文。
如果您收到类似 Nuxt instance is unavailable 的错误消息,那么很可能意味着您在 Vue 或 Nuxt 生命周期的错误位置调用了 Nuxt 可组合函数。
defineNuxtComponent 而不是 defineComponent 包装您的组件破坏性代码示例
// trying to access runtime config outside a composable
const config = useRuntimeConfig()
export const useMyComposable = () => {
// accessing runtime config here
}
工作代码示例
export const useMyComposable = () => {
// Because your composable is called in the right place in the lifecycle,
// useRuntimeConfig will work here
const config = useRuntimeConfig()
// ...
}
Nuxt 直接自动导入在定义目录中创建的文件
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。
export default defineNuxtConfig({
imports: {
autoImport: false,
},
})
这将完全禁用自动导入,但仍然可以使用 从 #imports 显式导入。
如果您希望像 ref 这样的框架特定函数保持自动导入,但希望禁用您自己代码(例如,自定义可组合函数)的自动导入,您可以在 nuxt.config.ts 文件中将 imports.scan 选项设置为 false
export default defineNuxtConfig({
imports: {
scan: false,
},
})
通过此配置
ref、computed 或 watch 这样的框架函数仍然可以工作,无需手动导入。imports.scan: false,请确保您理解此副作用并相应地调整您的架构。Nuxt 还会自动从您的 ~/components 目录导入组件,尽管这与自动导入可组合函数和实用函数是分开配置的。
要禁用从您自己的 ~/components 目录自动导入组件,您可以将 components.dirs 设置为空数组(但请注意,这不会影响模块添加的组件)。
export default defineNuxtConfig({
components: {
dirs: [],
},
})
Nuxt 还允许从第三方包自动导入。
例如,您可以这样启用从 vue-i18n 包自动导入 useI18n 可组合函数
export default defineNuxtConfig({
imports: {
presets: [
{
from: 'vue-i18n',
imports: ['useI18n'],
},
],
},
})