@roki-h5/create-roki-app 0.1.11 → 0.1.13
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/package.json +1 -1
- package/templates/h5/package.json +2 -1
- package/templates/h5/src/App.vue +6 -2
- package/templates/h5/src/utils/appInfo.ts +15 -6
- package/templates/h5/src/utils/useDeviceShadow.ts +17 -3
- package/templates/h5/src/utils/useGlobalSse.ts +9 -2
- package/templates/h5/src/utils/vconsole.ts +22 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roki-h5/scaffold-template",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.9",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vite --mode development",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"axios": "^1.7.9",
|
|
18
18
|
"event-source-polyfill": "^1.0.31",
|
|
19
19
|
"pinia": "^2.3.0",
|
|
20
|
+
"vconsole": "^3.15.1",
|
|
20
21
|
"vue": "^3.5.13",
|
|
21
22
|
"vue-router": "^4.5.0"
|
|
22
23
|
},
|
package/templates/h5/src/App.vue
CHANGED
|
@@ -5,15 +5,19 @@ import { getAppData } from '@/utils/appInfo'
|
|
|
5
5
|
import { BUILD_TIME, VERSION } from '@/utils/buildInfo'
|
|
6
6
|
import { useDeviceShadow } from '@/utils/useDeviceShadow'
|
|
7
7
|
import { useGlobalSse } from '@/utils/useGlobalSse'
|
|
8
|
+
import { setupMobileDebugConsole } from '@/utils/vconsole'
|
|
8
9
|
|
|
9
10
|
const appStore = useAppStore()
|
|
10
11
|
|
|
11
|
-
useDeviceShadow()
|
|
12
|
-
useGlobalSse()
|
|
12
|
+
const { start: startDeviceShadow } = useDeviceShadow({ lazy: true })
|
|
13
|
+
const { start: startGlobalSse } = useGlobalSse({ lazy: true })
|
|
13
14
|
|
|
14
15
|
onBeforeMount(async () => {
|
|
16
|
+
await setupMobileDebugConsole()
|
|
15
17
|
await getAppData()
|
|
16
18
|
void appStore.loadWelcomeMessage()
|
|
19
|
+
startDeviceShadow()
|
|
20
|
+
startGlobalSse()
|
|
17
21
|
})
|
|
18
22
|
|
|
19
23
|
function logBuildInfo() {
|
|
@@ -52,6 +52,17 @@ export function patchAppStoreFromInfo(rawInfo: unknown) {
|
|
|
52
52
|
void appStore.loadWelcomeMessage()
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
console.log('[appInfo] 设备信息', {
|
|
56
|
+
deviceId,
|
|
57
|
+
deviceName,
|
|
58
|
+
deviceType,
|
|
59
|
+
deviceCategory,
|
|
60
|
+
familyId,
|
|
61
|
+
userId,
|
|
62
|
+
terminal,
|
|
63
|
+
accessToken,
|
|
64
|
+
})
|
|
65
|
+
|
|
55
66
|
return info
|
|
56
67
|
} catch (e) {
|
|
57
68
|
console.warn('[appInfo] 设备信息解析失败', e)
|
|
@@ -68,17 +79,15 @@ export async function getAppData() {
|
|
|
68
79
|
typeof window.nativeInterface.getDeviceInfo === 'function'
|
|
69
80
|
) {
|
|
70
81
|
info = await Promise.resolve(window.nativeInterface.getDeviceInfo())
|
|
71
|
-
|
|
72
|
-
console.log('[appInfo] 安卓/鸿蒙数据获取成功', info)
|
|
73
|
-
}
|
|
82
|
+
console.log('[appInfo] 安卓/鸿蒙数据获取成功', info)
|
|
74
83
|
} else if (window.getDeviceInfo) {
|
|
75
84
|
const raw = window.getDeviceInfo
|
|
76
85
|
info = await Promise.resolve(
|
|
77
86
|
typeof raw === 'function' ? raw() : raw,
|
|
78
87
|
)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
88
|
+
console.log('[appInfo] iOS 数据获取成功', info)
|
|
89
|
+
} else {
|
|
90
|
+
console.warn('[appInfo] 未检测到原生桥,无法获取设备信息')
|
|
82
91
|
}
|
|
83
92
|
|
|
84
93
|
if (!info) return null
|
|
@@ -4,13 +4,19 @@ import { useAppStore } from '@/stores/app'
|
|
|
4
4
|
import { useMachineStateStore } from '@/stores/machineState'
|
|
5
5
|
import { fetchAndStoreDeviceShadow, resetDeviceShadowCache } from '@/utils/deviceShadow'
|
|
6
6
|
|
|
7
|
+
interface UseDeviceShadowOptions {
|
|
8
|
+
/** 为 true 时不在 setup 阶段立即拉取,需手动调用 start */
|
|
9
|
+
lazy?: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
7
12
|
/** 应用启动时拉取一次 shadow,子页面直接读 store */
|
|
8
|
-
export function useDeviceShadow() {
|
|
13
|
+
export function useDeviceShadow(options: UseDeviceShadowOptions = {}) {
|
|
14
|
+
const { lazy = false } = options
|
|
9
15
|
const appStore = useAppStore()
|
|
10
16
|
const machineStateStore = useMachineStateStore()
|
|
11
17
|
const { deviceId } = storeToRefs(appStore)
|
|
12
18
|
|
|
13
|
-
watch(
|
|
19
|
+
const stop = watch(
|
|
14
20
|
deviceId,
|
|
15
21
|
(newId, oldId) => {
|
|
16
22
|
if (newId !== oldId) {
|
|
@@ -24,6 +30,14 @@ export function useDeviceShadow() {
|
|
|
24
30
|
|
|
25
31
|
void fetchAndStoreDeviceShadow(newId)
|
|
26
32
|
},
|
|
27
|
-
{ immediate:
|
|
33
|
+
{ immediate: !lazy },
|
|
28
34
|
)
|
|
35
|
+
|
|
36
|
+
const start = () => {
|
|
37
|
+
const id = deviceId.value
|
|
38
|
+
if (!id) return
|
|
39
|
+
void fetchAndStoreDeviceShadow(id)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return { start, stop }
|
|
29
43
|
}
|
|
@@ -44,7 +44,8 @@ function throttle<T extends (...args: never[]) => void>(fn: T, wait: number) {
|
|
|
44
44
|
* 应用级 SSE:建立长连接并同步设备在线/开关机/工作状态。
|
|
45
45
|
* shadow 全量属性仅在 App 启动时拉取一次;此处通过 SSE 增量更新 store。
|
|
46
46
|
*/
|
|
47
|
-
export function useGlobalSse() {
|
|
47
|
+
export function useGlobalSse(options: { lazy?: boolean } = {}) {
|
|
48
|
+
const { lazy = false } = options
|
|
48
49
|
const router = useRouter()
|
|
49
50
|
const appStore = useAppStore()
|
|
50
51
|
const machineStateStore = useMachineStateStore()
|
|
@@ -185,7 +186,7 @@ export function useGlobalSse() {
|
|
|
185
186
|
() => {
|
|
186
187
|
initSseConnection()
|
|
187
188
|
},
|
|
188
|
-
{ immediate:
|
|
189
|
+
{ immediate: !lazy },
|
|
189
190
|
)
|
|
190
191
|
|
|
191
192
|
watch(sseClient, (client) => {
|
|
@@ -193,4 +194,10 @@ export function useGlobalSse() {
|
|
|
193
194
|
bindGlobalListeners()
|
|
194
195
|
}
|
|
195
196
|
})
|
|
197
|
+
|
|
198
|
+
const start = () => {
|
|
199
|
+
initSseConnection()
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return { start }
|
|
196
203
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { appEnv } from '@config/env'
|
|
2
|
+
|
|
3
|
+
let setupPromise: Promise<void> | null = null
|
|
4
|
+
|
|
5
|
+
/** 测试环境挂载 vConsole;须在业务请求与 console 输出之前 await */
|
|
6
|
+
export function setupMobileDebugConsole(): Promise<void> {
|
|
7
|
+
if (setupPromise) return setupPromise
|
|
8
|
+
|
|
9
|
+
setupPromise = (async () => {
|
|
10
|
+
if (appEnv !== 'test') return
|
|
11
|
+
|
|
12
|
+
const { default: VConsole } = await import('vconsole')
|
|
13
|
+
new VConsole()
|
|
14
|
+
|
|
15
|
+
// 等待 vConsole 完成 console 劫持后再继续业务逻辑
|
|
16
|
+
await new Promise<void>((resolve) => {
|
|
17
|
+
requestAnimationFrame(() => resolve())
|
|
18
|
+
})
|
|
19
|
+
})()
|
|
20
|
+
|
|
21
|
+
return setupPromise
|
|
22
|
+
}
|