vite-uni-dev-tool 0.0.48 → 1.0.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 (292) hide show
  1. package/README.md +20 -0
  2. package/dist/const.cjs +1 -0
  3. package/dist/const.d.ts +78 -161
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -47
  6. package/dist/core-shared.d.ts +44 -0
  7. package/dist/core-shared.d.ts.map +1 -0
  8. package/dist/core-shared.js +1 -0
  9. package/dist/core.d.ts +2 -40
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +4 -159
  12. package/dist/i18n/index.cjs +1 -0
  13. package/dist/i18n/index.d.ts +9 -0
  14. package/dist/i18n/index.d.ts.map +1 -0
  15. package/dist/i18n/index.js +1 -0
  16. package/dist/i18n/instance.cjs +1 -0
  17. package/dist/i18n/instance.d.ts +15 -0
  18. package/dist/i18n/instance.d.ts.map +1 -0
  19. package/dist/i18n/instance.js +1 -0
  20. package/dist/i18n/locales/en.cjs +1 -0
  21. package/dist/i18n/locales/en.d.ts +470 -0
  22. package/dist/i18n/locales/en.d.ts.map +1 -0
  23. package/dist/i18n/locales/en.js +1 -0
  24. package/dist/i18n/locales/zh-Hans.cjs +1 -0
  25. package/dist/i18n/locales/zh-Hans.d.ts +476 -0
  26. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  27. package/dist/i18n/locales/zh-Hans.js +1 -0
  28. package/dist/index.cjs +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/modules/devConsole/index.cjs +4 -0
  32. package/dist/{devConsole → modules/devConsole}/index.d.ts +1 -1
  33. package/dist/modules/devConsole/index.d.ts.map +1 -0
  34. package/dist/modules/devConsole/index.js +4 -0
  35. package/dist/modules/devEvent/index.cjs +5 -0
  36. package/dist/modules/devEvent/index.d.ts +115 -0
  37. package/dist/modules/devEvent/index.d.ts.map +1 -0
  38. package/dist/modules/devEvent/index.js +5 -0
  39. package/dist/modules/devIntercept/index.cjs +13 -0
  40. package/dist/modules/devIntercept/index.d.ts +71 -0
  41. package/dist/modules/devIntercept/index.d.ts.map +1 -0
  42. package/dist/modules/devIntercept/index.js +13 -0
  43. package/dist/modules/devStore/index.cjs +1 -0
  44. package/dist/modules/devStore/index.d.ts +159 -0
  45. package/dist/modules/devStore/index.d.ts.map +1 -0
  46. package/dist/modules/devStore/index.js +1 -0
  47. package/dist/modules/devToolInfo/index.cjs +1 -0
  48. package/dist/modules/devToolInfo/index.d.ts +27 -0
  49. package/dist/modules/devToolInfo/index.d.ts.map +1 -0
  50. package/dist/modules/devToolInfo/index.js +1 -0
  51. package/dist/plugins/uniDevTool/transform/transformApp.cjs +44 -0
  52. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +1 -1
  53. package/dist/plugins/uniDevTool/transform/transformApp.js +17 -17
  54. package/dist/plugins/uniDevTool/transform/transformMain.cjs +3 -0
  55. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +1 -1
  56. package/dist/plugins/uniDevTool/transform/transformMain.js +3 -3
  57. package/dist/plugins/uniDevTool/transform/transformVue.cjs +41 -0
  58. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +1 -2
  59. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +1 -1
  60. package/dist/plugins/uniDevTool/transform/transformVue.js +32 -19
  61. package/dist/plugins/uniDevTool/uniDevTool.cjs +5 -0
  62. package/dist/plugins/uniDevTool/uniDevTool.d.ts +3 -11
  63. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +1 -1
  64. package/dist/plugins/uniDevTool/uniDevTool.js +3 -3
  65. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.cjs +19 -0
  66. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +1 -1
  67. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.js +11 -19
  68. package/dist/plugins/uniParseStock/index.d.ts +10 -0
  69. package/dist/plugins/uniParseStock/index.d.ts.map +1 -0
  70. package/dist/plugins/utils/index.cjs +2 -0
  71. package/dist/plugins/utils/index.d.ts +1 -3
  72. package/dist/plugins/utils/index.d.ts.map +1 -1
  73. package/dist/plugins/utils/index.js +2 -2
  74. package/dist/shims-uni.d.ts +140 -0
  75. package/dist/type.d.ts +174 -16
  76. package/dist/type.d.ts.map +1 -1
  77. package/dist/utils/array.cjs +1 -0
  78. package/dist/utils/array.d.ts.map +1 -1
  79. package/dist/utils/array.js +1 -12
  80. package/dist/utils/date.cjs +1 -0
  81. package/dist/utils/date.d.ts.map +1 -1
  82. package/dist/utils/date.js +1 -59
  83. package/dist/utils/file.cjs +1 -0
  84. package/dist/utils/file.d.ts.map +1 -1
  85. package/dist/utils/file.js +1 -85
  86. package/dist/utils/function.cjs +1 -0
  87. package/dist/utils/function.d.ts +13 -0
  88. package/dist/utils/function.d.ts.map +1 -1
  89. package/dist/utils/function.js +1 -68
  90. package/dist/utils/index.cjs +1 -0
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +1 -63
  93. package/dist/utils/ip.cjs +1 -0
  94. package/dist/utils/ip.d.ts +1 -1
  95. package/dist/utils/ip.d.ts.map +1 -1
  96. package/dist/utils/ip.js +1 -45
  97. package/dist/utils/language.cjs +1 -0
  98. package/dist/utils/language.d.ts +2 -1
  99. package/dist/utils/language.d.ts.map +1 -1
  100. package/dist/utils/language.js +1 -63
  101. package/dist/utils/object.cjs +1 -0
  102. package/dist/utils/object.d.ts +4 -5
  103. package/dist/utils/object.d.ts.map +1 -1
  104. package/dist/utils/object.js +1 -136
  105. package/dist/utils/openLink.cjs +1 -0
  106. package/dist/utils/openLink.d.ts.map +1 -1
  107. package/dist/utils/openLink.js +1 -28
  108. package/dist/utils/page.cjs +1 -0
  109. package/dist/utils/page.d.ts.map +1 -1
  110. package/dist/utils/page.js +1 -7
  111. package/dist/utils/platform.cjs +1 -0
  112. package/dist/utils/platform.d.ts.map +1 -1
  113. package/dist/utils/platform.js +1 -17
  114. package/dist/utils/string.cjs +1 -0
  115. package/dist/utils/string.d.ts.map +1 -1
  116. package/dist/utils/string.js +1 -114
  117. package/dist/utils/utils.cjs +1 -0
  118. package/dist/utils/utils.d.ts +1 -1
  119. package/dist/utils/utils.d.ts.map +1 -1
  120. package/dist/utils/utils.js +1 -126
  121. package/dist/v3/AppTransition/index.vue +170 -0
  122. package/dist/v3/AutoSizer/index.vue +4 -5
  123. package/dist/v3/AutoSizer/index1.vue +4 -6
  124. package/dist/v3/AutoSizer/utils.ts +1 -1
  125. package/dist/v3/CaptureScreen/index.vue +19 -8
  126. package/dist/v3/CircularButton/index.vue +64 -13
  127. package/dist/v3/ConsoleList/ConsoleItem.vue +56 -5
  128. package/dist/v3/ConsoleList/RunJSInput.vue +10 -6
  129. package/dist/v3/ConsoleList/index.vue +51 -35
  130. package/dist/v3/CustomSwiper/CustomSwiperItem.vue +49 -0
  131. package/dist/v3/CustomSwiper/index.vue +104 -0
  132. package/dist/v3/DevTool/fps-collector.render.ts +148 -0
  133. package/dist/v3/DevTool/index.vue +209 -102
  134. package/dist/v3/DevToolButton/index.vue +40 -59
  135. package/dist/v3/DevToolTitle/index.vue +4 -1
  136. package/dist/v3/DevToolWindow/DevToolOverlay.vue +182 -0
  137. package/dist/v3/DevToolWindow/const.ts +47 -69
  138. package/dist/v3/DevToolWindow/hooks/dataUtils.ts +48 -0
  139. package/dist/v3/DevToolWindow/hooks/useDevToolData.ts +338 -0
  140. package/dist/v3/DevToolWindow/hooks/useDevToolHandlers.ts +549 -0
  141. package/dist/v3/DevToolWindow/hooks/useDevToolOverlay.ts +184 -0
  142. package/dist/v3/DevToolWindow/index.css +89 -0
  143. package/dist/v3/DevToolWindow/index.vue +800 -1450
  144. package/dist/v3/DraggableContainer/index.vue +456 -0
  145. package/dist/v3/ElEvent/ElEventItem.vue +4 -3
  146. package/dist/v3/ElEvent/index.vue +26 -9
  147. package/dist/v3/Empty/index.vue +1 -0
  148. package/dist/v3/FilterInput/index.vue +8 -22
  149. package/dist/v3/FilterSelect/index.vue +37 -24
  150. package/dist/v3/Instance/components/InstanceTreeNode.vue +265 -0
  151. package/dist/v3/Instance/flatten.ts +226 -0
  152. package/dist/v3/Instance/index.vue +94 -0
  153. package/dist/v3/Instance/registry.ts +49 -0
  154. package/dist/v3/Instance/transformTree.ts +375 -0
  155. package/dist/v3/Instance/transformTreeCtx.ts +268 -0
  156. package/dist/v3/{InstanceTree → Instance}/typing.d.ts +15 -2
  157. package/dist/v3/InstanceDetail/index.vue +433 -44
  158. package/dist/v3/JsonDetail/index.vue +12 -8
  159. package/dist/v3/JsonPretty/components/Brackets/index.vue +1 -0
  160. package/dist/v3/JsonPretty/components/Carets/index.vue +2 -1
  161. package/dist/v3/JsonPretty/components/CheckController/index.vue +26 -15
  162. package/dist/v3/JsonPretty/components/TreeNode/index.vue +42 -20
  163. package/dist/v3/JsonPretty/index.vue +60 -37
  164. package/dist/v3/JsonPretty/utils/index.ts +41 -44
  165. package/dist/v3/MovableContainer/index.vue +89 -0
  166. package/dist/v3/NFCList/NFCItem.vue +14 -14
  167. package/dist/v3/NFCList/NFCTool.vue +99 -81
  168. package/dist/v3/NFCList/index.vue +14 -10
  169. package/dist/v3/NetworkList/InterceptConfig.vue +154 -364
  170. package/dist/v3/NetworkList/InterceptItem.vue +14 -6
  171. package/dist/v3/NetworkList/NetworkDetail.vue +34 -29
  172. package/dist/v3/NetworkList/NetworkIntercept.vue +11 -8
  173. package/dist/v3/NetworkList/NetworkItem.vue +27 -11
  174. package/dist/v3/NetworkList/NetworkSend.vue +132 -290
  175. package/dist/v3/NetworkList/hooks/useNetworkForm.ts +86 -0
  176. package/dist/v3/NetworkList/index.vue +32 -24
  177. package/dist/v3/NetworkList/utils.ts +101 -0
  178. package/dist/v3/Performance/index.vue +495 -0
  179. package/dist/v3/Performance/modules/PerformanceMetrics.vue +153 -0
  180. package/dist/v3/Performance/modules/PerformanceWidget.vue +249 -0
  181. package/dist/v3/Performance/modules/usePerformanceChart.ts +460 -0
  182. package/dist/v3/Performance/modules/usePerformanceData.ts +258 -0
  183. package/dist/v3/Pick/index.vue +322 -0
  184. package/dist/v3/PiniaList/index.vue +38 -17
  185. package/dist/v3/RouteList/index.vue +32 -15
  186. package/dist/v3/RunJS/index.vue +30 -10
  187. package/dist/v3/ScanCodeList/ScanCodeItem.vue +2 -9
  188. package/dist/v3/ScanCodeList/index.vue +12 -9
  189. package/dist/v3/SettingButton/index.vue +45 -0
  190. package/dist/v3/SettingList/index.css +120 -0
  191. package/dist/v3/SettingList/index.vue +96 -537
  192. package/dist/v3/SettingList/modules/SettingDevTool.vue +208 -0
  193. package/dist/v3/SettingList/modules/SettingInfo.vue +119 -0
  194. package/dist/v3/SettingList/modules/SettingLanguage.vue +74 -0
  195. package/dist/v3/SettingList/modules/SettingLog.vue +230 -0
  196. package/dist/v3/SettingList/modules/SettingNetwork.vue +120 -0
  197. package/dist/v3/SettingList/modules/SettingTheme.vue +312 -0
  198. package/dist/v3/SourceCode/Line.vue +15 -2
  199. package/dist/v3/SourceCode/index.vue +25 -24
  200. package/dist/v3/SourceCode/parseCode.ts +114 -56
  201. package/dist/v3/StorageList/index.vue +33 -33
  202. package/dist/v3/Tabs/index.vue +31 -28
  203. package/dist/v3/Tag/index.vue +39 -20
  204. package/dist/v3/TransferList/TransferDetail.vue +268 -0
  205. package/dist/v3/TransferList/TransferItem.vue +125 -0
  206. package/dist/v3/TransferList/index.vue +181 -0
  207. package/dist/v3/UniEvent/UniEventItem.vue +1 -0
  208. package/dist/v3/UniEvent/index.vue +28 -29
  209. package/dist/v3/{VirtualListPro → VirtualList}/AutoSize.vue +1 -1
  210. package/dist/v3/VirtualList/index.vue +382 -82
  211. package/dist/v3/VuexList/index.vue +38 -17
  212. package/dist/v3/WebSocket/WebSocketDetail.vue +142 -80
  213. package/dist/v3/WebSocket/WebSocketItem.vue +10 -4
  214. package/dist/v3/WebSocket/index.vue +44 -30
  215. package/dist/v3/hooks/useNFC/index.ts +6 -6
  216. package/dist/v3/hooks/useNFC/typing.d.ts +2 -2
  217. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +215 -626
  218. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +54 -85
  219. package/dist/v3/hooks/useNFC/utils.ts +3 -3
  220. package/dist/v3/hooks/useRequest/index.ts +2 -2
  221. package/dist/v3/hooks/useScanCode/index.ts +10 -8
  222. package/dist/v3/styles/theme.css +290 -0
  223. package/dist/v3/styles/theme.ts +12 -0
  224. package/package.json +25 -5
  225. package/dist/devConsole/index.d.ts.map +0 -1
  226. package/dist/devConsole/index.js +0 -273
  227. package/dist/devEvent/index.d.ts +0 -328
  228. package/dist/devEvent/index.d.ts.map +0 -1
  229. package/dist/devEvent/index.js +0 -697
  230. package/dist/devEventBus/index.d.ts +0 -42
  231. package/dist/devEventBus/index.d.ts.map +0 -1
  232. package/dist/devEventBus/index.js +0 -70
  233. package/dist/devIntercept/index.d.ts +0 -281
  234. package/dist/devIntercept/index.d.ts.map +0 -1
  235. package/dist/devIntercept/index.js +0 -949
  236. package/dist/devRunJS/index.d.ts +0 -67
  237. package/dist/devRunJS/index.d.ts.map +0 -1
  238. package/dist/devStore/index.d.ts +0 -199
  239. package/dist/devStore/index.d.ts.map +0 -1
  240. package/dist/devStore/index.js +0 -562
  241. package/dist/devToolInfo/index.d.ts +0 -17
  242. package/dist/devToolInfo/index.d.ts.map +0 -1
  243. package/dist/devToolInfo/index.js +0 -15
  244. package/dist/v3/AutoSizer/utils.d.ts +0 -5
  245. package/dist/v3/AutoSizer/utils.d.ts.map +0 -1
  246. package/dist/v3/ConsoleList/staticTips.d.ts +0 -13
  247. package/dist/v3/ConsoleList/staticTips.d.ts.map +0 -1
  248. package/dist/v3/DevToolWindow/const.d.ts +0 -46
  249. package/dist/v3/DevToolWindow/const.d.ts.map +0 -1
  250. package/dist/v3/InstanceTree/components/InstanceTreeNode.vue +0 -81
  251. package/dist/v3/InstanceTree/flatten.d.ts +0 -10
  252. package/dist/v3/InstanceTree/flatten.d.ts.map +0 -1
  253. package/dist/v3/InstanceTree/flatten.ts +0 -75
  254. package/dist/v3/InstanceTree/index.vue +0 -51
  255. package/dist/v3/InstanceTree/transformTree.d.ts +0 -17
  256. package/dist/v3/InstanceTree/transformTree.d.ts.map +0 -1
  257. package/dist/v3/InstanceTree/transformTree.ts +0 -237
  258. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts +0 -4
  259. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts.map +0 -1
  260. package/dist/v3/JsonPretty/hooks/useError.d.ts +0 -8
  261. package/dist/v3/JsonPretty/hooks/useError.d.ts.map +0 -1
  262. package/dist/v3/JsonPretty/type.d.ts +0 -94
  263. package/dist/v3/JsonPretty/type.d.ts.map +0 -1
  264. package/dist/v3/JsonPretty/utils/index.d.ts +0 -10
  265. package/dist/v3/JsonPretty/utils/index.d.ts.map +0 -1
  266. package/dist/v3/NFCList/const.d.ts +0 -13
  267. package/dist/v3/NFCList/const.d.ts.map +0 -1
  268. package/dist/v3/NetworkList/const.d.ts +0 -5
  269. package/dist/v3/NetworkList/const.d.ts.map +0 -1
  270. package/dist/v3/SourceCode/parseCode.d.ts +0 -27
  271. package/dist/v3/SourceCode/parseCode.d.ts.map +0 -1
  272. package/dist/v3/UploadList/UploadDetail.vue +0 -255
  273. package/dist/v3/UploadList/UploadItem.vue +0 -122
  274. package/dist/v3/UploadList/index.vue +0 -125
  275. package/dist/v3/VirtualListPro/index.vue +0 -229
  276. package/dist/v3/hooks/useContainerStyle.d.ts +0 -15
  277. package/dist/v3/hooks/useContainerStyle.d.ts.map +0 -1
  278. package/dist/v3/hooks/useNFC/index.d.ts +0 -5
  279. package/dist/v3/hooks/useNFC/index.d.ts.map +0 -1
  280. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts +0 -2
  281. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts.map +0 -1
  282. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts +0 -2
  283. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts.map +0 -1
  284. package/dist/v3/hooks/useNFC/utils.d.ts +0 -95
  285. package/dist/v3/hooks/useNFC/utils.d.ts.map +0 -1
  286. package/dist/v3/hooks/useRequest/index.d.ts +0 -126
  287. package/dist/v3/hooks/useRequest/index.d.ts.map +0 -1
  288. package/dist/v3/hooks/useRequest/utils.d.ts +0 -35
  289. package/dist/v3/hooks/useRequest/utils.d.ts.map +0 -1
  290. package/dist/v3/hooks/useScanCode/index.d.ts +0 -36
  291. package/dist/v3/hooks/useScanCode/index.d.ts.map +0 -1
  292. /package/dist/v3/{VirtualListPro → VirtualList}/readme.md +0 -0
