模块

模块作者

将您自己的模块集成到 Nuxt DevTools 中。

Nuxt DevTools 旨在可扩展。您可以将您自己的模块集成到 DevTools 中。

入门模板

如果您想尝试与 Nuxt DevTools 集成,您可以运行

npx nuxi init my-module -t module-devtools

创建一个新的模块启动器,其中预先配置了 Nuxt DevTools 集成(作为选项卡贡献完全自定义视图)。

贡献视图

目前,贡献 Nuxt DevTools 视图的唯一方法是通过 iframe。您需要自己提供模块的视图,然后将其注册到 DevTools。

您可以使用 Nuxt DevTools 提供的工具包注册您的自定义选项卡

import { addCustomTab } from '@nuxt/devtools-kit'

addCustomTab({
  // unique identifier
  name: 'my-module',
  // title to display in the tab
  title: 'My Module',
  // any icon from Iconify, or a URL to an image
  icon: 'carbon:apps',
  // iframe view
  view: {
    type: 'iframe',
    src: '/url-to-your-module-view',
  },
})

或者,如果您更喜欢使用 Nuxt 钩子

nuxt.hook('devtools:customTabs', (tabs) => {
  tabs.push({
    // unique identifier
    name: 'my-module',
    // title to display in the tab
    title: 'My Module',
    // any icon from Iconify, or a URL to an image
    icon: 'carbon:apps',
    // iframe view
    view: {
      type: 'iframe',
      src: '/url-to-your-module-view',
    },
  })
})

了解更多关于 DevTools 工具包.

延迟服务启动

如果您贡献的视图加载很重,您可以先显示选项卡,让用户在需要时启动它。

let isReady = false
const promise: Promise<any> | null = null

async function launchService() {
  // ...launch your service
  isReady = true
}

nuxt.hook('devtools:customTabs', (tabs) => {
  tabs.push({
    name: 'my-module',
    title: 'My Module',
    view: isReady
      ? {
          type: 'iframe',
          src: '/url-to-your-module-view',
        }
      : {
          type: 'launch',
          description: 'Launch My Module',
          actions: [{
            label: 'Start',
            async handle() {
              if (!promise)
                promise = launchService()
              await promise
            },
          }]
        },
  })
})

它将首先显示一个带有按钮的启动页面,用于启动服务。当用户点击按钮时,handle() 将被调用,视图将更新为 iframe。

当您需要刷新自定义选项卡时,您可以调用 nuxt.callHook('devtools:customTabs:refresh'),并且 devtools:customTabs 上的钩子将被重新评估。

自定义视图的 API

请参考 Iframe 客户端.

自定义 RPC 函数

Nuxt DevTools 使用远程过程调用 (RPC) 来在服务器和客户端之间进行通信。对于模块,您也可以利用它来与服务器代码进行通信。

为此,我们建议首先在共享的 TypeScript 文件中定义您的类型

// rpc-types.ts

export interface ServerFunctions {
  getMyModuleOptions: () => MyModuleOptions
}

export interface ClientFunctions {
  showNotification: (message: string) => void
}

然后在您的模块代码中

import type { ClientFunctions, ServerFunctions } from './rpc-types'
import { extendServerRpc, onDevToolsInitialized } from '@nuxt/devtools-kit'
import { defineNuxtModule } from '@nuxt/kit'

const RPC_NAMESPACE = 'my-module-rpc'

export default defineNuxtModule({
  setup(options, nuxt) {
    // wait for DevTools to be initialized
    onDevToolsInitialized(async () => {
      const rpc = extendServerRpc<ClientFunctions, ServerFunctions>(RPC_NAMESPACE, {
        // register server RPC functions
        getMyModuleOptions() {
          return options
        },
      })

      // call client RPC functions
      // since it might have multiple clients connected, we use `broadcast` to call all of them
      await rpc.broadcast.showNotification('Hello from My Module!')
    })
  }
})

在嵌入式 iframe 客户端端,您可以执行以下操作

import type { ClientFunctions, ServerFunctions } from './rpc-types'
import { onDevtoolsClientConnected } from '@nuxt/devtools-kit/iframe-client'

const RPC_NAMESPACE = 'my-module-rpc'

onDevtoolsClientConnected(async (client) => {
  const rpc = client.devtools.extendClientRpc(RPC_NAMESPACE, {
    showNotification(message) {
      console.log(message)
    },
  })

  // call server RPC functions
  const options = await rpc.getMyModuleOptions()
})

尝试本地更改

您可以克隆 Nuxt DevTools 仓库并在本地尝试您的更改。

请参考 尝试本地更改.

示例

以下是一些关于如何在模块中集成 Nuxt DevTools 的示例