vite-uni-dev-tool 1.0.0 → 1.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.
Files changed (168) hide show
  1. package/README.md +46 -0
  2. package/dist/const.cjs +1 -1
  3. package/dist/const.d.ts +12 -0
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -1
  6. package/dist/core-shared.d.ts +1 -1
  7. package/dist/core-shared.d.ts.map +1 -1
  8. package/dist/core-shared.js +1 -1
  9. package/dist/core.d.ts +10 -3
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +2 -2
  12. package/dist/i18n/locales/en.cjs +1 -1
  13. package/dist/i18n/locales/en.d.ts +81 -0
  14. package/dist/i18n/locales/en.d.ts.map +1 -1
  15. package/dist/i18n/locales/en.js +1 -1
  16. package/dist/i18n/locales/zh-Hans.cjs +1 -1
  17. package/dist/i18n/locales/zh-Hans.d.ts +82 -1
  18. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -1
  19. package/dist/i18n/locales/zh-Hans.js +1 -1
  20. package/dist/modules/devConsole/index.cjs +1 -1
  21. package/dist/modules/devConsole/index.js +3 -3
  22. package/dist/modules/devEvent/index.cjs +3 -3
  23. package/dist/modules/devEvent/index.d.ts +1 -0
  24. package/dist/modules/devEvent/index.d.ts.map +1 -1
  25. package/dist/modules/devEvent/index.js +3 -3
  26. package/dist/modules/devIntercept/index.cjs +14 -13
  27. package/dist/modules/devIntercept/index.d.ts +19 -0
  28. package/dist/modules/devIntercept/index.d.ts.map +1 -1
  29. package/dist/modules/devIntercept/index.js +14 -13
  30. package/dist/modules/devStore/index.cjs +1 -1
  31. package/dist/modules/devStore/index.d.ts +21 -0
  32. package/dist/modules/devStore/index.d.ts.map +1 -1
  33. package/dist/modules/devStore/index.js +1 -1
  34. package/dist/plugins/uniDevTool/transform/transformMain.cjs +1 -1
  35. package/dist/plugins/uniDevTool/transform/transformMain.js +1 -1
  36. package/dist/type.d.ts +47 -2
  37. package/dist/type.d.ts.map +1 -1
  38. package/dist/utils/language.cjs +1 -1
  39. package/dist/utils/language.d.ts.map +1 -1
  40. package/dist/utils/language.js +1 -1
  41. package/dist/utils/object.cjs +1 -1
  42. package/dist/utils/object.d.ts.map +1 -1
  43. package/dist/utils/object.js +1 -1
  44. package/dist/v3/DevTool/components/BluetoothList/BluetoothItem.vue +199 -0
  45. package/dist/v3/DevTool/components/BluetoothList/BluetoothTool.vue +730 -0
  46. package/dist/v3/DevTool/components/BluetoothList/index.vue +167 -0
  47. package/dist/v3/{CaptureScreen → DevTool/components/CaptureScreen}/index.vue +109 -109
  48. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/ConsoleItem.vue +225 -224
  49. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/RunJSInput.vue +247 -249
  50. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/index.vue +171 -160
  51. package/dist/v3/{ConsoleList → DevTool/components/ConsoleList}/staticTips.ts +1145 -1145
  52. package/dist/v3/{DevToolButton → DevTool/components/DevToolButton}/index.vue +7 -4
  53. package/dist/v3/{DevToolTitle → DevTool/components/DevToolTitle}/index.vue +24 -24
  54. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/DevToolOverlay.vue +197 -182
  55. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/const.ts +28 -5
  56. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/dataUtils.ts +48 -48
  57. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/useDevToolData.ts +387 -338
  58. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/useDevToolHandlers.ts +629 -549
  59. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/hooks/useDevToolOverlay.ts +197 -184
  60. package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/index.vue +67 -16
  61. package/dist/v3/{ElEvent → DevTool/components/ElEvent}/ElEventItem.vue +105 -105
  62. package/dist/v3/{ElEvent → DevTool/components/ElEvent}/index.vue +106 -109
  63. package/dist/v3/{Instance → DevTool/components/Instance}/components/InstanceTreeNode.vue +265 -265
  64. package/dist/v3/{Instance → DevTool/components/Instance}/flatten.ts +226 -226
  65. package/dist/v3/{Instance → DevTool/components/Instance}/index.vue +94 -94
  66. package/dist/v3/{Instance → DevTool/components/Instance}/registry.ts +49 -49
  67. package/dist/v3/{Instance → DevTool/components/Instance}/transformTree.ts +375 -375
  68. package/dist/v3/{Instance → DevTool/components/Instance}/transformTreeCtx.ts +268 -268
  69. package/dist/v3/{Instance → DevTool/components/Instance}/typing.d.ts +43 -43
  70. package/dist/v3/{InstanceDetail → DevTool/components/InstanceDetail}/index.vue +485 -485
  71. package/dist/v3/{JsonDetail → DevTool/components/JsonDetail}/index.vue +70 -70
  72. package/dist/v3/{NFCList → DevTool/components/NFCList}/NFCItem.vue +112 -113
  73. package/dist/v3/{NFCList → DevTool/components/NFCList}/NFCTool.vue +454 -478
  74. package/dist/v3/{NFCList → DevTool/components/NFCList}/const.ts +56 -56
  75. package/dist/v3/{NFCList → DevTool/components/NFCList}/index.vue +94 -98
  76. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/InterceptConfig.vue +624 -608
  77. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/InterceptItem.vue +140 -140
  78. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkDetail.vue +287 -296
  79. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkIntercept.vue +88 -93
  80. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkItem.vue +163 -167
  81. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/NetworkSend.vue +589 -556
  82. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/const.ts +4 -4
  83. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/hooks/useNetworkForm.ts +86 -86
  84. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/index.vue +160 -160
  85. package/dist/v3/{NetworkList → DevTool/components/NetworkList}/utils.ts +101 -101
  86. package/dist/v3/{Performance → DevTool/components/Performance}/index.vue +498 -495
  87. package/dist/v3/{Performance → DevTool/components/Performance}/modules/PerformanceMetrics.vue +153 -153
  88. package/dist/v3/{Performance → DevTool/components/Performance}/modules/PerformanceWidget.vue +12 -9
  89. package/dist/v3/{Performance → DevTool/components/Performance}/modules/usePerformanceChart.ts +460 -460
  90. package/dist/v3/{Performance → DevTool/components/Performance}/modules/usePerformanceData.ts +258 -258
  91. package/dist/v3/{PiniaList → DevTool/components/PiniaList}/index.vue +93 -94
  92. package/dist/v3/{RouteList → DevTool/components/RouteList}/index.vue +21 -24
  93. package/dist/v3/{RunJS → DevTool/components/RunJS}/index.vue +148 -148
  94. package/dist/v3/{ScanCodeList → DevTool/components/ScanCodeList}/ScanCodeItem.vue +97 -98
  95. package/dist/v3/{ScanCodeList → DevTool/components/ScanCodeList}/index.vue +100 -104
  96. package/dist/v3/{SettingButton → DevTool/components/SettingButton}/index.vue +45 -45
  97. package/dist/v3/{SettingList → DevTool/components/SettingList}/index.vue +218 -150
  98. package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +304 -0
  99. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingDevTool.vue +212 -208
  100. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingInfo.vue +157 -119
  101. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingLanguage.vue +74 -74
  102. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingLog.vue +230 -230
  103. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingNetwork.vue +3 -3
  104. package/dist/v3/{SettingList → DevTool/components/SettingList}/modules/SettingTheme.vue +37 -7
  105. package/dist/v3/{SettingList → DevTool/components/SettingList}/typing.d.ts +2 -2
  106. package/dist/v3/{SourceCode → DevTool/components/SourceCode}/Line.vue +127 -116
  107. package/dist/v3/{SourceCode → DevTool/components/SourceCode}/index.vue +8 -8
  108. package/dist/v3/{SourceCode → DevTool/components/SourceCode}/parseCode.ts +609 -701
  109. package/dist/v3/{StorageList → DevTool/components/StorageList}/index.vue +174 -174
  110. package/dist/v3/{TransferList → DevTool/components/TransferList}/TransferDetail.vue +268 -268
  111. package/dist/v3/{TransferList → DevTool/components/TransferList}/TransferItem.vue +4 -4
  112. package/dist/v3/{TransferList → DevTool/components/TransferList}/index.vue +8 -8
  113. package/dist/v3/{UniEvent → DevTool/components/UniEvent}/UniEventItem.vue +6 -7
  114. package/dist/v3/{UniEvent → DevTool/components/UniEvent}/index.vue +6 -6
  115. package/dist/v3/{VuexList → DevTool/components/VuexList}/index.vue +84 -84
  116. package/dist/v3/{WebSocket → DevTool/components/WebSocket}/WebSocketDetail.vue +8 -8
  117. package/dist/v3/{WebSocket → DevTool/components/WebSocket}/WebSocketItem.vue +4 -4
  118. package/dist/v3/{WebSocket → DevTool/components/WebSocket}/index.vue +8 -8
  119. package/dist/v3/DevTool/index.vue +179 -5
  120. package/dist/v3/{AppTransition → components/AppTransition}/index.vue +176 -170
  121. package/dist/v3/{AutoSizer → components/AutoSizer}/index.vue +192 -192
  122. package/dist/v3/{AutoSizer → components/AutoSizer}/index1.vue +184 -184
  123. package/dist/v3/{AutoSizer → components/AutoSizer}/utils.ts +49 -49
  124. package/dist/v3/components/Barrage/BarrageItem.vue +137 -0
  125. package/dist/v3/components/Barrage/index.vue +202 -0
  126. package/dist/v3/{CircularButton → components/CircularButton}/index.vue +84 -84
  127. package/dist/v3/{CustomSwiper → components/CustomSwiper}/CustomSwiperItem.vue +49 -49
  128. package/dist/v3/{CustomSwiper → components/CustomSwiper}/index.vue +104 -104
  129. package/dist/v3/{DraggableContainer → components/DraggableContainer}/index.vue +1 -1
  130. package/dist/v3/{Empty → components/Empty}/index.vue +29 -29
  131. package/dist/v3/{FilterInput → components/FilterInput}/index.vue +1 -1
  132. package/dist/v3/{FilterSelect → components/FilterSelect}/index.vue +179 -179
  133. package/dist/v3/{JsonPretty → components/JsonPretty}/components/Brackets/index.vue +27 -27
  134. package/dist/v3/{JsonPretty → components/JsonPretty}/components/Carets/index.vue +59 -59
  135. package/dist/v3/{JsonPretty → components/JsonPretty}/components/CheckController/index.vue +136 -136
  136. package/dist/v3/{JsonPretty → components/JsonPretty}/components/TreeNode/index.vue +387 -381
  137. package/dist/v3/{JsonPretty → components/JsonPretty}/hooks/useClipboard.ts +21 -21
  138. package/dist/v3/{JsonPretty → components/JsonPretty}/hooks/useError.ts +21 -21
  139. package/dist/v3/{JsonPretty → components/JsonPretty}/index.vue +16 -13
  140. package/dist/v3/{JsonPretty → components/JsonPretty}/type.ts +127 -126
  141. package/dist/v3/{JsonPretty → components/JsonPretty}/utils/index.ts +169 -169
  142. package/dist/v3/{MovableContainer → components/MovableContainer}/index.vue +1 -1
  143. package/dist/v3/{Pick → components/Pick}/index.vue +322 -322
  144. package/dist/v3/{Tabs → components/Tabs}/index.vue +30 -4
  145. package/dist/v3/{Tag → components/Tag}/index.vue +113 -113
  146. package/dist/v3/{VirtualList → components/VirtualList}/AutoSize.vue +40 -40
  147. package/dist/v3/{VirtualList → components/VirtualList}/index.vue +416 -412
  148. package/dist/v3/hooks/useBluetooth/index.ts +561 -0
  149. package/dist/v3/hooks/useContainerStyle.ts +153 -153
  150. package/dist/v3/hooks/useNFC/index.ts +107 -107
  151. package/dist/v3/hooks/useNFC/typing.d.ts +396 -396
  152. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +966 -966
  153. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +812 -812
  154. package/dist/v3/hooks/useNFC/utils.ts +754 -754
  155. package/dist/v3/hooks/useRequest/index.ts +586 -573
  156. package/dist/v3/hooks/useRequest/utils.ts +267 -267
  157. package/dist/v3/hooks/useScanCode/index.ts +206 -206
  158. package/dist/v3/hooks/useWebsocket/README.md +79 -0
  159. package/dist/v3/hooks/useWebsocket/index.ts +253 -0
  160. package/dist/v3/styles/theme.css +17 -10
  161. package/dist/v3/styles/theme.ts +12 -12
  162. package/package.json +59 -64
  163. package/dist/plugins/uniParseStock/index.d.ts +0 -10
  164. package/dist/plugins/uniParseStock/index.d.ts.map +0 -1
  165. /package/dist/v3/{DevToolWindow → DevTool/components/DevToolWindow}/index.css +0 -0
  166. /package/dist/v3/{SettingList → DevTool/components/SettingList}/index.css +0 -0
  167. /package/dist/v3/{Empty → components/Empty}/empty.png +0 -0
  168. /package/dist/v3/{VirtualList → components/VirtualList}/readme.md +0 -0