@@ -0,0 +1,104 @@
1
+ <template>
2
+ <view
3
+ class="custom-swiper"
4
+ @touchstart="onTouchStart"
5
+ @touchend="onTouchEnd"
6
+ @mousedown="onMouseDown"
7
+ @mouseup="onMouseUp"
8
+ @mouseleave="onMouseLeave">
9
+ <view class="custom-swiper-wrapper" :style="wrapperStyle">
10
+ <slot></slot>
11
+ </view>
12
+ </view>
13
+ </template>
14
+ <script lang="ts">
15
+ export default {
16
+ options: {
17
+ virtualHost: true, // 开启虚拟节点,使组件标签不渲染,属性直接透传
18
+ },
19
+ };
20
+ </script>
21
+ <script setup lang="ts">
22
+ import { computed, ref } from 'vue';
23
+
24
+ const props = defineProps<{
25
+ modelValue: number;
26
+ itemCount: number;
27
+ }>();
28
+
29
+ const emit = defineEmits<{
30
+ (e: 'update:modelValue', value: number): void;
31
+ (e: 'change', value: number): void;
32
+ }>();
33
+
34
+ const touchStart = ref({ x: 0, y: 0 });
35
+
36
+ const isDragging = ref(false);
37
+
38
+ const wrapperStyle = computed(() => ({
39
+ transform: `translateX(-${props.modelValue * 100}%)`,
40
+ }));
41
+
42
+ // 统一处理滑动逻辑
43
+ function handleSwipe(deltaX: number, deltaY: number) {
44
+ if (Math.abs(deltaX) > 50 && Math.abs(deltaX) > Math.abs(deltaY)) {
45
+ if (deltaX > 0 && props.modelValue > 0) {
46
+ const next = props.modelValue - 1;
47
+ emit('update:modelValue', next);
48
+ emit('change', next);
49
+ } else if (deltaX < 0 && props.modelValue < props.itemCount - 1) {
50
+ const next = props.modelValue + 1;
51
+ emit('update:modelValue', next);
52
+ emit('change', next);
53
+ }
54
+ }
55
+ }
56
+
57
+ // 触摸事件处理
58
+ function onTouchStart(e: TouchEvent) {
59
+ const touch = e.touches[0];
60
+ touchStart.value = { x: touch.clientX, y: touch.clientY };
61
+ }
62
+
63
+ function onTouchEnd(e: TouchEvent) {
64
+ const touch = e.changedTouches[0];
65
+ const deltaX = touch.clientX - touchStart.value.x;
66
+ const deltaY = touch.clientY - touchStart.value.y;
67
+ handleSwipe(deltaX, deltaY);
68
+ }
69
+
70
+ // 鼠标事件处理
71
+ function onMouseDown(e: MouseEvent) {
72
+ isDragging.value = true;
73
+ touchStart.value = { x: e.clientX, y: e.clientY };
74
+ }
75
+
76
+ function onMouseUp(e: MouseEvent) {
77
+ if (!isDragging.value) return;
78
+ isDragging.value = false;
79
+ const deltaX = e.clientX - touchStart.value.x;
80
+ const deltaY = e.clientY - touchStart.value.y;
81
+ handleSwipe(deltaX, deltaY);
82
+ }
83
+
84
+ function onMouseLeave() {
85
+ isDragging.value = false;
86
+ }
87
+ </script>
88
+
89
+ <style scoped>
90
+ .custom-swiper {
91
+ width: 100%;
92
+ height: 100%;
93
+ overflow: hidden;
94
+ position: relative;
95
+ }
96
+
97
+ .custom-swiper-wrapper {
98
+ display: flex;
99
+ width: 100%;
100
+ height: 100%;
101
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
102
+ will-change: transform;
103
+ }
104
+ </style>
@@ -0,0 +1,148 @@
1
+ // @ts-nocheck
2
+ /* global uni */
3
+ import { MSG_TYPE } from '../../const';
4
+ import { raf, caf } from '../../utils';
5
+
6
+ export default {
7
+ data() {
8
+ return {
9
+ innerIsActive: true, // 默认设为 true,确保即便逻辑层同步失败也能运行
10
+ longTasks: [], // 缓存周期内的长任务
11
+ };
12
+ },
13
+ mounted() {
14
+ if (typeof uni !== 'undefined' && uni.$on) {
15
+ uni?.$on(MSG_TYPE.PERF_MONITOR, this.perfMonitor);
16
+ }
17
+
18
+ // 初始化 PerformanceObserver 监控长任务 (CPU Profile 核心)
19
+ if (typeof PerformanceObserver !== 'undefined') {
20
+ try {
21
+ this.observer = new PerformanceObserver((list) => {
22
+ list.getEntries().forEach((entry) => {
23
+ // 记录长任务:发生时间(转换为绝对时间戳)和 持续时间
24
+ this.longTasks.push({
25
+ ts: Date.now() - (performance.now() - entry.startTime),
26
+ duration: Math.round(entry.duration),
27
+ type: 'UI',
28
+ });
29
+ });
30
+ });
31
+ this.observer.observe({ entryTypes: ['longtask'] });
32
+ } catch (_e) {
33
+ console.warn('PerformanceObserver longtask not supported');
34
+ }
35
+ }
36
+ },
37
+ methods: {
38
+ perfMonitor(enabled) {
39
+ if (enabled) {
40
+ this.startFpsLoop();
41
+ } else {
42
+ this.stopFpsLoop();
43
+ }
44
+ },
45
+ receiveActive(newValue) {
46
+ this.innerIsActive = newValue;
47
+ },
48
+ startFpsLoop() {
49
+ // 兼容性计时方案:优先使用高精度性能计时,回退至基础 Date 计时
50
+ const getTime = () => {
51
+ if (typeof performance !== 'undefined' && performance.now) {
52
+ return performance.now();
53
+ }
54
+ return Date.now();
55
+ };
56
+
57
+ let lastTimestamp = getTime();
58
+ let startTime = lastTimestamp;
59
+ let frameCount = 0;
60
+ let totalJank = 0;
61
+ const idealDelta = 16.67;
62
+
63
+ const loop = () => {
64
+ const now = getTime();
65
+ const delta = Math.max(0, now - lastTimestamp);
66
+ lastTimestamp = now;
67
+
68
+ frameCount++;
69
+
70
+ // 判定卡顿 (Jank)
71
+ if (delta > 50) {
72
+ // 只要 delta 超过 100ms(或者 50ms),无论是否有 observer,都记录一个 UI Jank
73
+ // 这样可以确保在 observer 失效时依然有数据
74
+ if (delta > 100 || !this.observer) {
75
+ this.longTasks.push({
76
+ ts: Date.now(),
77
+ duration: Math.round(delta),
78
+ type: 'UI',
79
+ });
80
+ }
81
+ totalJank += delta - idealDelta;
82
+ } else if (delta > 20) {
83
+ totalJank += delta - idealDelta;
84
+ }
85
+
86
+ const elapsed = now - startTime;
87
+
88
+ // 到达一秒采样周期
89
+ if (elapsed >= 1000) {
90
+ const secondsPassed = Math.floor(elapsed / 1000);
91
+
92
+ if (this.innerIsActive) {
93
+ const avgFps = Math.round((frameCount * 1000) / elapsed);
94
+ const avgLoad = Math.min(
95
+ 100,
96
+ Math.round((totalJank * 100) / elapsed),
97
+ );
98
+
99
+ // 发送本次采样周期的平均值
100
+ // 如果由于卡顿导致秒数 > 1,发送多个采样点以保持时间轴连续性
101
+ const nowTs = Date.now();
102
+ const metricsBatch = [];
103
+ for (let i = 0; i < secondsPassed; i++) {
104
+ metricsBatch.push({
105
+ fps: avgFps,
106
+ load: avgLoad,
107
+ ts: nowTs - (secondsPassed - 1 - i) * 1000,
108
+ // 只在最后一秒携带本周期的长任务列表
109
+ longTasks: i === secondsPassed - 1 ? [...this.longTasks] : [],
110
+ });
111
+ }
112
+
113
+ // 清空本周期缓存
114
+ this.longTasks = [];
115
+
116
+ // @ts-expect-error uni is global
117
+ if (typeof uni !== 'undefined' && uni.$emit) {
118
+ uni.$emit(MSG_TYPE.PERF_METRICS, metricsBatch);
119
+ }
120
+ } else {
121
+ // 即使未激活,也清空缓存防止内存泄漏
122
+ this.longTasks = [];
123
+ }
124
+
125
+ // 保持采样周期的稳定,不直接对齐 now 到 startTime,避免丢失多余的毫秒数
126
+ startTime = startTime + secondsPassed * 1000;
127
+ frameCount = 0;
128
+ totalJank = 0;
129
+ }
130
+
131
+ this.timer = raf(loop);
132
+ };
133
+
134
+ this.timer = raf(loop);
135
+ },
136
+ stopFpsLoop() {
137
+ caf(this.timer);
138
+ },
139
+ },
140
+ beforeUnmount() {
141
+ if (this.timer) {
142
+ caf(this.timer);
143
+ }
144
+ if (this.observer) {
145
+ this.observer.disconnect();
146
+ }
147
+ },
148
+ };
@@ -6,8 +6,8 @@
6
6
  :customStyle="customStyle"
