Nuxt 会自动读取 plugins 目录中的文件并在创建 Vue 应用程序时加载它们;
你可以在文件名中使用 .server 或 .client 后缀来让插件在 服务器端 或 客户端 加载插件

自动注册了哪些文件

只有plugins目录的顶层文件(或任何子目录中的index文件)会被注册为插件。

  1. plugins
  2. | - myPlugin.ts // scanned
  3. | - myOtherPlugin
  4. | --- supportingFile.ts // not scanned
  5. | --- componentToRegister.vue // not scanned
  6. | --- index.ts // currently scanned but deprecated

只有myPlugin.ts和myOtherPlugin/index.ts会被注册。

创建插件

传递给插件的唯一参数是nuxtApp

  1. export default defineNuxtPlugin(nuxtApp => {
  2. // Doing something with nuxtApp
  3. })

在插件中使用 Composables

可以在 Nuxt 插件中使用 Composables

  1. export default defineNuxtPlugin((NuxtApp) => {
  2. const foo = useFoo()
  3. })

但是,请记住有一些限制和差异:

如果 composable 依赖于后来注册的另一个插件,它可能无法工作。
原因是:插件是依次按顺序调用的,而且是在其他东西之前。这会导致可能会使用一个依赖于另一个尚未被调用的插件的composable。

如果composable依赖于Vue.js的生命周期,它将无法工作。
原因是:通常情况下,Vue.js的composables会绑定到当前的组件实例,而插件只绑定到nuxtApp实例。

自定义插件顺序

插件也是从目录中自动注册的 ,如果需要自定义他们的顺序。

  1. plugins: [
  2. '~/plugins/foo.client.js', // only in client side
  3. '~/plugins/bar.server.js', // only in server side
  4. '~/plugins/baz.js', // both client & server
  5. { src: '~/plugins/both-sides.js' },
  6. { src: '~/plugins/client-only.js', mode: 'client' }, // only on client side
  7. { src: '~/plugins/server-only.js', mode: 'server' } // only on server side
  8. ]

可以通过在文件名前面加上数字来控制插件的注册顺序

  1. plugins/
  2. | - 1.myPlugin.ts
  3. | - 2.myOtherPlugin.ts

自动提供帮助方法

如果想在NuxtApp实例上提供helper功能,只需在插件中返回一个带provide键值的对象即可。

  1. export default defineNuxtPlugin(() => {
  2. return {
  3. provide: {
  4. hello: (msg: string) => `Hello ${msg}!`
  5. }
  6. }
  7. })

在另一个文件中使用:

  1. <template>
  2. <div>
  3. <!-- 直接调用 -->
  4. {{ $hello('world') }}
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. // 也可以在此处使用
  9. const { $hello } = useNuxtApp()
  10. </script>

插件类型

如果从插件返回 helpers,它们将被自动加上类型;如果调用useNuxtApp(),会在这个返回值中发现它们的类型,在模板中也是这样自动处理。 :::info 如果需要在另一个插件中使用提供的 helper,则可以调用useNuxtApp()来获取类型化版本。但一般来说应避免这种情况,除非确定插件的调用顺序。 :::

对于高级用例,可以声明注入属性的类型:

  1. // index.d.ts
  2. declare module '#app' {
  3. interface NuxtApp {
  4. $hello (msg: string): string
  5. }
  6. }
  7. declare module '@vue/runtime-core' {
  8. interface ComponentCustomProperties {
  9. $hello (msg: string): string
  10. }
  11. }
  12. export { }