Skip to content

扩展控制台 ​

插件可以给 控制台 加页面。和应用一样,控制台的页面是浏览器插件:Node 端用包名注册它,再提供它需要的数据和方法。

ts
import type { Context } from '@cormijs/cormi'

export const name = 'cache'

export function apply(ctx: Context) {
  const cache = new Map<string, unknown>()

  // ctx.console 只在 dev 模式下存在
  ctx.inject(['console'], (ctx) => {
    // 浏览器端的页面,按包名注册
    ctx.console.entry('cormi-plugin-cache/console')

    // 推送给页面的数据:客户端连接时发送,refresh() 后再次发送
    const entries = ctx.console.data('cache', () => [...cache.keys()])

    // 页面可以调用的方法
    ctx.console.method('cache/clear', () => {
      cache.clear()
      entries.refresh()
    })
  })
}
tsx
import type { Context } from '@cormijs/cormi/client'
import { useConsole, useData } from '@cormijs/cormi/console'

function CachePage() {
  const keys = useData<string[]>('cache') ?? []
  const console = useConsole()
  return (
    <div className="cc-page">
      <header className="cc-page-head">
        <h1>缓存</h1>
      </header>
      <ul>{keys.map(key => <li key={key}>{key}</li>)}</ul>
      <button className="cc-button" onClick={() => console.call('cache/clear')}>清空缓存</button>
    </div>
  )
}

export default (ctx: Context) => {
  ctx.$console.page({ path: '/cache', name: '缓存', component: CachePage })
}

package.json 的 exports 中加上 "./console": "./console/index.tsx"。用 cormi g plugin <name> --console 创建的插件包已经带有这些代码。

Node 端:ctx.console ​

方法说明
entry(module, config?)在控制台中挂载一个浏览器插件。与 ctx.app.entry() 相同,传入包名,config 序列化为 JSON
data(name, get)提供数据。客户端连接时收到当前值;调用返回值的 refresh() 后再次推送,同一时刻的多次刷新合并为一次
method(name, handler)注册一个可被页面调用的方法,返回值发送回页面,抛出的错误以消息形式返回
broadcast(name, payload)向所有页面发送一个事件

三者都是 effect:插件卸载时,它的页面、数据与方法随之移除。

浏览器端:ctx.$console ​

成员说明
page({ path, name, icon?, order?, component })添加一个页面:控制台框架下的一个路由,和菜单中的一项
call(name, ...args)调用服务器上的方法,返回 Promise
listen(name, listener)监听服务器广播的事件
get(name)读取一项数据的当前值

控制台页面总是 React 组件——控制台自带 React,即使应用用的是 Vue。React 钩子从 @cormijs/cormi/console 导入:

钩子说明
useData(name)一项数据的值,数据推送时组件重新渲染;到达之前为 undefined
useConsole()控制台服务,用于 call()
useStatus()与服务器的连接状态:connecting、open 或 closed

页面可以使用控制台的样式类(cc-page、cc-page-head、cc-button、cc-table……),与内置页面保持一致;@cormijs/cormi/console 也导出 Section、Tag、Lamp、Empty、CodeLine 几个组件。

开发服务器重启时,控制台会自动重新连接,并重新收到所有数据。

以 MIT 许可发布 · 基于 Cordis 4、React 19 与 Vite 7