@lytjs/devtools 6.0.0 → 6.5.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 ADDED
@@ -0,0 +1,723 @@
1
+ # @lytjs/devtools
2
+
3
+ > LytJS 官方开发者工具,提供组件树检查、状态管理、路由调试和性能监控功能。
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@lytjs/devtools.svg)](https://www.npmjs.com/package/@lytjs/devtools)
6
+ [![license](https://img.shields.io/npm/l/@lytjs/devtools.svg)](https://gitee.com/lytjs/lytjs/blob/main/LICENSE)
7
+
8
+ ## 简介
9
+
10
+ `@lytjs/devtools` 是 LytJS 框架的官方开发者工具包,提供了一套完整的调试和检查功能,帮助开发者更好地理解和调试 LytJS 应用。它支持组件树检查、Store 状态查看、路由调试、Signal 可视化、性能监控等功能。
11
+
12
+ ### 核心特性
13
+
14
+ - **组件树检查**:可视化组件层级结构,查看组件属性和状态
15
+ - **Store 检查器**:实时查看和修改 Store 状态,追踪状态变化
16
+ - **路由调试器**:查看路由历史、导航轨迹,支持时间旅行调试
17
+ - **Signal 可视化**:依赖图可视化,时间旅行调试,性能分析
18
+ - **性能监控**:FPS 监控、内存使用、慢操作检测、告警规则
19
+ - **时序事件**:Timeline 事件记录、火焰图生成、慢操作分析
20
+ - **基准测试**:内置性能基准测试,支持大规模场景测试
21
+ - **零依赖**:完全基于 LytJS 原生 API,无外部依赖
22
+
23
+ ## 安装
24
+
25
+ ```bash
26
+ npm install @lytjs/devtools
27
+ ```
28
+
29
+ 或使用 pnpm:
30
+
31
+ ```bash
32
+ pnpm add @lytjs/devtools
33
+ ```
34
+
35
+ ## 依赖关系
36
+
37
+ `@lytjs/devtools` 依赖以下 LytJS 核心包:
38
+
39
+ - `@lytjs/reactivity` - 响应式系统
40
+ - `@lytjs/component` - 组件系统
41
+ - `@lytjs/vdom` - 虚拟 DOM
42
+ - `@lytjs/router` - 路由系统
43
+ - `@lytjs/store` - 状态管理
44
+ - `@lytjs/common-is` - 工具函数
45
+ - `@lytjs/common-env` - 环境检测
46
+ - `@lytjs/common-dom` - DOM 工具函数
47
+ - `@lytjs/common-object` - 对象工具函数
48
+
49
+ ## 快速开始
50
+
51
+ ### 安装 DevTools
52
+
53
+ ```typescript
54
+ import { installDevTools } from '@lytjs/devtools';
55
+
56
+ if (import.meta.env.DEV) {
57
+ installDevTools({
58
+ displayPanel: true,
59
+ position: 'bottom-right'
60
+ });
61
+ }
62
+ ```
63
+
64
+ ### 获取 DevTools 实例
65
+
66
+ ```typescript
67
+ import { getDevTools } from '@lytjs/devtools';
68
+
69
+ const devtools = getDevTools();
70
+ if (devtools) {
71
+ console.log('DevTools 已安装');
72
+ }
73
+ ```
74
+
75
+ ## DevTools 安装 API
76
+
77
+ ### `installDevTools(options?)`
78
+
79
+ 安装 DevTools 并返回 API 实例。
80
+
81
+ ```typescript
82
+ import { installDevTools } from '@lytjs/devtools';
83
+
84
+ const devtools = installDevTools({
85
+ displayPanel: true,
86
+ position: 'bottom-right',
87
+ theme: 'dark',
88
+ filters: {
89
+ components: ['MyApp', 'Layout'],
90
+ stores: ['userStore']
91
+ }
92
+ });
93
+ ```
94
+
95
+ ### `getDevTools()`
96
+
97
+ 获取已安装的 DevTools 实例。
98
+
99
+ ```typescript
100
+ import { getDevTools } from '@lytjs/devtools';
101
+
102
+ const devtools = getDevTools();
103
+ if (devtools) {
104
+ devtools.getComponentTree();
105
+ }
106
+ ```
107
+
108
+ ### `uninstallDevTools()`
109
+
110
+ 卸载 DevTools。
111
+
112
+ ```typescript
113
+ import { uninstallDevTools } from '@lytjs/devtools';
114
+
115
+ uninstallDevTools();
116
+ ```
117
+
118
+ ## 组件树 API
119
+
120
+ ### 获取组件树
121
+
122
+ ```typescript
123
+ import { getComponentTree, serializeComponentTree } from '@lytjs/devtools';
124
+
125
+ const tree = getComponentTree();
126
+ const serialized = serializeComponentTree(tree);
127
+ console.log(serialized);
128
+ ```
129
+
130
+ ### 注册根组件
131
+
132
+ ```typescript
133
+ import { registerRootComponent } from '@lytjs/devtools';
134
+
135
+ registerRootComponent(App, {
136
+ id: 'main-app',
137
+ name: 'MyApp'
138
+ });
139
+ ```
140
+
141
+ ### 注销根组件
142
+
143
+ ```typescript
144
+ import { unregisterRootComponent } from '@lytjs/devtools';
145
+
146
+ unregisterRootComponent('main-app');
147
+ ```
148
+
149
+ ## Store 检查器 API
150
+
151
+ ### 获取所有 Store 状态
152
+
153
+ ```typescript
154
+ import { getStoreStates, serializeStoreStates } from '@lytjs/devtools';
155
+
156
+ const states = getStoreStates();
157
+ const serialized = serializeStoreStates(states);
158
+ console.log(serialized);
159
+ ```
160
+
161
+ ### 获取单个 Store 状态
162
+
163
+ ```typescript
164
+ import { getStoreState } from '@lytjs/devtools';
165
+
166
+ const userState = getStoreState('user');
167
+ console.log(userState);
168
+ ```
169
+
170
+ ### 设置 Store 状态
171
+
172
+ ```typescript
173
+ import { setStoreState } from '@lytjs/devtools';
174
+
175
+ setStoreState('user', { name: '新名称' });
176
+ ```
177
+
178
+ ### 派发 Store 动作
179
+
180
+ ```typescript
181
+ import { dispatchStoreAction } from '@lytjs/devtools';
182
+
183
+ dispatchStoreAction('cart', 'addItem', { id: 'p1', name: '产品1' });
184
+ ```
185
+
186
+ ### 注册/注销 Store
187
+
188
+ ```typescript
189
+ import { registerStore, unregisterStore } from '@lytjs/devtools';
190
+
191
+ registerStore('cart', cartStore);
192
+ unregisterStore('cart');
193
+ ```
194
+
195
+ ### 订阅 Store 变化
196
+
197
+ ```typescript
198
+ import { subscribeStore, unsubscribeStore, onStoreChange } from '@lytjs/devtools';
199
+
200
+ const unsubscribe = subscribeStore('user', (mutation, state) => {
201
+ console.log('User Store 变化:', mutation.type);
202
+ });
203
+
204
+ onStoreChange('user', (state) => {
205
+ console.log('新的 user 状态:', state);
206
+ });
207
+
208
+ unsubscribeStore('user', unsubscribe);
209
+ ```
210
+
211
+ ## 路由检查器 API
212
+
213
+ ### 获取当前路由信息
214
+
215
+ ```typescript
216
+ import { getCurrentRoute, serializeRouteInfo } from '@lytjs/devtools';
217
+
218
+ const route = getCurrentRoute();
219
+ const serialized = serializeRouteInfo(route);
220
+ console.log(serialized);
221
+ ```
222
+
223
+ ### 编程式导航
224
+
225
+ ```typescript
226
+ import { navigateTo, navigateToName, goBack } from '@lytjs/devtools';
227
+
228
+ navigateTo('/dashboard');
229
+ navigateToName('user-profile', { id: '123' });
230
+ goBack();
231
+ ```
232
+
233
+ ### 获取路由列表
234
+
235
+ ```typescript
236
+ import { getRoutes } from '@lytjs/devtools';
237
+
238
+ const routes = getRoutes();
239
+ console.log(routes);
240
+ ```
241
+
242
+ ### 注册/注销路由器
243
+
244
+ ```typescript
245
+ import { registerRouter, unregisterRouter, isRouterRegistered } from '@lytjs/devtools';
246
+
247
+ registerRouter(router);
248
+ console.log(isRouterRegistered());
249
+ unregisterRouter();
250
+ ```
251
+
252
+ ### 监听路由变化
253
+
254
+ ```typescript
255
+ import { watchRouteChanges, unwatchRouteChanges } from '@lytjs/devtools';
256
+
257
+ const unwatch = watchRouteChanges((to, from) => {
258
+ console.log(`路由变化: ${from.path} -> ${to.path}`);
259
+ });
260
+
261
+ unwatchRouteChanges(unwatch);
262
+ ```
263
+
264
+ ### 路由历史管理
265
+
266
+ ```typescript
267
+ import { getRouteHistory, clearRouteHistory } from '@lytjs/devtools';
268
+
269
+ const history = getRouteHistory();
270
+ console.log(history);
271
+
272
+ clearRouteHistory();
273
+ ```
274
+
275
+ ## Signal 检查器 API
276
+
277
+ ### 获取 Signal 节点
278
+
279
+ ```typescript
280
+ import { getSignalNodes, serializeSignalNode } from '@lytjs/devtools';
281
+
282
+ const nodes = getSignalNodes();
283
+ console.log(nodes);
284
+
285
+ const serialized = serializeSignalNode(nodes[0]);
286
+ ```
287
+
288
+ ### 获取依赖图
289
+
290
+ ```typescript
291
+ import { getDependencyGraph, serializeDependencyGraph } from '@lytjs/devtools';
292
+
293
+ const graph = getDependencyGraph();
294
+ const serialized = serializeDependencyGraph(graph);
295
+ ```
296
+
297
+ ### 创建快照
298
+
299
+ ```typescript
300
+ import { createSnapshot, getSnapshots, getTimeTravelState } from '@lytjs/devtools';
301
+
302
+ const snapshot = createSnapshot('v1.0');
303
+ const allSnapshots = getSnapshots();
304
+
305
+ const timeTravelState = getTimeTravelState();
306
+ ```
307
+
308
+ ### 时间旅行调试
309
+
310
+ ```typescript
311
+ import { restoreSnapshot, clearSnapshots, getTimeTravelNavigator } from '@lytjs/devtools';
312
+
313
+ restoreSnapshot('v1.0');
314
+
315
+ const navigator = getTimeTravelNavigator();
316
+ navigator.back();
317
+ navigator.forward();
318
+ navigator.jumpTo('v2.0');
319
+ ```
320
+
321
+ ### 信号性能分析
322
+
323
+ ```typescript
324
+ import { getPerformanceStats, getPerformanceRecords } from '@lytjs/devtools';
325
+
326
+ const stats = getPerformanceStats();
327
+ const records = getPerformanceRecords();
328
+
329
+ clearPerformanceRecords();
330
+ ```
331
+
332
+ ### 注册/追踪 Signal
333
+
334
+ ```typescript
335
+ import { registerSignal, recordSignalUpdate, recordDependency } from '@lytjs/devtools';
336
+
337
+ registerSignal('counter', counterSignal);
338
+
339
+ recordSignalUpdate('counter', 1);
340
+ recordDependency('counter', 'doubled');
341
+ ```
342
+
343
+ ### 可视化布局图
344
+
345
+ ```typescript
346
+ import { getVisualLayoutGraph, getSubgraph, searchSignals } from '@lytjs/devtools';
347
+
348
+ const layoutGraph = getVisualLayoutGraph();
349
+ const subgraph = getSubgraph('counter');
350
+
351
+ const results = searchSignals('user');
352
+ ```
353
+
354
+ ### 快照比较
355
+
356
+ ```typescript
357
+ import { compareSnapshots, serializeSnapshotDiff, getDiffBetweenSnapshots } from '@lytjs/devtools';
358
+
359
+ const comparison = compareSnapshots('v1.0', 'v2.0');
360
+ const diff = serializeSnapshotDiff(comparison);
361
+
362
+ const detailedDiff = getDiffBetweenSnapshots('v1.0', 'v2.0');
363
+ ```
364
+
365
+ ## 性能监控 API
366
+
367
+ ### 初始化性能监控
368
+
369
+ ```typescript
370
+ import { initPerformanceMonitor, recordMetric, getMetrics } from '@lytjs/devtools';
371
+
372
+ initPerformanceMonitor({
373
+ fps: true,
374
+ memory: true,
375
+ custom: true
376
+ });
377
+
378
+ recordMetric('render', performance.now());
379
+ const metrics = getMetrics();
380
+ ```
381
+
382
+ ### 统计信息
383
+
384
+ ```typescript
385
+ import { getStats, getPerformanceReport, serializePerformanceReport } from '@lytjs/devtools';
386
+
387
+ const stats = getStats();
388
+ console.log(stats);
389
+
390
+ const report = getPerformanceReport();
391
+ const serialized = serializePerformanceReport(report);
392
+ ```
393
+
394
+ ### 告警规则
395
+
396
+ ```typescript
397
+ import {
398
+ registerAlertRule,
399
+ unregisterAlertRule,
400
+ getAlertRules,
401
+ getAlerts,
402
+ acknowledgeAlert,
403
+ clearAlerts
404
+ } from '@lytjs/devtools';
405
+
406
+ registerAlertRule({
407
+ id: 'high-memory',
408
+ condition: (metrics) => metrics.memory.used > 100 * 1024 * 1024,
409
+ level: 'warning',
410
+ message: '内存使用过高'
411
+ });
412
+
413
+ const rules = getAlertRules();
414
+ const alerts = getAlerts();
415
+
416
+ acknowledgeAlert('high-memory-001');
417
+ clearAlerts();
418
+ ```
419
+
420
+ ### 自定义计时器
421
+
422
+ ```typescript
423
+ import { startTimer, addObserver, removeObserver, clearMetrics } from '@lytjs/devtools';
424
+
425
+ const end = startTimer('my-operation');
426
+ doSomething();
427
+ end();
428
+
429
+ const observer = (metrics) => console.log(metrics);
430
+ addObserver(observer);
431
+ removeObserver(observer);
432
+
433
+ clearMetrics();
434
+ resetPerformanceMonitor();
435
+ ```
436
+
437
+ ## 时序事件 API
438
+
439
+ ### 时间线事件
440
+
441
+ ```typescript
442
+ import {
443
+ beginTimelineEvent,
444
+ endTimelineEvent,
445
+ getTimelineEvents,
446
+ getTimelineEventsInRange,
447
+ clearTimelineEvents
448
+ } from '@lytjs/devtools';
449
+
450
+ const eventId = beginTimelineEvent('render', { component: 'App' });
451
+ render();
452
+ endTimelineEvent(eventId);
453
+
454
+ const events = getTimelineEvents();
455
+ const rangeEvents = getTimelineEventsInRange(0, 1000);
456
+ ```
457
+
458
+ ### 慢操作分析
459
+
460
+ ```typescript
461
+ import { getSlowOperations, getFlameGraphData } from '@lytjs/devtools';
462
+
463
+ const slowOps = getSlowOperations({ threshold: 100 });
464
+ const flameGraph = getFlameGraphData();
465
+ ```
466
+
467
+ ### 导出时间线
468
+
469
+ ```typescript
470
+ import { exportTimelineAsJSON, serializeTimelineEvents } from '@lytjs/devtools';
471
+
472
+ const json = exportTimelineAsJSON();
473
+ const serialized = serializeTimelineEvents(events);
474
+ ```
475
+
476
+ ## 基准测试 API
477
+
478
+ ### 运行基准测试
479
+
480
+ ```typescript
481
+ import {
482
+ runBenchmark,
483
+ runAsyncBenchmark,
484
+ getBenchmarkResults,
485
+ compareBenchmarkResults
486
+ } from '@lytjs/devtools';
487
+
488
+ const result = await runBenchmark({
489
+ name: 'array-iterate',
490
+ fn: () => {
491
+ for (let i = 0; i < 1000; i++) {
492
+ arr.push(i);
493
+ }
494
+ },
495
+ iterations: 100
496
+ });
497
+
498
+ const asyncResult = await runAsyncBenchmark({
499
+ name: 'fetch-data',
500
+ fn: async () => {
501
+ return await fetch('/api/data').then(r => r.json());
502
+ },
503
+ iterations: 10
504
+ });
505
+
506
+ const allResults = getBenchmarkResults();
507
+ const comparison = compareBenchmarkResults(result1, result2);
508
+ ```
509
+
510
+ ### 大规模基准测试
511
+
512
+ ```typescript
513
+ import { createLargeScaleBenchmark, LARGE_SCALE_SCENARIOS } from '@lytjs/devtools';
514
+
515
+ const result = await createLargeScaleBenchmark({
516
+ scenario: LARGE_SCALE_SCENARIOS.LARGE_LIST,
517
+ options: { items: 10000 }
518
+ });
519
+ ```
520
+
521
+ ### 内存使用分析
522
+
523
+ ```typescript
524
+ import { getMemoryUsage, serializeMemoryUsage } from '@lytjs/devtools';
525
+
526
+ const memory = getMemoryUsage();
527
+ const serialized = serializeMemoryUsage(memory);
528
+ console.log(serialized);
529
+ ```
530
+
531
+ ### 回归检测
532
+
533
+ ```typescript
534
+ import { createRegressionDetector } from '@lytjs/devtools';
535
+
536
+ const detector = createRegressionDetector({
537
+ baseline: baselineResults,
538
+ threshold: 0.1
539
+ });
540
+
541
+ detector.addResult(newResults);
542
+ if (detector.hasRegression()) {
543
+ console.log('检测到性能回归');
544
+ }
545
+ ```
546
+
547
+ ## 类型定义
548
+
549
+ ### DevTools 选项
550
+
551
+ ```typescript
552
+ interface DevToolsOptions {
553
+ displayPanel?: boolean;
554
+ position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
555
+ theme?: 'light' | 'dark' | 'auto';
556
+ filters?: {
557
+ components?: string[];
558
+ stores?: string[];
559
+ };
560
+ enabled?: boolean;
561
+ }
562
+ ```
563
+
564
+ ### 组件树节点
565
+
566
+ ```typescript
567
+ interface ComponentTreeNode {
568
+ id: string;
569
+ name: string;
570
+ type: string;
571
+ props?: Record<string, any>;
572
+ state?: Record<string, any>;
573
+ children?: ComponentTreeNode[];
574
+ }
575
+ ```
576
+
577
+ ### Store 状态信息
578
+
579
+ ```typescript
580
+ interface StoreStateInfo {
581
+ id: string;
582
+ state: any;
583
+ getters?: Record<string, any>;
584
+ actions?: Record<string, Function>;
585
+ subscriptions?: number;
586
+ }
587
+ ```
588
+
589
+ ### 路由信息
590
+
591
+ ```typescript
592
+ interface RouteInfo {
593
+ path: string;
594
+ name?: string;
595
+ params: Record<string, string>;
596
+ query: Record<string, string>;
597
+ meta?: Record<string, any>;
598
+ }
599
+ ```
600
+
601
+ ### 性能指标
602
+
603
+ ```typescript
604
+ interface PerformanceMetric {
605
+ type: 'fps' | 'memory' | 'render' | 'custom';
606
+ value: number;
607
+ timestamp: number;
608
+ metadata?: Record<string, any>;
609
+ }
610
+
611
+ interface AlertRule {
612
+ id: string;
613
+ condition: (metrics: PerformanceStats) => boolean;
614
+ level: 'info' | 'warning' | 'error';
615
+ message: string;
616
+ enabled?: boolean;
617
+ }
618
+ ```
619
+
620
+ ## 配置示例
621
+
622
+ ### 完整配置
623
+
624
+ ```typescript
625
+ import { installDevTools } from '@lytjs/devtools';
626
+
627
+ installDevTools({
628
+ displayPanel: true,
629
+ position: 'bottom-right',
630
+ theme: 'dark',
631
+ filters: {
632
+ components: ['App', 'Layout', 'Header', 'Footer'],
633
+ stores: ['userStore', 'cartStore']
634
+ },
635
+ enabled: import.meta.env.DEV
636
+ });
637
+ ```
638
+
639
+ ### 仅在开发模式启用
640
+
641
+ ```typescript
642
+ import { installDevTools, getDevTools } from '@lytjs/devtools';
643
+
644
+ if (import.meta.env.DEV) {
645
+ installDevTools();
646
+ }
647
+
648
+ export function DebugPanel() {
649
+ const devtools = getDevTools();
650
+ if (!devtools) return null;
651
+
652
+ return () => (
653
+ <div class="debug-panel">
654
+ <button onClick={() => devtools.getComponentTree()}>
655
+ 查看组件树
656
+ </button>
657
+ <button onClick={() => devtools.getStoreStates()}>
658
+ 查看状态
659
+ </button>
660
+ </div>
661
+ );
662
+ }
663
+ ```
664
+
665
+ ## 最佳实践
666
+
667
+ ### 生产环境禁用
668
+
669
+ ```typescript
670
+ import { installDevTools, getDevTools } from '@lytjs/devtools';
671
+
672
+ if (import.meta.env.DEV) {
673
+ installDevTools();
674
+ }
675
+ ```
676
+
677
+ ### 自定义性能监控
678
+
679
+ ```typescript
680
+ import { recordMetric, startTimer } from '@lytjs/devtools';
681
+
682
+ function measureAsyncOperation(name: string, fn: () => Promise<any>) {
683
+ const end = startTimer(name);
684
+ return fn().finally(end);
685
+ }
686
+
687
+ measureAsyncOperation('api-fetch', () => fetch('/api/data').then(r => r.json()));
688
+ ```
689
+
690
+ ### 告警规则配置
691
+
692
+ ```typescript
693
+ import { registerAlertRule } from '@lytjs/devtools';
694
+
695
+ registerAlertRule({
696
+ id: 'low-fps',
697
+ condition: (stats) => stats.fps?.current < 30,
698
+ level: 'warning',
699
+ message: 'FPS 过低,可能存在性能问题'
700
+ });
701
+
702
+ registerAlertRule({
703
+ id: 'memory-leak',
704
+ condition: (stats) => stats.memory?.leaked > 10 * 1024 * 1024,
705
+ level: 'error',
706
+ message: '检测到可能的内存泄漏'
707
+ });
708
+ ```
709
+
710
+ ## 浏览器兼容性
711
+
712
+ `@lytjs/devtools` 支持所有现代浏览器(Chrome、Firefox、Safari、Edge)。
713
+
714
+ ## 许可证
715
+
716
+ MIT License - [查看许可证](https://gitee.com/lytjs/lytjs/blob/main/LICENSE)
717
+
718
+ ## 贡献指南
719
+
720
+ 欢迎提交 Issue 和 Pull Request!
721
+
722
+ - [Gitee 仓库](https://gitee.com/lytjs/lytjs)
723
+ - [问题反馈](https://gitee.com/lytjs/lytjs/issues)