7
7
  :contentHeight="contentHeight"
8
8
  :devToolVersion="devToolVersion"
9
- @click="onDevToolButtonClick"
10
- />
9
+ @click="onDevToolButtonClick" />
10
+
11
11
  <DevToolWindow
12
12
  :open="devToolWindowVisible"
13
13
  :data="windowData"
@@ -18,38 +18,64 @@
18
18
  :theme="theme"
19
19
  :customStyle="customStyle"
20
20
  :contentHeight="contentHeight"
21
+ :origin="windowOrigin"
21
22
  @close="onCloseDevToolWindow"
22
23
  @sendMessage="onSendMessage"
23
- @changeTheme="onChangeTheme"
24
- />
24
+ @changeTheme="onChangeTheme" />
25
+ <!-- 全局 FPS 采集器 -->
26
+ <PerformanceWidget
27
+ v-if="performanceVisible"
28
+ :zIndex="zIndex"
29
+ :theme="theme" />
30
+ <!-- #ifdef APP-PLUS || H5 -->
31
+ <view
32
+ :change:active="fpsRenderScript.receiveActive"
33
+ :active="isPageActive"
34
+ :FPS="0"></view>
35
+ <!-- #endif -->
25
36
  </view>
26
37
  </template>
27
- <script lang="ts" setup>
28
- import { onShow, onLoad, onUnload } from '@dcloudio/uni-app';
29
- import { ref, onBeforeMount, onUnmounted } from 'vue';
38
+
39
+ <script lang="ts">
30
40
  import DevToolButton from '../DevToolButton/index.vue';
