Learn Nuxt with a Collection of 100+ Tips!

自动导入

Nuxt 自动导入应用程序中使用的组件、组合器和 Vue.js 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">
/* useAsyncData() 和 $fetch() 已自动导入 */
const { data, refresh, status } = await useFetch('/api/hello')
</script>

Vue 3 公开了诸如 refcomputed 之类的响应式 API,以及生命周期钩子和帮助器,它们被 Nuxt 自动导入。

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

Vue 和 Nuxt 组合器

当您使用 Vue 和 Nuxt 提供的内置组合语法组合器时,请注意,许多组合器都需要在正确的上下文中调用。

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

这意味着(除了很少的例外)您不能在 Vue 或 Nuxt 生命周期的正确位置之外使用它们。此外,您必须在同步调用它们之前使用 await,除了在 <script setup> 块中,在 defineNuxtComponent 声明的组件的 setup 函数中,在 defineNuxtPlugindefineNuxtRouteMiddleware 中,在那里我们执行一个转换,以便即使在 await 之后也保持同步上下文。

如果您遇到类似于 Nuxt 实例不可用 的错误消息,那么可能意味着您在 Vue 或 Nuxt 生命周期的错误位置调用了 Nuxt 组合器。

观看 Alexander Lichter 关于在组合器中处理异步代码并修复 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 直接自动导入在定义的目录中创建的文件:

  • components/ 用于 Vue 组件
  • composables/ 用于 Vue 组合器
  • utils/ 用于帮助函数和其他实用程序。
Read and edit a live example in Docs > Examples > Features > Auto Imports.
在组件 <template> 中,自动导入的 refcomputed 不会被解包。
这是由于 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

自动导入的组件

Nuxt 还自动从您的 ~/components 目录导入组件,尽管它与自动导入组合器和实用函数的配置是分开的。

Read more in Missing link.
{到="/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']
} ] } })
观看 Alexander Lichter 的视频,了解如何轻松设置自定义自动导入。