Nuxt 3 笔记:插件
cssmagic opened this issue · 0 comments
cssmagic commented
概述
-
Nuxt 有自己的插件机制。Nuxt 会在创建 Vue 应用时加载所有能找到的插件。
-
插件的存放位置也有约定。在
plugins目录下,一级*.(js|ts)文件和一级目录下的index.(js|ts)文件会被自动加载。 -
导入顺序按字母排序,所以可以通过显式地给文件名加序号来决定它们的加载顺序。
-
Nuxt 插件并不是 Vue 插件,但它可以用来加载 Vue 插件。
格式
插件的默认导出是一个函数,代码示例如下:
export default defineNuxtPlugin((nuxtApp) => {
const app = nuxtApp.vueApp
// ...
})插件内部可以使用组合式函数。但是:
- 如果一个组合式函数是由其他插件注册的,那就会存在加载顺序问题。
- 如果一个组合式函数依赖 Vue.js 生命周期,那它也不能正常工作。因为这些组合式函数是跟组件绑定的,而插件是跟当前
nuxtApp绑定的。
加载 Vue 插件
import MyPlugin from 'vue-my-plugin'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(MyPlugin, {})
})同理,也可以在 Nuxt 插件里定义指令:
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.directive('my-directive', { /* ... */ })
})提供工具方法
插件函数可以返回一个对象,对象的 provide 字段用于向外提供工具方法:
export default defineNuxtPlugin(() => {
return {
provide: {
hello: (msg) => `Hello ${msg}!`
}
}
})这个工具方法会被加上 $ 前缀,并挂载在 nuxtApp 身上。我们需要先获取它:
// script setup
const { $hello } = useNuxtApp()然后就可以使用这个工具方法了(需要加 $ 前缀):
<template>
<div>
{{ $hello('world') }}
</div>
</template>避开初始化高峰执行代码
export default defineNuxtPlugin(() => {
onNuxtReady(async () => {
const myAnalyticsLibrary = await import('my-big-analytics-library')
// do something with myAnalyticsLibrary
})
})即使是在初始化完成之后,也是可以调用 onNuxtReady() 的,它的回调会在下个周期立即执行。就像 jQuery 的 ready() 方法一样。