31
41
  import DevToolWindow from '../DevToolWindow/index.vue';
32
- import { devToolEventBus } from '../../core';
42
+ import PerformanceWidget from '../Performance/modules/PerformanceWidget.vue';
43
+
44
+ export default {
45
+ __devTool: true,
46
+ components: {
47
+ DevToolButton,
48
+ DevToolWindow,
49
+ PerformanceWidget,
50
+ },
51
+ };
52
+ </script>
53
+
54
+ <script lang="ts" setup>
55
+ import { onShow, onHide } from '@dcloudio/uni-app';
56
+ import { ref, onBeforeMount, onUnmounted, computed } from 'vue';
33
57
 
34
58
  import {
35
- DEV_BUTTON_VISIBLE,
36
- DEV_WINDOW_VISIBLE,
37
- DEV_WINDOW_MESSAGE,
38
- DEV_WINDOW_OPEN,
39
- DEV_WINDOW_CLOSE,
40
- DEV_OPTION_GET,
41
- DEV_OPTION_SEND,
59
+ DEV_CORE_MESSAGE,
60
+ DEV_UI_MESSAGE,
61
+ MSG_TYPE,
62
+ CMD_TYPE,
42
63
  } from '../../const';
43
64
  import type { DevTool } from '../../type';
44
- import { getDevToolInfo, setDevToolInfo } from '../../devToolInfo';
65
+ import { setDevToolInfo, getDevToolInfo } from '../../modules/devToolInfo';
45
66
  import useContainerStyle from '../hooks/useContainerStyle';
