Skyroc Admin Docs
Web

@skyroc/web-admin-devtools

集成 TanStack Query / Router / Jotai 的开发调试面板

概览

包名@skyroc/web-admin-devtools
目录packages/web/admin-devtools
版本0.1.0
依赖@tanstack/react-devtools@tanstack/react-query-devtools@tanstack/react-router-devtoolsjotai-devtools
peer@tanstack/react-query@tanstack/react-routerjotaireactreact-dom
子入口../jotai
测试

把三套 DevTools 聚合到一个浮动面板里:

  • Query DevTools:查看 React Query 缓存、状态、refetch
  • Router DevTools:查看 TanStack Router 当前路由树、匹配、context
  • Jotai DevTools:查看 atom 状态、变化时间线、Redux DevTools 集成

使用

import { AdminDevtools } from '@skyroc/web-admin-devtools';

<AdminDevtools
  config={{
    position: 'bottom-right',
    query: true,
    router: true,
    jotai: {
      name: 'My Admin',
      panel: true,
      position: 'bottom-left',
      timeline: true,
      triggerOffset: { left: 248 }
    }
  }}
  queryClient={queryClient}
  router={router}
  store={globalStore}
/>;

主入口导出

类别符号
组件AdminDevtools
类型AdminDevtoolsConfigAdminDevtoolsPropsAdminJotaiDevtoolsConfigAdminJotaiDevtoolsTriggerOffset

子入口 ./jotai

import '@skyroc/web-admin-devtools/jotai';

仅 side-effect:import 'jotai-devtools/utils',让任何 atom() 调用自动注入 debugLabelapps/admin/src/main.tsx 在开发态最先 import 它:

async function bootstrap() {
  if (import.meta.env.DEV) {
    await import('@skyroc/web-admin-devtools/jotai');
  }
  await import('./bootstrap');
}

这样后续创建的所有 atom 都能在 Jotai DevTools 里以变量名显示,而不是 <no debugLabel>

配置项

interface AdminDevtoolsConfig {
  /** 整体位置 */
  position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
  /** 启用 React Query DevTools */
  query?: boolean;
  /** 启用 Router DevTools */
  router?: boolean;
  /** Jotai 配置(false 禁用) */
  jotai?: AdminJotaiDevtoolsConfig | false;
}

interface AdminJotaiDevtoolsConfig {
  name?: string;
  panel?: boolean;            // 浮动面板
  position?: 'bottom-right' | 'bottom-left' | ...;
  timeline?: boolean;         // Redux DevTools 时间线
  triggerOffset?: {           // 浮动 trigger 按钮偏移
    left?: number; right?: number; top?: number; bottom?: number;
  };
  theme?: 'dark' | 'light';
}

在 apps/admin 的接入

// App.tsx
const AdminDevtools = import.meta.env.DEV
  ? lazy(() => import('@skyroc/web-admin-devtools').then(mod => ({ default: mod.AdminDevtools })))
  : (_props: AdminDevtoolsProps) => null;
//                ^^^ 生产环境替换为 no-op,整个包会被 tree-shaking

const Devtools = () => {
  const { darkMode } = useSettingsTheme();
  const config = useMemo(() => ({
    ...globalConfig.devtools,
    theme: darkMode ? 'dark' : 'light'
  }), [darkMode]);

  return (
    <Suspense fallback={null}>
      <AdminDevtools config={config} queryClient={queryClient} router={router} store={globalStore} />
    </Suspense>
  );
};

通过 import.meta.env.DEV 三元 + lazy import,确保生产 bundle 完全不包含 devtools 代码

主题联动

config.theme 跟随应用的 darkMode 切换,DevTools 面板的暗色 / 亮色与主题一致。

设计要点

  • 统一面板:避免三套 DevTools 各自一个浮动按钮挤占屏幕;
  • 可定位:每套子 DevTools 都可以独立配置位置;
  • 零运行时成本:dev only + lazy + tree-shaking 三层保护。

On this page