@proteus-vue/devtools 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -0
- package/dist/component-trace.d.ts +35 -0
- package/dist/device-info.d.ts +5 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +3323 -0
- package/dist/install.d.ts +76 -0
- package/dist/ownership-info.d.ts +77 -0
- package/dist/panel.d.ts +39 -0
- package/dist/panel.js +9172 -0
- package/dist/plugins/network.d.ts +2 -0
- package/dist/plugins.d.ts +64 -0
- package/dist/session-io.d.ts +35 -0
- package/dist/snapshot-io.d.ts +37 -0
- package/dist/source.d.ts +22 -0
- package/dist/tooltip.d.ts +21 -0
- package/dist/views/components.d.ts +26 -0
- package/dist/views/device.d.ts +43 -0
- package/dist/views/errors.d.ts +5 -0
- package/dist/views/flamegraph.d.ts +20 -0
- package/dist/views/graph.d.ts +5 -0
- package/dist/views/inspector.d.ts +9 -0
- package/dist/views/ownership.d.ts +4 -0
- package/dist/views/pages.d.ts +18 -0
- package/dist/views/route.d.ts +5 -0
- package/dist/views/state.d.ts +26 -0
- package/dist/views/timeline-interaction.d.ts +12 -0
- package/dist/views/timeline.d.ts +16 -0
- package/dist/vue-devtools.d.ts +133 -0
- package/dist/ws-bridge.d.ts +21 -0
- package/package.json +43 -0
- package/panel.html +26 -0
- package/style.css +1248 -0
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# @proteus-vue/devtools
|
|
2
|
+
|
|
3
|
+
Proteus DevTools(devtools-plan **UI 层**)——把 TraceBus 事件流渲染成可交互调试面板。**浏览器端开发工具,不随业务产物发布**;数据层消费 `@proteus-vue/devtools-runtime`(六源 → TraceBus → **十视图**)。
|
|
4
|
+
|
|
5
|
+
## 导出
|
|
6
|
+
|
|
7
|
+
### 面板装配 / 数据源
|
|
8
|
+
|
|
9
|
+
| API | 说明 |
|
|
10
|
+
|-----|------|
|
|
11
|
+
| `createDevtoolsPanel(root, options)` | **面板装配**:tab 布局(十视图)+ 数据层收集器 + 渲染节流;`show(view)` 切视图 / `exportSnapshot()/importSnapshot()` 快照 / `destroy()` 清理 |
|
|
12
|
+
| `createDevtoolsWsSource(url, createSocket?)` | **WS 数据源**:连 relay(CDP 协议 `Proteus.enable/event/appInfo/deviceInfo`)→ 事件流重组 + 元数据缓存 + `sendCommand()` 下发;断线 1s 重连 + enable 未确认 2s 重发 |
|
|
13
|
+
| `createTraceBusSource(bus)` | **TraceBus 直连源**:进程内事件流 → DevtoolsSource(Web 端接入用) |
|
|
14
|
+
| `createTraceBusWsBridge(bus, options)` | **远程查看桥**:应用侧 TraceBus → WS(`/proteus-source`)上行 → 电脑端面板下行;处理 enable 回放 / appInfo / deviceInfo / restoreStores |
|
|
15
|
+
|
|
16
|
+
### 一键接入(推荐)
|
|
17
|
+
|
|
18
|
+
| API | 说明 |
|
|
19
|
+
|-----|------|
|
|
20
|
+
| `installProteusDevtools(app, options)` | **★一键接入**:TraceBus 单例 + Vue DevTools 插件(Timeline/Inspectors)+ store/组件追踪 + 本地面板浮动挂载(◈ 按钮,可拖拽记忆位置)+ 远程桥 + HMR 事件源,一行完成全部接线 |
|
|
21
|
+
| `installProteusTimeline(api, options)` | 接入 Vue 官方 DevTools:注册 `proteus` Timeline layer(事件流推为 Vue DevTools Timeline) |
|
|
22
|
+
| `installProteusInspectors(api, options)` | 接入 Vue 官方 DevTools:**Router / App Config / Style Safety** 三个自定义 Inspector |
|
|
23
|
+
| `PROTEUS_DEVTOOLS_PLUGIN_DESCRIPTOR` | Vue DevTools 插件描述符(logo 占位 + 三 Inspector 图标:⚙️ settings / 🛡 gpp-good / 🛣 route) |
|
|
24
|
+
| `installComponentTrace(app, bus)` / `buildDomTree(el)` | 组件树追踪(mount/unmount 事件 + 元素 registry)+ DOM 树构建(组件视图详情/页面高亮) |
|
|
25
|
+
|
|
26
|
+
### 视图渲染(纯函数 data → DOM,jsdom 可单测)
|
|
27
|
+
|
|
28
|
+
`renderTimeline` / `renderFlamegraph` / `renderState` / `renderRoute` / `renderErrors` / `renderComponents` / `renderPages` / `renderGraph` / `renderDevice` / `renderOwnership` + 配套类型。
|
|
29
|
+
|
|
30
|
+
### 插件 / 工具
|
|
31
|
+
|
|
32
|
+
| API | 说明 |
|
|
33
|
+
|-----|------|
|
|
34
|
+
| `createPluginRegistry / createMemoryStorage / createCommandRegistry / resolveActivationOrder` | **M9 插件宿主**:第三方视图/事件订阅/命令/持久化(激活拓扑序、循环依赖报错、崩溃隔离) |
|
|
35
|
+
| `createNetworkPlugin` | 内置插件:API 瀑布增强 + 请求重放 |
|
|
36
|
+
| `serializeStoreSnapshot / parseStoreSnapshot` | 状态快照导出/导入(JSON 校验重建) |
|
|
37
|
+
| `createTooltipLayer / bindTooltip / attachTip / resolveTipData` | hover 浮层 |
|
|
38
|
+
| `detectRuntimePlatform / detectBrowserVersion / detectMpLibVersion` | 设备信息采集纯函数(真实平台/基础库探测) |
|
|
39
|
+
|
|
40
|
+
## 十视图
|
|
41
|
+
|
|
42
|
+
| 视图 | 渲染内容 |
|
|
43
|
+
|------|---------|
|
|
44
|
+
| **timeline** | 按 source 泳道分组 + span 线段 + pending 标注 + wheel 缩放/拖拽平移/双击重置 + 虚拟滚动 |
|
|
45
|
+
| **flamegraph** | **经典嵌套堆叠火焰图**(子块相对父定位 + source 八色)+ 合成「录制会话」根 + 点击聚焦 zoom + 面包屑 + 对比模式(±10% 回归红/优化绿) |
|
|
46
|
+
| **state** | store 选择器 + inspector 树 + actions/patches 时间线 + 时间旅行滑块 + **★值编辑双向调试**(点值改 → `$patch` 写回真实状态) |
|
|
47
|
+
| **route** | 导航链 + 守卫徽章(next 绿 / redirect 橙 / cancel·error 红)+ 耗时 |
|
|
48
|
+
| **errors** | 根因卡片(attribution ⚑ + causedBy 链 + 影响范围 + 复现步骤) |
|
|
49
|
+
| **components** | 组件树(props/state 快照 + count)+ 选中 → 页面元素高亮(scrollIntoView + 描边)+ DOM 树详情 |
|
|
50
|
+
| **pages** | 当前页面栈 + 主包/分包路由清单(Proteus.appInfo 数据源) |
|
|
51
|
+
| **graph** | 页面依赖图(appInfo 路由表 → 父子关系) |
|
|
52
|
+
| **device** | ★M8 环境概览卡(平台/基础库/屏幕/JS 堆)+ 能力表(✅/❌ + required/fallback/worklet)+ 内存曲线(每秒采样) |
|
|
53
|
+
| **ownership** | ★G-43 B4 所有权概要(alive/total/bytes)+ 四类告警(🔴 无主/⚠️ 泄漏路径含引用链/🟡 长期借用/跨页强引用/✅ 无异常)+ 资源树(owner 分组 + 📍 源码行 + 🟡 借用方)+ alloc/drop 时间线(配对 ↔ + 未配对 ⚠️ 高亮)——数据源 `createOwnershipTracer` / `Proteus.ownership` 远程命令 |
|
|
54
|
+
|
|
55
|
+
## ★一键接入(Web 端,examples/main.ts 已示范)
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { installProteusDevtools } from '@proteus-vue/devtools'
|
|
59
|
+
import { getProteusTraceBus } from '@proteus-vue/devtools-runtime'
|
|
60
|
+
|
|
61
|
+
const traceBus = getProteusTraceBus()
|
|
62
|
+
if (import.meta.env.DEV || __PROTEUS_DEBUG__) traceBus.setEnabled(true) // 门控:生产零开销
|
|
63
|
+
|
|
64
|
+
installProteusDevtools(app, {
|
|
65
|
+
pinia, // → store 追踪 + 时间旅行 + 值编辑
|
|
66
|
+
getConfig, setConfig, // → Vue DevTools App Config Inspector
|
|
67
|
+
styleGuard, // → Vue DevTools Style Safety Inspector
|
|
68
|
+
pages: { routes }, // → pages/依赖图面板
|
|
69
|
+
remote: true, // → 远程查看桥(移动端/真机:电脑开面板看)
|
|
70
|
+
hmr: import.meta.hot, // → HMR 事件(vite:update/full-reload/error → timeline)
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
面板浮动按钮 **◈**(可拖拽、位置记忆);remote 开启后电脑浏览器开 dev server 打印的 `http://localhost:5173/proteus-devtools` 查看。
|
|
75
|
+
|
|
76
|
+
## ★后端开放 API(第三方接入自己的面板)
|
|
77
|
+
|
|
78
|
+
`DevtoolsSource` 是统一数据源接口(**官方面板自身就是它的消费者**,对标 `@vue/devtools-api` 的 client 角色):
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
const source = createDevtoolsWsSource('ws://host/proteus-panel') // 远程;进程内用 createTraceBusSource(bus)
|
|
82
|
+
source.onEvent((e) => myTimeline.push(e)) // 自绘 UI,只用数据
|
|
83
|
+
console.log(source.appInfo?.(), source.deviceInfo?.()) // 元数据查询
|
|
84
|
+
source.sendCommand?.('Proteus.restoreStores', { stores }) // 命令下发(双向调试)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**零包依赖**:协议是明文 JSON WebSocket(`Proteus.enable/event/appInfo/deviceInfo/restoreStores`,relay 端点 `/proteus-source` + `/proteus-panel`)——第三方仅需 WebSocket + 几行 JSON。完整规范见 `docs/proteus-devtools-plan/15-open-api.md`,零依赖实现见 `examples/pages/devtools-open-api-demo.vue`。
|
|
88
|
+
|
|
89
|
+
## 插件扩展(M9)
|
|
90
|
+
|
|
91
|
+
第三方在官方面板里加自定义视图/泳道/命令(`DevToolsPlugin` + `PluginContext`:bus/panel/commands/storage):
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import { createDevtoolsPanel, createPluginRegistry } from '@proteus-vue/devtools'
|
|
95
|
+
// options.plugins: [{ name, version, setup(ctx) { ctx.panel.addView('my', '我的视图', (el) => {...}) } }]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 使用(独立面板)
|
|
99
|
+
|
|
100
|
+
```html
|
|
101
|
+
<script src="@proteus-vue/devtools/panel"></script> <!-- IIFE bundle:file:// 双击可直接打开 -->
|
|
102
|
+
<script>
|
|
103
|
+
const source = ProteusDevtools.createDevtoolsWsSource('ws://127.0.0.1:5174/')
|
|
104
|
+
ProteusDevtools.createDevtoolsPanel(document.getElementById('root'), { source })
|
|
105
|
+
</script>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
dev 模式更推荐浏览器直接开 `http://localhost:5173/proteus-devtools`(devtoolsRelayPlugin 提供页面端点 + 注入默认 WS)。
|
|
109
|
+
|
|
110
|
+
## 设计约束(对齐 plan 铁律)
|
|
111
|
+
|
|
112
|
+
- **铁律 1**:UI 只消费事件流(TraceBus 唯一入口),不直接碰运行时
|
|
113
|
+
- 双向写回经回调/命令(`onApplyState` / `sendCommand('Proteus.restoreStores')`)——本地 `$patch` + 远程 relay 双通道
|
|
114
|
+
- 事件 payload 全程脱敏(password/token/authorization/idcard/phone);生产构建零端点零开销
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { App } from 'vue';
|
|
2
|
+
/** component 事件总线(结构与 devtools-runtime TraceBus.emit 兼容;业务侧直接传 createTraceBus 实例) */
|
|
3
|
+
export interface ComponentTraceBus {
|
|
4
|
+
emit(source: 'component', phase: 'point', name: string, payload?: unknown, traceId?: string): void;
|
|
5
|
+
}
|
|
6
|
+
/** 组件快照数据(props/state 序列化后——type tag 安全,JSON-safe) */
|
|
7
|
+
export interface ComponentSnapshot {
|
|
8
|
+
props?: unknown;
|
|
9
|
+
state?: unknown;
|
|
10
|
+
}
|
|
11
|
+
/** DOM 树节点(选中组件时构建渲染元素树,事件流下发——远程面板同样可见) */
|
|
12
|
+
export interface DomTreeNode {
|
|
13
|
+
tag: string;
|
|
14
|
+
id?: string;
|
|
15
|
+
cls?: string[];
|
|
16
|
+
children: DomTreeNode[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 构建 DOM 元素树摘要(选中组件 → 渲染结构可视化):tag/id/class + 子元素递归
|
|
20
|
+
* ★深度/数量上限防超大 payload(depth ≤ 4、children ≤ 20、class ≤ 10)
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildDomTree(el: Element, depth?: number): DomTreeNode | null;
|
|
23
|
+
export interface ComponentTraceHandle {
|
|
24
|
+
dispose(): void;
|
|
25
|
+
/** ★P1:按组件 id 取根 DOM 元素(页面高亮;fragment 取首个元素节点) */
|
|
26
|
+
getElement(id: number): HTMLElement | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 注入组件生命周期事件:
|
|
30
|
+
* component.mount payload { id, name, parentId, props?, state? } traceId comp-<id>(★props/state 为 mount 时刻快照)
|
|
31
|
+
* component.unmount payload { id } (面板移除节点)
|
|
32
|
+
* 实例 id 经 WeakMap 稳定(复用组件挂载 id 不变 → 面板计数 ×N)
|
|
33
|
+
* ★app.mixin 无卸载 API——安装后随 app 生命周期;返回 handle(dispose no-op + getElement registry)
|
|
34
|
+
*/
|
|
35
|
+
export declare function installComponentTrace(app: App, bus: ComponentTraceBus): ComponentTraceHandle;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function detectRuntimePlatform(): 'web' | 'skyline' | 'app';
|
|
2
|
+
/** web 基础库降级展示:浏览器内核版本(UA 解析;匹配不到 → undefined) */
|
|
3
|
+
export declare function detectBrowserVersion(ua: string | undefined): string | undefined;
|
|
4
|
+
/** 小程序基础库版本(wx SDKVersion;异常静默) */
|
|
5
|
+
export declare function detectMpLibVersion(wxGlobal: unknown): string | undefined;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export { createDevtoolsPanel } from './panel';
|
|
2
|
+
export type { DevtoolsPanel, DevtoolsPanelOptions } from './panel';
|
|
3
|
+
export { createDevtoolsWsSource } from './source';
|
|
4
|
+
export type { DevtoolsSource } from './source';
|
|
5
|
+
export { createTraceBusSource } from './source';
|
|
6
|
+
export { createTraceBusWsBridge } from './ws-bridge';
|
|
7
|
+
export type { TraceBusWsBridge, TraceBusWsBridgeOptions } from './ws-bridge';
|
|
8
|
+
export { installProteusTimeline, installProteusInspectors, PROTEUS_DEVTOOLS_PLUGIN_DESCRIPTOR } from './vue-devtools';
|
|
9
|
+
export type { VueDevtoolsApiLike, VueDevtoolsTimelineOptions, VueDevtoolsTimeline, VueDevtoolsInspectorApiLike, ProteusInspectorsOptions, ProteusInspectors } from './vue-devtools';
|
|
10
|
+
export { renderTimeline } from './views/timeline';
|
|
11
|
+
export type { TimelineViewData, TimelineWindow } from './views/timeline';
|
|
12
|
+
export { createTimelineZoom } from './views/timeline-interaction';
|
|
13
|
+
export type { TimelineZoom, TimelineZoomOptions } from './views/timeline-interaction';
|
|
14
|
+
export { renderFlamegraph } from './views/flamegraph';
|
|
15
|
+
export type { FlamegraphViewData } from './views/flamegraph';
|
|
16
|
+
export { renderState } from './views/state';
|
|
17
|
+
export type { StateViewData, StateViewHooks } from './views/state';
|
|
18
|
+
export { renderRoute } from './views/route';
|
|
19
|
+
export type { RouteViewData } from './views/route';
|
|
20
|
+
export { renderErrors } from './views/errors';
|
|
21
|
+
export type { ErrorsViewData } from './views/errors';
|
|
22
|
+
export { renderComponents } from './views/components';
|
|
23
|
+
export type { ComponentsViewData, ComponentNodeData, ComponentsViewHooks } from './views/components';
|
|
24
|
+
export { renderPages } from './views/pages';
|
|
25
|
+
export type { PagesViewData, PageRouteData } from './views/pages';
|
|
26
|
+
export { renderGraph } from './views/graph';
|
|
27
|
+
export type { GraphViewData } from './views/graph';
|
|
28
|
+
export { renderDevice } from './views/device';
|
|
29
|
+
export type { DeviceInfo, DeviceViewData, DeviceMemorySample, DeviceCapabilityInfo, DeviceMemoryInfo, DeviceScreenInfo } from './views/device';
|
|
30
|
+
export { renderOwnership } from './views/ownership';
|
|
31
|
+
export { createOwnershipTracer } from './ownership-info';
|
|
32
|
+
export type { OwnershipTracer, OwnershipTracerOptions, OwnershipViewData, OwnershipResourceItem } from './ownership-info';
|
|
33
|
+
export { serializeStoreSnapshot, parseStoreSnapshot, findSensitiveKeys } from './snapshot-io';
|
|
34
|
+
export type { StoreSnapshotIO, StoreRestoreEntry, StoreStepIO, ParsedStoreSnapshot, SensitiveKeyHit } from './snapshot-io';
|
|
35
|
+
export { serializeSession, parseSession } from './session-io';
|
|
36
|
+
export type { SessionBundle, ParsedSession } from './session-io';
|
|
37
|
+
export { installComponentTrace } from './component-trace';
|
|
38
|
+
export type { ComponentTraceBus, ComponentSnapshot, ComponentTraceHandle, DomTreeNode } from './component-trace';
|
|
39
|
+
export { buildDomTree } from './component-trace';
|
|
40
|
+
export { installProteusDevtools } from './install';
|
|
41
|
+
export type { InstallDevtoolsOptions, InstalledDevtools, StyleGuardLike } from './install';
|
|
42
|
+
export { detectRuntimePlatform, detectBrowserVersion, detectMpLibVersion } from './device-info';
|
|
43
|
+
export { createTooltipLayer, bindTooltip, attachTip, resolveTipData } from './tooltip';
|
|
44
|
+
export type { TooltipData, TooltipLayer } from './tooltip';
|
|
45
|
+
export { createPluginRegistry, createMemoryStorage, createCommandRegistry, resolveActivationOrder } from './plugins';
|
|
46
|
+
export type { DevToolsPlugin, PluginContext, PluginBus, PanelAPI, CommandRegistry, KVStorage, PluginEntry } from './plugins';
|
|
47
|
+
export { createNetworkPlugin } from './plugins/network';
|