46
67
 
47
68
  let isActive = false;
69
+ const isPageActive = ref(false);
48
70
 
49
71
  const windowData = ref<DevTool.WindowData>({});
50
72
 
73
+ // @ts-ignore
74
+ declare const fpsRenderScript: any;
75
+
51
76
  const devToolWindowVisible = ref(false);
52
77
  const devToolButtonVisible = ref(false);
78
+ const performanceVisible = ref(false);
53
79
 
54
80
  const sourceFileServers = ref<string[]>([]);
55
81
 
@@ -59,21 +85,58 @@ const zIndex = ref(998);
59
85
 
60
86
  const useDevSource = ref(false);
61
87
 
62
- const theme = ref<string>('dart');
88
+ const windowOrigin = ref({ x: 0, y: 0 });
89
+
90
+ const theme = ref<string>('dark');
63
91
 
64
92
  const devToolVersion = ref<string>('v0.0.0');
65
93
 
94
+ const baseFontSize = ref(12);
95
+ const tagFontSize = ref(10);
96
+ const tipsFontSize = ref(10);
97
+ const fontFamily = ref('');
98
+ const fontWeight = ref('normal');
99
+
66
100
  const { customStyle, contentHeight } = useContainerStyle({
67
101
  zIndex,
68
102
  });
