自动导入
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 暴露了诸如 ref 或 computed 之类的响应式 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 的临时实例),并在同一 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 直接自动导入在定义目录中创建的文件:
ref 和 computed 在组件 <template> 中不会被自动解包。这是由于 Vue 处理非模板顶层 ref 的机制导致的。你可以在 Vue 文档中阅读更多相关信息。在 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。
export default defineNuxtConfig({
imports: {
autoImport: false,
},
})
这将完全禁用自动导入,但你仍然可以使用来自 #imports 的 显式导入。
部分禁用自动导入
如果你希望保留框架特定函数(如 ref)的自动导入,但希望禁用你自己代码(例如自定义组合式函数)的自动导入,可以在 nuxt.config.ts 文件中将 imports.scan 选项设置为 false。
export default defineNuxtConfig({
imports: {
scan: false,
},
})
使用此配置后:
- 框架函数如
ref、computed或watch将仍然无需手动导入即可工作。 - 自定义代码(如组合式函数)则需要在你的文件中手动导入。
- 如果你的项目使用了分层结构 (layers),你需要从每一层显式导入组合式函数,而不是依赖自动导入。
- 这会破坏层系统的覆盖功能。如果你使用了
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'],
},
],
},
})