@@ -1,495 +1,498 @@
1
- <template>
2
- <view class="performance-content">
3
- <view class="performance-control">
4
- <DevToolTitle>{{ t('performance.title') }}</DevToolTitle>
5
- </view>
6
- <view class="performance-item">
7
- <!-- 图表容器 -->
8
- <canvas
9
- canvas-id="fpsChartTab"
10
- class="fps-chart-container"
11
- :style="{ backgroundColor: chartBgColor }"
12
- id="fpsChartTab"></canvas>
13
- <PerformanceMetrics
14
- :is-tab="true"
15
- :fps="fps"
16
- :cpuLoad="cpuLoad"
17
- :memory="memory"
18
- :showFps="showFps"
19
- :showCpu="showCpu"
20
- :showMemory="showMemory" />
21
-
22
- <view class="performance-item-content">
23
- <!-- 平台限制提示 -->
24
- <view
25
- class="performance-tips"
26
- style="
27
- color: #e6a23c;
28
- background: rgb(230 162 60 / 10%);
29
- padding: 8px;
30
- border-radius: 4px;
31
- margin-bottom: 12px;
32
- font-size: 11px;
33
- "
34
- v-if="!isH5">
35
- {{ t('performance.platformTip') }}
36
- </view>
37
- <DevToolTitle>{{ t('performance.settings') }}</DevToolTitle>
38
- <view class="performance-row">
39
- <view>{{ t('performance.enable') }}</view>
40
- <switch
41
- :checked="performanceMonitorEnabled"
42
- @change="toggleMonitor"
43
- :color="themeColor"
44
- style="transform: scale(0.7)" />
45
- </view>
46
- <view class="performance-tips">
47
- {{ t('performance.enableTip') }}
48
- </view>
49
- <view class="performance-row">
50
- <view>{{ t('performance.widget') }}</view>
51
- <switch
52
- :disabled="!performanceMonitorEnabled"
53
- :checked="performanceVisible"
54
- @change="togglePerformanceVisible"
55
- :color="themeColor"
56
- style="transform: scale(0.7)" />
57
- </view>
58
- <view class="performance-tips">
59
- {{ t('performance.widgetTip') }}
60
- </view>
61
- <view class="performance-row">
62
- <view>{{ t('performance.fps') }}</view>
63
- <switch
64
- :disabled="!performanceMonitorEnabled"
65
- :checked="showFps"
66
- @change="toggleFps"
67
- :color="themeColor"
68
- style="transform: scale(0.7)" />
69
- </view>
70
- <view class="performance-tips">
71
- {{ t('performance.fpsTip') }}
72
- </view>
73
- <view class="performance-row">
74
- <view>{{ t('performance.cpu') }}</view>
75
- <switch
76
- :disabled="!performanceMonitorEnabled"
77
- :checked="showCpu"
78
- @change="toggleCpu"
79
- :color="themeColor"
80
- style="transform: scale(0.7)" />
81
- </view>
82
- <view class="performance-tips">
83
- {{ t('performance.cpuTip') }}
84
- </view>
85
- <view class="performance-row">
86
- <view>{{ t('performance.memory') }}</view>
87
- <switch
88
- :disabled="!performanceMonitorEnabled"
89
- :checked="showMemory"
90
- @change="toggleMemory"
91
- :color="themeColor"
92
- style="transform: scale(0.7)" />
93
- </view>
94
- <view class="performance-tips">
95
- {{ t('performance.memoryTip') }}
96
- </view>
97
-
98
- <!-- CPU Profile / Long Tasks List -->
99
- <view
100
- class="performance-item-content"
101
- style="margin-top: 16px"
102
- v-if="longTasksHistory.length > 0">
103
- <DevToolTitle>{{ t('performance.longTaskTitle') }}</DevToolTitle>
104
- <view class="performance-tips">
105
- {{ t('performance.longTaskTip') }}
106
- </view>
107
- <view class="long-tasks-list">
108
- <view
109
- v-for="(task, index) in longTasksHistory.slice().reverse()"
110
- :key="index"
111
- class="long-task-item">
112
- <view class="task-info">
113
- <text
114
- class="task-type"
115
- :class="`type-${task.type?.toLowerCase()}`">
116
- {{
117
- task.type === 'Logic'
118
- ? t('performance.logic')
119
- : t('performance.ui')
120
- }}
121
- </text>
122
- <text class="task-time">{{ formatTaskTime(task.ts) }}</text>
123
- </view>
124
- <view
125
- class="task-duration"
126
- :class="getDurationClass(task.duration)">
127
- {{ task.duration }}ms
128
- </view>
129
- </view>
130
- </view>
131
- </view>
132
- </view>
133
- </view>
134
- </view>
135
- </template>
136
-
137
- <script setup lang="ts">
138
- import { ref, computed, onMounted, onUnmounted, getCurrentInstance } from 'vue';
139
- import { getDevToolInfo, setDevToolInfo } from '../../modules/devToolInfo';
140
- import PerformanceMetrics from './modules/PerformanceMetrics.vue';
141
- import { usePerformanceData } from './modules/usePerformanceData';
142
- import { usePerformanceChart } from './modules/usePerformanceChart';
143
- import { MSG_TYPE, DEV_CORE_MESSAGE } from '../../const';
144
- import DevToolTitle from '../DevToolTitle/index.vue';
145
- import { useI18n } from '../../i18n';
146
- import { getThemeMainColor } from '../styles/theme';
147
- const { t } = useI18n();
148
- const themeColor = computed(() => getThemeMainColor(props.theme));
149
-
150
- // 无需声明 renderScript
151
-
152
- const props = withDefaults(
153
- defineProps<{
154
- mode?: 'tab';
155
- zIndex?: number;
156
- customStyle?: Record<string, any>;
157
- contentHeight?: number;
158
- theme?: string;
159
- }>(),
160
- {
161
- zIndex: 1000,
162
- theme: 'light',
163
- },
164
- );
165
-
166
- const showFps = ref(true);
167
- const showCpu = ref(true);
168
- const showMemory = ref(true);
169
- const performanceVisible = ref(false);
170
- const isH5 = ref(false);
171
-
172
- function loadSettings() {
173
- // #ifdef H5
174
- isH5.value = true;
175
- // #endif
176
-
177
- const info = getDevToolInfo();
178
- if (info && info.performanceSettings) {
179
- showFps.value = info.performanceSettings.showFps ?? true;
180
- showCpu.value = info.performanceSettings.showCpu ?? true;
181
- showMemory.value = info.performanceSettings.showMemory ?? true;
182
- performanceMonitorEnabled.value =
183
- info.performanceSettings.enableMonitor ?? false;
184
- }
185
- if (info && info.performanceVisible !== undefined) {
186
- performanceVisible.value = info.performanceVisible;
187
- }
188
- }
189
-
190
- function saveSettings() {
191
- setDevToolInfo({
192
- performanceSettings: {
193
- showFps: showFps.value,
194
- showCpu: showCpu.value,
195
- showMemory: showMemory.value,
196
- enableMonitor: performanceMonitorEnabled.value,
197
- },
198
- performanceVisible: performanceVisible.value,
199
- });
200
- }
201
-
202
- function toggleFps(e: any) {
203
- showFps.value = e.detail.value;
204
- saveSettings();
205
- }
206
-
207
- function toggleCpu(e: any) {
208
- showCpu.value = e.detail.value;
209
- saveSettings();
210
- }
211
-
212
- function toggleMemory(e: any) {
213
- showMemory.value = e.detail.value;
214
- saveSettings();
215
- }
216
-
217
- function togglePerformanceVisible(e: any) {
218
- performanceVisible.value = e.detail.value;
219
-
220
- // 如果关闭悬浮窗,同时关闭监测功能
221
- if (!performanceVisible.value && performanceMonitorEnabled.value) {
222
- performanceMonitorEnabled.value = false;
223
- performanceData.stopHeartbeat();
224
- performanceChart.stopRenderLoop();
225
- // 通知 PerformanceWidget 停止监测
226
- uni.$emit(MSG_TYPE.PERF_MONITOR, false);
227
- }
228
-
229
- saveSettings();
230
- // 通知 DevTool 组件更新性能弹窗可见性
231
- uni.$emit(DEV_CORE_MESSAGE, {
232
- type: MSG_TYPE.PERF_VISIBLE,
233
- data: performanceVisible.value,
234
- });
235
- }
236
-
237
- function toggleMonitor(e: any) {
238
- performanceMonitorEnabled.value = e.detail.value;
239
- if (!performanceMonitorEnabled.value) {
240
- performanceVisible.value = false;
241
- }
242
- saveSettings();
243
- uni.$emit(MSG_TYPE.PERF_MONITOR, performanceMonitorEnabled.value);
244
- if (performanceMonitorEnabled.value) {
245
- performanceData.initData(
246
- Math.ceil(performanceChart.canvasWidth.value / stepSize) + 4,
247
- );
248
- performanceData.startHeartbeat();
249
- performanceChart.startRenderLoop();
250
- uni.$emit(DEV_CORE_MESSAGE, {
251
- type: MSG_TYPE.PERF_VISIBLE,
252
- data: performanceVisible.value,
253
- });
254
- } else {
255
- performanceData.stopHeartbeat();
256
- performanceChart.stopRenderLoop();
257
- uni.$emit(DEV_CORE_MESSAGE, {
258
- type: MSG_TYPE.PERF_VISIBLE,
259
- data: false,
260
- });
261
- }
262
- }
263
-
264
- // 根据主题计算颜色
265
- const isDark = computed(() => {
266
- return props.theme === 'dark';
267
- });
268
- const chartBgColor = computed(() =>
269
- isDark.value ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.05)',
270
- );
271
-
272
- const instance = getCurrentInstance();
273
- const stepSize = 5;
274
-
275
- // Hooks
276
- const performanceData = usePerformanceData();
277
- const { fps, cpuLoad, memory, performanceMonitorEnabled, longTasksHistory } =
278
- performanceData;
279
-
280
- const performanceChart = usePerformanceChart({
281
- theme: props.theme,
282
- isDark,
283
- instance,
284
- canvasIdFn: () => 'fpsChartTab',
285
- stepSize,
286
- data: performanceData,
287
- config: {
288
- showFps,
289
- showCpu,
290
- showMemory,
291
- },
292
- props: { mode: 'tab' },
293
- });
294
-
295
- function formatTaskTime(ts: number) {
296
- const date = new Date(ts);
297
- return `${date.getHours().toString().padStart(2, '0')}:${date
298
- .getMinutes()
299
- .toString()
300
- .padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}.${date
301
- .getMilliseconds()
302
- .toString()
303
- .padStart(3, '0')}`;
304
- }
305
-
306
- function getDurationClass(duration: number) {
307
- if (duration > 200) return 'task-danger';
308
- if (duration > 100) return 'task-warning';
309
- return '';
310
- }
311
-
312
- onMounted(() => {
313
- loadSettings();
314
-
315
- performanceChart.initCanvas(() => {
316
- performanceData.initData(
317
- Math.ceil(performanceChart.canvasWidth.value / stepSize) + 4,
318
- );
319
- // 只有在监控开启且窗口可见时,才启动 Tab 的渲染循环
320
- if (performanceMonitorEnabled.value) {
321
- performanceChart.startRenderLoop();
322
- }
323
- });
324
-
325
- // 如果监测状态是开启的,恢复执行
326
- if (performanceMonitorEnabled.value) {
327
- performanceData.startHeartbeat();
328
- // @ts-ignore
329
- if (performanceData.startLogicMonitor) {
330
- // @ts-ignore
331
- performanceData.startLogicMonitor();
332
- }
333
- }
334
-
335
- // 监听核心模块消息
336
- uni.$on(DEV_CORE_MESSAGE, handleCoreMessage);
337
- // 监听监测状态变化(来自 PerformanceWidget)
338
- uni.$on(MSG_TYPE.PERF_MONITOR, onMonitorStateChange);
339
- });
340
-
341
- // 监测状态变化处理(来自 PerformanceWidget 的通知)
342
- function onMonitorStateChange(enabled: boolean) {
343
- performanceMonitorEnabled.value = enabled;
344
- if (!enabled) {
345
- performanceData.stopHeartbeat();
346
- performanceChart.stopRenderLoop();
347
- } else {
348
- // 补全开启逻辑
349
- performanceData.startHeartbeat();
350
- // 只有主窗口可见时才恢复绘制
351
- const { devToolWindowVisible = false } = getDevToolInfo();
352
- if (devToolWindowVisible) {
353
- performanceChart.startRenderLoop();
354
- }
355
- }
356
- }
357
-
358
- // 处理核心模块消息
359
- function handleCoreMessage(msg: string | { type: string; data: any }) {
360
- let type: string | undefined;
361
- let data: any;
362
- try {
363
- const payload = typeof msg === 'string' ? JSON.parse(msg) : msg;
364
- type = payload.type;
365
- data = payload.data;
366
- } catch (_e) {
367
- return;
368
- }
369
-
370
- if (type === MSG_TYPE.WINDOW_VISIBLE) {
371
- onWindowVisibleChange(data);
372
- }
373
- }
374
-
375
- // 窗口可见性变化处理
376
- function onWindowVisibleChange(visible: boolean) {
377
- if (!visible) {
378
- // 窗口关闭时,仅停止 Tab 页面的渲染绘制,节省性能
379
- performanceChart.stopRenderLoop();
380
- // 逻辑层监控和心跳不再随窗口关闭而停止(只要 performanceMonitorEnabled 为 true)
381
- } else {
382
- // 窗口打开时,如果监控开启了,恢复 Tab 的渲染绘制
383
- if (performanceMonitorEnabled.value) {
384
- performanceChart.startRenderLoop();
385
- }
386
- }
387
- }
388
-
389
- onUnmounted(() => {
390
- performanceChart.resetCanvas();
391
- uni.$off(DEV_CORE_MESSAGE, handleCoreMessage);
392
- uni.$off(MSG_TYPE.PERF_MONITOR, onMonitorStateChange);
393
- });
394
- </script>
395
-
396
- <style scoped>
397
- .performance-content {
398
- height: 100%;
399
- overflow: auto;
400
- font-size: var(--dev-tool-base-font-size);
401
- }
402
-
403
- .performance-control {
404
- padding: 0 16px;
405
- }
406
-
407
- .performance-item {
408
- padding: 0 16px;
409
- box-sizing: border-box;
410
- }
411
-
412
- .performance-row {
413
- display: flex;
414
- align-items: center;
415
- justify-content: space-between;
416
- min-height: 18px;
417
- }
418
-
419
- .fps-chart-container {
420
- width: 100%;
421
- flex: 1;
422
- min-height: 50px;
423
- margin-bottom: 4px;
424
- border-radius: 4px;
425
- overflow: hidden;
426
- height: 300px;
427
- }
428
-
429
- .performance-tips {
430
- color: #616161;
431
- font-size: var(--dev-tool-tips-font-size);
432
- margin-bottom: 8px;
433
- }
434
-
435
- .long-tasks-list {
436
- background: var(--dev-tool-bg2-color);
437
- border-radius: 4px;
438
- padding: 8px;
439
- max-height: 200px;
440
- overflow-y: auto;
441
- }
442
-
443
- .long-task-item {
444
- display: flex;
445
- justify-content: space-between;
446
- align-items: center;
447
- padding: 4px 0;
448
- border-bottom: 1px solid var(--dev-tool-border-color);
449
- font-family: monospace;
450
- }
451
-
452
- .long-task-item:last-child {
453
- border-bottom: none;
454
- }
455
-
456
- .task-info {
457
- display: flex;
458
- align-items: center;
459
- font-size: 11px;
460
- }
461
-
462
- .task-type {
463
- font-size: 10px;
464
- padding: 0 4px;
465
- border-radius: 2px;
466
- color: #fff;
467
- background: #909399;
468
- margin-right: 6px;
469
- line-height: 1.4;
470
- }
471
-
472
- .type-logic {
473
- background: #9254de;
474
- }
475
-
476
- .type-ui {
477
- background: #67c23a;
478
- }
479
-
480
- .task-time {
481
- color: #888;
482
- }
483
-
484
- .task-duration {
485
- font-weight: bold;
486
- }
487
-
488
- .task-warning {
489
- color: #e6a23c;
490
- }
491
-
492
- .task-danger {
493
- color: #f56c6c;
494
- }
495
- </style>
1
+ <template>
2
+ <view class="performance-content">
3
+ <view class="performance-control">
4
+ <DevToolTitle>{{ t('performance.title') }}</DevToolTitle>
5
+ </view>
6
+ <view class="performance-item">
7
+ <!-- 图表容器 -->
8
+ <canvas
9
+ canvas-id="fpsChartTab"
10
+ class="fps-chart-container"
11
+ :style="{ backgroundColor: chartBgColor }"
12
+ id="fpsChartTab"></canvas>
13
+ <PerformanceMetrics
14
+ :is-tab="true"
15
+ :fps="fps"
16
+ :cpuLoad="cpuLoad"
17
+ :memory="memory"
18
+ :showFps="showFps"
19
+ :showCpu="showCpu"
20
+ :showMemory="showMemory" />
21
+
22
+ <view class="performance-item-content">
23
+ <!-- 平台限制提示 -->
24
+ <view
25
+ class="performance-tips"
26
+ style="
27
+ color: #e6a23c;
28
+ background: rgb(230 162 60 / 10%);
29
+ padding: 8px;
30
+ border-radius: 4px;
31
+ margin-bottom: 12px;
32
+ font-size: 11px;
33
+ "
34
+ v-if="!isH5">
35
+ {{ t('performance.platformTip') }}
36
+ </view>
37
+ <DevToolTitle>{{ t('performance.settings') }}</DevToolTitle>
38
+ <view class="performance-row">
39
+ <view>{{ t('performance.enable') }}</view>
40
+ <switch
41
+ :checked="performanceMonitorEnabled"
42
+ @change="toggleMonitor"
43
+ :color="themeColor"
44
+ style="transform: scale(0.7)" />
45
+ </view>
46
+ <view class="performance-tips">
47
+ {{ t('performance.enableTip') }}
48
+ </view>
49
+ <view class="performance-row">
50
+ <view>{{ t('performance.widget') }}</view>
51
+ <switch
52
+ :disabled="!performanceMonitorEnabled"
53
+ :checked="performanceVisible"
54
+ @change="togglePerformanceVisible"
55
+ :color="themeColor"
56
+ style="transform: scale(0.7)" />
57
+ </view>
58
+ <view class="performance-tips">
59
+ {{ t('performance.widgetTip') }}
60
+ </view>
61
+ <view class="performance-row">
62
+ <view>{{ t('performance.fps') }}</view>
63
+ <switch
64
+ :disabled="!performanceMonitorEnabled"
65
+ :checked="showFps"
66
+ @change="toggleFps"
67
+ :color="themeColor"
68
+ style="transform: scale(0.7)" />
69
+ </view>
70
+ <view class="performance-tips">
71
+ {{ t('performance.fpsTip') }}
72
+ </view>
73
+ <view class="performance-row">
74
+ <view>{{ t('performance.cpu') }}</view>
75
+ <switch
76
+ :disabled="!performanceMonitorEnabled"
77
+ :checked="showCpu"
78
+ @change="toggleCpu"
79
+ :color="themeColor"
80
+ style="transform: scale(0.7)" />
81
+ </view>
82
+ <view class="performance-tips">
83
+ {{ t('performance.cpuTip') }}
84
+ </view>
85
+ <view class="performance-row">
86
+ <view>{{ t('performance.memory') }}</view>
87
+ <switch
88
+ :disabled="!performanceMonitorEnabled"
89
+ :checked="showMemory"
90
+ @change="toggleMemory"
91
+ :color="themeColor"
92
+ style="transform: scale(0.7)" />
93
+ </view>
94
+ <view class="performance-tips">
95
+ {{ t('performance.memoryTip') }}
96
+ </view>
97
+
98
+ <!-- CPU Profile / Long Tasks List -->
99
+ <view
100
+ class="performance-item-content"
101
+ style="margin-top: 16px"
102
+ v-if="longTasksHistory.length > 0">
103
+ <DevToolTitle>{{ t('performance.longTaskTitle') }}</DevToolTitle>
104
+ <view class="performance-tips">
105
+ {{ t('performance.longTaskTip') }}
106
+ </view>
107
+ <view class="long-tasks-list">
108
+ <view
109
+ v-for="(task, index) in longTasksHistory.slice().reverse()"
110
+ :key="index"
111
+ class="long-task-item">
112
+ <view class="task-info">
113
+ <text
114
+ class="task-type"
115
+ :class="`type-${task.type?.toLowerCase()}`">
116
+ {{
117
+ task.type === 'Logic'
118
+ ? t('performance.logic')
119
+ : t('performance.ui')
120
+ }}
121
+ </text>
122
+ <text class="task-time">{{ formatTaskTime(task.ts) }}</text>
123
+ </view>
124
+ <view
125
+ class="task-duration"
126
+ :class="getDurationClass(task.duration)">
127
+ {{ task.duration }}ms
128
+ </view>
129
+ </view>
130
+ </view>
131
+ </view>
132
+ </view>
133
+ </view>
134
+ </view>
135
+ </template>
136
+
137
+ <script setup lang="ts">
138
+ import { ref, computed, onMounted, onUnmounted, getCurrentInstance } from 'vue';
139
+ import {
140
+ getDevToolInfo,
141
+ setDevToolInfo,
142
+ } from '../../../../modules/devToolInfo';
143
+ import PerformanceMetrics from './modules/PerformanceMetrics.vue';
144
+ import { usePerformanceData } from './modules/usePerformanceData';
145
+ import { usePerformanceChart } from './modules/usePerformanceChart';
146
+ import { MSG_TYPE, DEV_CORE_MESSAGE } from '../../../../const';
147
+ import DevToolTitle from '../DevToolTitle/index.vue';
148
+ import { useI18n } from '../../../../i18n';
149
+ import { getThemeMainColor } from '../../../styles/theme';
150
+ const { t } = useI18n();
151
+ const themeColor = computed(() => getThemeMainColor(props.theme));
152
+
153
+ // 无需声明 renderScript
154
+
155
+ const props = withDefaults(
156
+ defineProps<{
157
+ mode?: 'tab';
158
+ zIndex?: number;
159
+ customStyle?: Record<string, any>;
160
+ contentHeight?: number;
161
+ theme?: string;
162
+ }>(),
163
+ {
164
+ zIndex: 1000,
165
+ theme: 'light',
166
+ },
167
+ );
168
+
169
+ const showFps = ref(true);
170
+ const showCpu = ref(true);
171
+ const showMemory = ref(true);
172
+ const performanceVisible = ref(false);
173
+ const isH5 = ref(false);
174
+
175
+ function loadSettings() {
176
+ // #ifdef H5
177
+ isH5.value = true;
178
+ // #endif
179
+
180
+ const info = getDevToolInfo();
181
+ if (info && info.performanceSettings) {
182
+ showFps.value = info.performanceSettings.showFps ?? true;
183
+ showCpu.value = info.performanceSettings.showCpu ?? true;
184
+ showMemory.value = info.performanceSettings.showMemory ?? true;
185
+ performanceMonitorEnabled.value =
186
+ info.performanceSettings.enableMonitor ?? false;
187
+ }
188
+ if (info && info.performanceVisible !== undefined) {
189
+ performanceVisible.value = info.performanceVisible;
190
+ }
191
+ }
192
+
193
+ function saveSettings() {
194
+ setDevToolInfo({
195
+ performanceSettings: {
196
+ showFps: showFps.value,
197
+ showCpu: showCpu.value,
198
+ showMemory: showMemory.value,
199
+ enableMonitor: performanceMonitorEnabled.value,
200
+ },
201
+ performanceVisible: performanceVisible.value,
202
+ });
203
+ }
204
+
205
+ function toggleFps(e: any) {
206
+ showFps.value = e.detail.value;
207
+ saveSettings();
208
+ }
209
+
210
+ function toggleCpu(e: any) {
211
+ showCpu.value = e.detail.value;
212
+ saveSettings();
213
+ }
214
+
215
+ function toggleMemory(e: any) {
216
+ showMemory.value = e.detail.value;
217
+ saveSettings();
218
+ }
219
+
220
+ function togglePerformanceVisible(e: any) {
221
+ performanceVisible.value = e.detail.value;
222
+
223
+ // 如果关闭悬浮窗,同时关闭监测功能
224
+ if (!performanceVisible.value && performanceMonitorEnabled.value) {
225
+ performanceMonitorEnabled.value = false;
226
+ performanceData.stopHeartbeat();
227
+ performanceChart.stopRenderLoop();
228
+ // 通知 PerformanceWidget 停止监测
229
+ uni.$emit(MSG_TYPE.PERF_MONITOR, false);
230
+ }
231
+
232
+ saveSettings();
233
+ // 通知 DevTool 组件更新性能弹窗可见性
234
+ uni.$emit(DEV_CORE_MESSAGE, {
235
+ type: MSG_TYPE.PERF_VISIBLE,
236
+ data: performanceVisible.value,
237
+ });
238
+ }
239
+
240
+ function toggleMonitor(e: any) {
241
+ performanceMonitorEnabled.value = e.detail.value;
242
+ if (!performanceMonitorEnabled.value) {
243
+ performanceVisible.value = false;
244
+ }
245
+ saveSettings();
246
+ uni.$emit(MSG_TYPE.PERF_MONITOR, performanceMonitorEnabled.value);
247
+ if (performanceMonitorEnabled.value) {
248
+ performanceData.initData(
249
+ Math.ceil(performanceChart.canvasWidth.value / stepSize) + 4,
250
+ );
251
+ performanceData.startHeartbeat();
252
+ performanceChart.startRenderLoop();
253
+ uni.$emit(DEV_CORE_MESSAGE, {
254
+ type: MSG_TYPE.PERF_VISIBLE,
255
+ data: performanceVisible.value,
256
+ });
257
+ } else {
258
+ performanceData.stopHeartbeat();
259
+ performanceChart.stopRenderLoop();
260
+ uni.$emit(DEV_CORE_MESSAGE, {
261
+ type: MSG_TYPE.PERF_VISIBLE,
262
+ data: false,
263
+ });
264
+ }
265
+ }
266
+
267
+ // 根据主题计算颜色
268
+ const isDark = computed(() => {
269
+ return props.theme === 'dark';
270
+ });
271
+ const chartBgColor = computed(() =>
272
+ isDark.value ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.05)',
273
+ );
274
+
275
+ const instance = getCurrentInstance();
276
+ const stepSize = 5;
277
+
278
+ // Hooks
279
+ const performanceData = usePerformanceData();
280
+ const { fps, cpuLoad, memory, performanceMonitorEnabled, longTasksHistory } =
281
+ performanceData;
282
+
283
+ const performanceChart = usePerformanceChart({
284
+ theme: props.theme,
285
+ isDark,
286
+ instance,
287
+ canvasIdFn: () => 'fpsChartTab',
288
+ stepSize,
289
+ data: performanceData,
290
+ config: {
291
+ showFps,
292
+ showCpu,
293
+ showMemory,
294
+ },
295
+ props: { mode: 'tab' },
296
+ });
297
+
298
+ function formatTaskTime(ts: number) {
299
+ const date = new Date(ts);
300
+ return `${date.getHours().toString().padStart(2, '0')}:${date
301
+ .getMinutes()
302
+ .toString()
303
+ .padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}.${date
304
+ .getMilliseconds()
305
+ .toString()
306
+ .padStart(3, '0')}`;
307
+ }
308
+
309
+ function getDurationClass(duration: number) {
310
+ if (duration > 200) return 'task-danger';
311
+ if (duration > 100) return 'task-warning';
312
+ return '';
313
+ }
314
+
315
+ onMounted(() => {
316
+ loadSettings();
317
+
318
+ performanceChart.initCanvas(() => {
319
+ performanceData.initData(
320
+ Math.ceil(performanceChart.canvasWidth.value / stepSize) + 4,
321
+ );
322
+ // 只有在监控开启且窗口可见时,才启动 Tab 的渲染循环
323
+ if (performanceMonitorEnabled.value) {
324
+ performanceChart.startRenderLoop();
325
+ }
326
+ });
327
+
328
+ // 如果监测状态是开启的,恢复执行
329
+ if (performanceMonitorEnabled.value) {
330
+ performanceData.startHeartbeat();
331
+ // @ts-ignore
332
+ if (performanceData.startLogicMonitor) {
333
+ // @ts-ignore
334
+ performanceData.startLogicMonitor();
335
+ }
336
+ }
337
+
338
+ // 监听核心模块消息
339
+ uni.$on(DEV_CORE_MESSAGE, handleCoreMessage);
340
+ // 监听监测状态变化(来自 PerformanceWidget)
341
+ uni.$on(MSG_TYPE.PERF_MONITOR, onMonitorStateChange);
342
+ });
343
+
344
+ // 监测状态变化处理(来自 PerformanceWidget 的通知)
345
+ function onMonitorStateChange(enabled: boolean) {
346
+ performanceMonitorEnabled.value = enabled;
347
+ if (!enabled) {
348
+ performanceData.stopHeartbeat();
349
+ performanceChart.stopRenderLoop();
350
+ } else {
351
+ // 补全开启逻辑
352
+ performanceData.startHeartbeat();
353
+ // 只有主窗口可见时才恢复绘制
354
+ const { devToolWindowVisible = false } = getDevToolInfo();
355
+ if (devToolWindowVisible) {
356
+ performanceChart.startRenderLoop();
357
+ }
358
+ }
359
+ }
360
+
361
+ // 处理核心模块消息
362
+ function handleCoreMessage(msg: string | { type: string; data: any }) {
363
+ let type: string | undefined;
364
+ let data: any;
365
+ try {
366
+ const payload = typeof msg === 'string' ? JSON.parse(msg) : msg;
367
+ type = payload.type;
368
+ data = payload.data;
369
+ } catch (_e) {
370
+ return;
371
+ }
372
+
373
+ if (type === MSG_TYPE.WINDOW_VISIBLE) {
374
+ onWindowVisibleChange(data);
375
+ }
376
+ }
377
+
378
+ // 窗口可见性变化处理
379
+ function onWindowVisibleChange(visible: boolean) {
380
+ if (!visible) {
381
+ // 窗口关闭时,仅停止 Tab 页面的渲染绘制,节省性能
382
+ performanceChart.stopRenderLoop();
383
+ // 逻辑层监控和心跳不再随窗口关闭而停止(只要 performanceMonitorEnabled 为 true)
384
+ } else {
385
+ // 窗口打开时,如果监控开启了,恢复 Tab 的渲染绘制
386
+ if (performanceMonitorEnabled.value) {
387
+ performanceChart.startRenderLoop();
388
+ }
389
+ }
390
+ }
391
+
392
+ onUnmounted(() => {
393
+ performanceChart.resetCanvas();
394
+ uni.$off(DEV_CORE_MESSAGE, handleCoreMessage);
395
+ uni.$off(MSG_TYPE.PERF_MONITOR, onMonitorStateChange);
396
+ });
397
+ </script>
398
+
399
+ <style scoped>
400
+ .performance-content {
401
+ height: 100%;
402
+ overflow: auto;
403
+ font-size: var(--dev-tool-base-font-size);
404
+ }
405
+
406
+ .performance-control {
407
+ padding: 0 16px;
408
+ }
409
+
410
+ .performance-item {
411
+ padding: 0 16px;
412
+ box-sizing: border-box;
413
+ }
414
+
415
+ .performance-row {
416
+ display: flex;
417
+ align-items: center;
418
+ justify-content: space-between;
419
+ min-height: 18px;
420
+ }
421
+
422
+ .fps-chart-container {
423
+ width: 100%;
424
+ flex: 1;
425
+ min-height: 50px;
426
+ margin-bottom: 4px;
427
+ border-radius: 4px;
428
+ overflow: hidden;
429
+ height: 300px;
430
+ }
431
+
432
+ .performance-tips {
433
+ color: #616161;
434
+ font-size: var(--dev-tool-tips-font-size);
435
+ margin-bottom: 8px;
436
+ }
437
+
438
+ .long-tasks-list {
439
+ background: var(--dev-tool-bg2-color);
440
+ border-radius: 4px;
441
+ padding: 8px;
442
+ max-height: 200px;
443
+ overflow-y: auto;
444
+ }
445
+
446
+ .long-task-item {
447
+ display: flex;
448
+ justify-content: space-between;
449
+ align-items: center;
450
+ padding: 4px 0;
451
+ border-bottom: 1px solid var(--dev-tool-border-color);
452
+ font-family: monospace;
453
+ }
454
+
455
+ .long-task-item:last-child {
456
+ border-bottom: none;
457
+ }
458
+
459
+ .task-info {
460
+ display: flex;
461
+ align-items: center;
462
+ font-size: 11px;
463
+ }
464
+
465
+ .task-type {
466
+ font-size: 10px;
467
+ padding: 0 4px;
468
+ border-radius: 2px;
469
+ color: #fff;
470
+ background: #909399;
471
+ margin-right: 6px;
472
+ line-height: 1.4;
473
+ }
474
+
475
+ .type-logic {
476
+ background: #9254de;
477
+ }
478
+
479
+ .type-ui {
480
+ background: #67c23a;
481
+ }
482
+
483
+ .task-time {
484
+ color: #888;
485
+ }
486
+
487
+ .task-duration {
488
+ font-weight: bold;
489
+ }
490
+
491
+ .task-warning {
492
+ color: #e6a23c;
493
+ }
494
+
495
+ .task-danger {
496
+ color: #f56c6c;
497
+ }
498
+ </style>