69
103
 
70
- function onDevToolButtonClick() {
104
+ const baseFontSizePx = computed(() => baseFontSize.value + 'px');
105
+
106
+ const tagFontSizePx = computed(() => tagFontSize.value + 'px');
107
+ const tipsFontSizePx = computed(() => tipsFontSize.value + 'px');
108
+
109
+ function updateWindowOrigin(pos?: { x: number; y: number }) {
110
+ const { left = 300, top = 500 } = getDevToolInfo();
111
+ let x = left + 50;
112
+ let y = top + 16;
113
+
114
+ if (pos) {
115
+ x = pos.x;
116
+ y = pos.y;
117
+ }
118
+
119
+ // 补偿由于 navigateHeight 和 statusBarHeight 导致的偏移
120
+ const topOffset = parseInt(customStyle.paddingTop) || 0;
121
+
122
+ windowOrigin.value = {
123
+ x,
124
+ y: y + topOffset,
125
+ };
126
+ }
127
+
128
+ /**
129
+ * 向核心模块发送命令
130
+ */
131
+ function sendCommand(type: string, data: any = {}) {
132
+ // 1. 同层通讯 (高效,无序列化成本)
133
+ uni.$emit(DEV_UI_MESSAGE, { type, data });
134
+ }
135
+
136
+ function onDevToolButtonClick(pos: { x: number; y: number }) {
137
+ updateWindowOrigin(pos);
71
138
  onShowDevToolWindow(true);
72
- onSendMessage({
73
- type: DEV_WINDOW_OPEN,
74
- data: {},
75
- });
76
- uni.$emit(DEV_WINDOW_OPEN);
139
+ sendCommand(CMD_TYPE.WINDOW_OPEN, {});
77
140
  }
78
141
 
79
142
  function onCloseDevToolWindow() {
@@ -83,8 +146,9 @@ function onCloseDevToolWindow() {
83
146
  setDevToolInfo({
84
147
  devToolWindowVisible: false,
85
148
  });
86
- uni.$emit(DEV_WINDOW_CLOSE);
149
+ sendCommand(CMD_TYPE.WINDOW_CLOSE, {});
87
150
  }
151
+
88
152
  function onShowDevToolButton(show: boolean) {
89
153
  if (!isActive) return;
90
154
 
@@ -104,20 +168,33 @@ async function onShowDevToolWindow(show: boolean) {
104
168
  }
105
169
 
106
170
  function onSendMessage(param: { type: string; data: Record<string, any> }) {
107
- devToolEventBus?.emit(DEV_WINDOW_MESSAGE, param);
171
+ sendCommand(param.type, param.data);
108
172
  }
109
173
 
110
- function onDevOptionSend(options: DevTool.DevToolOptions) {
111
- if (options) {
112
- devToolVersion.value = options.devToolVersion ?? 'v0.0.0';
174
+ function onDevOptionSend(data: DevTool.WindowData) {
175
+ if (data) {
176
+ windowData.value = data;
177
+
178
+ if (data.devToolVersion !== undefined)
179
+ devToolVersion.value = data.devToolVersion;
113
180
 
114
- sourceFileServers.value = options.sourceFileServers ?? [];
181
+ if (data.sourceFileServers !== undefined)
182
+ sourceFileServers.value = data.sourceFileServers;
115
183
 
116
- mode.value = options.mode ?? '';
184
+ if (data.mode !== undefined) mode.value = data.mode;
117
185
 
118
- useDevSource.value = options.useDevSource ?? false;
186
+ if (data.useDevSource !== undefined) useDevSource.value = data.useDevSource;
119
187
 
120
- zIndex.value = options.zIndex ?? 998;
188
+ if (data.zIndex !== undefined) zIndex.value = data.zIndex;
189
+
190
+ if (data.baseFontSize !== undefined) baseFontSize.value = data.baseFontSize;
191
+
192
+ if (data.tagFontSize !== undefined) tagFontSize.value = data.tagFontSize;
193
+ if (data.tipsFontSize !== undefined) tipsFontSize.value = data.tipsFontSize;
194
+ if (data.fontFamily !== undefined) fontFamily.value = data.fontFamily;
195
+ if (data.fontWeight !== undefined) fontWeight.value = data.fontWeight;
196
+ if (data.performanceVisible !== undefined)
197
+ performanceVisible.value = data.performanceVisible;
121
198
  }
122
199
  }
123
200
 
@@ -125,114 +202,144 @@ function onChangeTheme(t: string) {
125
202
  theme.value = t;
126
203
  }
127
204
 
205
+ /**
206
+ * 处理来自核心模块的消息
207
+ */
208
+ // 处理消息
209
+ function handleCoreMessage(msg: any) {
210
+ let type, data;
211
+ try {
212
+ const payload = typeof msg === 'string' ? JSON.parse(msg) : msg;
213
+ type = payload.type;
214
+ data = payload.data;
215
+ } catch (e) {
216
+ console.error('DevTool parse error', e);
217
+ return;
218
+ }
219
+
220
+ // 避免 DevToolWindow 处理同样的数据消息(如果是广播的话)
221
+ // 注意:DevToolWindow 也会收到这个消息并在内部处理
222
+
223
+ switch (type) {
224
+ case MSG_TYPE.BUTTON_VISIBLE:
225
+ onShowDevToolButton(data);
226
+ break;
227
+ case MSG_TYPE.WINDOW_VISIBLE:
228
+ onShowDevToolWindow(data);
229
+ break;
230
+ case MSG_TYPE.PERF_VISIBLE:
231
+ performanceVisible.value = data;
232
+ break;
233
+ case MSG_TYPE.OPTION_UPDATE:
234
+ onDevOptionSend(data);
235
+ break;
236
+ // ... 其他消息处理
237
+ }
238
+ }
239
+
128
240
  onBeforeMount(() => {
241
+ const devToolInfo = getDevToolInfo();
242
+ setDevToolInfo({
243
+ devToolWindowVisible: false,
244
+ performanceVisible: false,
245
+ performanceSettings: {
246
+ ...devToolInfo.performanceSettings,
247
+ enableMonitor: false,
248
+ },
249
+ });
250
+
129
251
  const {
130
252
  devToolButtonVisible: showButton = false,
131
-
132
- devToolWindowVisible: showWindow = false,
253
+ baseFontSize: baseF = 12,
254
+ tagFontSize: tagF = 10,
255
+ tipsFontSize: tipsF = 10,
256
+ fontFamily: fontF = '',
257
+ fontWeight: weightF = 'normal',
258
+ theme: themeF = 'light',
133
259
  } = getDevToolInfo();
134
260
 
135
261
  isActive = true;
262
+ isPageActive.value = true;
136
263
  devToolButtonVisible.value = showButton;
137
- devToolWindowVisible.value = showWindow;
138
- devToolEventBus?.on(DEV_BUTTON_VISIBLE, onShowDevToolButton);
139
- devToolEventBus?.on(DEV_WINDOW_VISIBLE, onShowDevToolWindow);
140
- devToolEventBus?.on(DEV_OPTION_SEND, onDevOptionSend);
264
+ devToolWindowVisible.value = false; // 始终从关闭状态开始
265
+ performanceVisible.value = false; // 始终从关闭状态开始
266
+ windowData.value.performanceVisible = false;
267
+ baseFontSize.value = baseF;
268
+ tagFontSize.value = tagF;
269
+ tipsFontSize.value = tipsF;
270
+ fontFamily.value = fontF;
271
+ fontWeight.value = weightF;
272
+ windowData.value.baseFontSize = baseF;
273
+ windowData.value.tagFontSize = tagF;
274
+ windowData.value.tipsFontSize = tipsF;
275
+ windowData.value.fontFamily = fontF;
276
+ windowData.value.fontWeight = weightF;
277
+ theme.value = themeF;
278
+
279
+ // 监听核心模块消息
280
+ uni.$on(DEV_CORE_MESSAGE, handleCoreMessage);
141
281
 
142
282
  // #ifdef H5
143
283
  setTimeout(() => {
144
- devToolEventBus?.emit(DEV_WINDOW_MESSAGE, {
145
- type: DEV_OPTION_GET,
146
- data: {},
147
- });
284
+ sendCommand(CMD_TYPE.OPTION_GET, {});
148
285
  }, 1000);
149
-
150
286
  // #endif
151
287
 
152
288
  // #ifndef H5
153
289
  setTimeout(() => {
154
- devToolEventBus?.emit(DEV_WINDOW_MESSAGE, {
155
- type: DEV_OPTION_GET,
156
- data: {},
157
- });
290
+ sendCommand(CMD_TYPE.OPTION_GET, {});
158
291
  }, 3000);
159
292
  // #endif
160
293
  });
161
294
 
162
295
  onUnmounted(() => {
163
- devToolEventBus?.emit(DEV_WINDOW_MESSAGE, {
164
- type: DEV_WINDOW_CLOSE,
165
- data: {},
166
- });
167
- devToolEventBus?.off(DEV_BUTTON_VISIBLE, onShowDevToolButton);
168
- devToolEventBus?.off(DEV_WINDOW_VISIBLE, onShowDevToolWindow);
296
+ sendCommand(CMD_TYPE.WINDOW_CLOSE, {});
297
+ uni.$off(DEV_CORE_MESSAGE, handleCoreMessage);
169
298
  });
170
299
 
171
300
  onShow(() => {
172
301
  isActive = true;
173
- const {
174
- devToolButtonVisible: showButton = false,
175
- devToolWindowVisible: showWindow = false,
176
- } = getDevToolInfo();
302
+ isPageActive.value = true;
303
+ const { devToolButtonVisible: showButton = false } = getDevToolInfo();
177
304
 
178
- devToolWindowVisible.value = showWindow;
305
+ // 不恢复窗口状态,保持关闭
179
306
  devToolButtonVisible.value = showButton;
180
307
 
181
308
  if (devToolWindowVisible.value) {
182
- onSendMessage({
183
- type: DEV_WINDOW_OPEN,
184
- data: {},
185
- });
309
+ sendCommand(CMD_TYPE.WINDOW_OPEN, {});
186
310
  }
187
311
  });
188
- // onHide(() => {
189
- // isActive = false;
190
- // devToolWindowVisible.value = false;
191
- // });
312
+ onHide(() => {
313
+ isPageActive.value = false;
314
+ });
192
315
  </script>
316
+
317
+ <!-- #ifdef APP-PLUS || H5 -->
318
+ <script
319
+ module="fpsRenderScript"
320
+ lang="renderjs"
321
+ src="./fps-collector.render.ts"></script>
322
+ <!-- #endif -->
323
+
193
324
  <style scoped>
325
+ @import '../styles/theme.css';
326
+
194
327
  .dev-tool {
195
328
  position: fixed;
196
329
  top: 0;
197
330
  left: 0;
198
331
  z-index: 998;
199
332
 
200
- --dev-tool-main-color: #9254de;
201
- --dev-tool-normal-bg-color: #f9f9f9;
202
- --dev-tool-warn-color: #ffa940;
203
- --dev-tool-warn-bg-color: #fff7e6;
204
- --dev-tool-error-color: #ff4d4f;
205
- --dev-tool-error-bg-color: #fff1f0;
206
- --dev-tool-success-color: #bae637;
207
- --dev-tool-success-bg-color: #fcffe6;
208
-
209
- --dev-tool-base-font-size: 12px;
210
- --dev-tool-tag-font-size: 10px;
211
- --dev-tool-tips-font-size: 10px;
212
- -webkit-tap-highlight-color: transparent;
213
- }
214
- .dev-tool-light {
215
- --dev-tool-bg-color: rgba(255, 255, 255, 0.8);
216
- --dev-tool-bg2-color: rgba(255, 255, 255, 0.95);
217
-
218
- --dev-tool-text-color: #000;
219
- --dev-tool-border-color: #f0f0f0;
220
- --dev-tool-info-color: #9c9c9c;
221
- --dev-tool-log-color: #f9f9f9;
222
- --dev-tool-nil-color: #020201;
223
- --dev-tool-string-color: #888888;
224
- --dev-tool-number-color: #1d8ce0;
225
- --dev-tool-boolean-color: #1d8ce0;
226
- --dev-tool-symbol-color: bisque;
227
- }
333
+ --dev-tool-active-color: var(--dev-tool-main-color);
334
+ --dev-tool-base-font-size: v-bind(baseFontSizePx);
335
+ --dev-tool-tag-font-size: v-bind(tagFontSizePx);
336
+ --dev-tool-tips-font-size: v-bind(tipsFontSizePx);
337
+ --dev-tool-font-family: v-bind(fontFamily);
338
+ --dev-tool-font-weight: v-bind(fontWeight);
228
339
 
229
- .dev-tool-dart {
230
- --dev-tool-bg-color: rgba(0, 0, 0, 0.8);
231
- --dev-tool-bg2-color: rgba(43, 43, 43, 0.8);
232
-
233
- --dev-tool-text-color: #fff;
234
- --dev-tool-border-color: #3d3d3d;
235
-
236
- --dev-tool-log-color: #f9f9f9;
340
+ -webkit-tap-highlight-color: transparent;
341
+ font-size: var(--dev-tool-base-font-size);
342
+ font-family: var(--dev-tool-font-family);
343
+ font-weight: var(--dev-tool-font-weight);
237
344
  }
238
345
  </style>