六维教程

Nuxt4 插件

插件(plugin)用来在应用启动时做一些全局初始化,或者把第三方库、自己写的功能「注入」到全站,让任意组件都能直接调用。本篇讲清楚插件怎么写、怎么注册、怎么注入。

插件放在哪

Nuxt 约定插件放在 app/plugins/ 目录下,文件名以 .ts.js 结尾。放在这里的文件会在应用初始化时自动执行,无需手动 import。

写一个插件

defineNuxtPlugin 定义插件,它接收一个回调函数。

// app/plugins/hello.ts
export default defineNuxtPlugin(() => {
  console.log('应用启动啦')
})

这样应用一启动就会打印这句日志。这只是最小例子,更复杂的初始化(比如接入全局库)也写在这里。

注入全局能力

插件最常用的场景是把一个函数或对象注入到全站,组件里用 useNuxtApp() 取到。用 provide 来注入。

// app/plugins/api.ts
export default defineNuxtPlugin((nuxtApp) => {
  const $api = {
    get: (url: string) => fetch(url).then(r => r.json())
  }
  // 把 $api 注入到全站,组件里就能用 useNuxtApp().$api
  nuxtApp.provide('api', $api)
})

在组件里使用。

<script setup>
const { $api } = useNuxtApp()

async function load() {
  const data = await $api.get('/api/list')
  console.log(data)
}
</script>

注意注入的 key 要以 $ 开头(如 $api),这是 Nuxt 的约定,方便和组件自身变量区分。

只在客户端运行

有些库依赖浏览器 API(如 window),在服务端渲染时会报错。用 mode: 'client' 让插件只在客户端加载。

// app/plugins/chart.client.ts
export default defineNuxtPlugin(() => {
  // 这里写依赖浏览器的代码
})

把文件名加上 .client 后缀,效果等同 mode: 'client',Nuxt 会自动识别。对应的还有 .server 后缀,只在服务端运行。

插件执行顺序

多个插件可以用文件名里的数字前缀控制顺序,比如 01.first.ts 会比 02.second.ts 先执行。大多数情况不需要关心,遇到依赖顺序时再调整。

插件是接入第三方库、做全局初始化的标准入口。需要全站共享的能力,优先用插件注入,而不是在每个组件里重复 import。

上一篇
Nuxt4 静态资源
下一篇
Nuxt4 数据获取