gio-miniprogram-sdk 4.2.0 → 4.3.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/.github/workflows/publish.yml +2 -0
- package/dist/alipay.js +1 -1
- package/dist/baidu.js +1 -1
- package/dist/bytedance.js +1 -1
- package/dist/jingdong.js +1 -1
- package/dist/kuaishou.js +1 -1
- package/dist/plugins/gioABTest.js +1 -1
- package/dist/plugins/gioCompress.js +1 -1
- package/dist/plugins/gioEventAutoTracking.js +1 -1
- package/dist/plugins/gioImpressionTracking.js +1 -1
- package/dist/plugins/gioMultipleInstances.js +1 -1
- package/dist/qq.js +1 -1
- package/dist/quickapp.js +1 -1
- package/dist/taobao.js +1 -1
- package/dist/taro.js +1 -1
- package/dist/uniapp.js +1 -1
- package/dist/wechat.js +1 -1
- package/package.json +1 -1
- package/rollup.config.js +1 -1
- package/rollup.plugins.config.js +1 -1
- package/src/adapters/gioTaobaoAdapter.ts +5 -3
- package/src/adapters/gioTaroAdapter.ts +16 -10
- package/src/adapters/gioUniAppAdapter.ts +1 -32
- package/src/core/dataStore/eventContextBuilder.ts +4 -8
- package/src/core/dataStore/eventHooks/appEffects.ts +62 -76
- package/src/core/dataStore/eventHooks/index.ts +39 -23
- package/src/core/dataStore/eventHooks/minipPage.ts +92 -30
- package/src/core/dataStore/eventHooks/pageEffects.ts +23 -40
- package/src/core/dataStore/index.ts +43 -54
- package/src/core/growingIO.ts +15 -23
- package/src/index.ts +12 -12
- package/src/minipInstance/base.ts +53 -26
- package/src/minipInstance/my.ts +5 -0
- package/src/minipInstance/tb.ts +5 -0
- package/src/types/eventHooks.ts +10 -8
- package/src/utils/tools.ts +22 -3
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { AppHookLifeCircle } from '@@/types/eventHooks';
|
|
2
2
|
import { GrowingIOType } from '@@/types/growingIO';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
isObject,
|
|
6
|
-
typeOf,
|
|
7
|
-
keys,
|
|
8
|
-
forEach,
|
|
9
|
-
has,
|
|
10
|
-
isNil
|
|
11
|
-
} from '@@/utils/glodash';
|
|
12
|
-
import { qsStringify } from '@@/utils/tools';
|
|
3
|
+
import { isEmpty, typeOf } from '@@/utils/glodash';
|
|
4
|
+
import { getLaunchQuery, qsStringify } from '@@/utils/tools';
|
|
13
5
|
import EMIT_MSG from '@@/constants/emitMsg';
|
|
14
6
|
|
|
15
7
|
class AppEffects {
|
|
8
|
+
public enterParams: any = {};
|
|
16
9
|
constructor(public growingIO: GrowingIOType) {}
|
|
17
10
|
|
|
18
11
|
main = (event: AppHookLifeCircle, args: any) => {
|
|
@@ -28,7 +21,6 @@ class AppEffects {
|
|
|
28
21
|
trackersExecute,
|
|
29
22
|
shareOut,
|
|
30
23
|
lastCloseTime,
|
|
31
|
-
eventHooks,
|
|
32
24
|
saveStorageInfo,
|
|
33
25
|
setOriginalSource
|
|
34
26
|
}
|
|
@@ -48,25 +40,35 @@ class AppEffects {
|
|
|
48
40
|
params: args[0] ?? {}
|
|
49
41
|
});
|
|
50
42
|
switch (event) {
|
|
43
|
+
case appListeners.appLaunch:
|
|
44
|
+
// 在launch先获取一次是防止在此生命周期中发埋点或调用其他api时获取不到path和query
|
|
45
|
+
this.enterParams = { ...args[0] };
|
|
46
|
+
break;
|
|
51
47
|
// 快应用是执行onCreate
|
|
52
48
|
case appListeners.appCreate:
|
|
53
49
|
// 各小程序执行onShow
|
|
54
50
|
case appListeners.appShow: {
|
|
55
51
|
// 获取进入小程序的path、query和scene
|
|
56
|
-
const { path, query } = this.enterParamsParse(args[0]);
|
|
52
|
+
const { path, query, referralPage } = this.enterParamsParse(args[0]);
|
|
57
53
|
if (!shareOut && vdsConfig.originalSource) {
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
// 个别(说的就是你:淘宝)小程序场景值不一样后台拉起时可能args中会没有path和query
|
|
55
|
+
if (path) {
|
|
56
|
+
// 保存初始来源信息
|
|
57
|
+
trackersExecute((trackingId: string) => {
|
|
58
|
+
setOriginalSource(trackingId, { path, query, referralPage });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
62
61
|
}
|
|
63
62
|
// 以下条件均会被认为是一次新的访问
|
|
64
63
|
// 没有关闭时间说明是新访问
|
|
65
64
|
if (!lastCloseTime) {
|
|
66
|
-
// 保存进入小程序的参数
|
|
67
|
-
dataStore.lastVisitEvent = { path, query };
|
|
68
65
|
trackersExecute((trackingId: string) => {
|
|
69
|
-
|
|
66
|
+
dataStore.lastVisitEvent[trackingId] = {
|
|
67
|
+
path,
|
|
68
|
+
query,
|
|
69
|
+
referralPage
|
|
70
|
+
};
|
|
71
|
+
this.buildVisitEvent(trackingId, { path, query, referralPage });
|
|
70
72
|
});
|
|
71
73
|
} else if (
|
|
72
74
|
// 两次打开间隔时间超过keepAlive设定(默认5分钟)
|
|
@@ -78,10 +80,17 @@ class AppEffects {
|
|
|
78
80
|
trackersExecute((trackingId: string) => {
|
|
79
81
|
userStore.setSessionId(trackingId);
|
|
80
82
|
});
|
|
81
|
-
// 需要按自然逻辑发visit时,清掉pagetime,防止取值错误(会在page中重新生成)
|
|
82
|
-
eventHooks.currentPage.time = undefined;
|
|
83
83
|
trackersExecute((trackingId: string) => {
|
|
84
|
-
|
|
84
|
+
if (!path) {
|
|
85
|
+
// 个别(说的就是你:淘宝)小程序场景值不一样后台拉起时可能args中会没有path和query,直接取上一个最后发送的page中的值
|
|
86
|
+
const lastPage = dataStore.lastPageEvent[trackingId];
|
|
87
|
+
this.buildVisitEvent(trackingId, {
|
|
88
|
+
path: lastPage.path,
|
|
89
|
+
query: lastPage.query
|
|
90
|
+
});
|
|
91
|
+
} else {
|
|
92
|
+
this.buildVisitEvent(trackingId, { path, query });
|
|
93
|
+
}
|
|
85
94
|
});
|
|
86
95
|
}
|
|
87
96
|
break;
|
|
@@ -108,16 +117,11 @@ class AppEffects {
|
|
|
108
117
|
};
|
|
109
118
|
|
|
110
119
|
// 进入小程序时的相关数据处理
|
|
111
|
-
enterParamsParse = (args: any) => {
|
|
120
|
+
enterParamsParse = (args: any = {}) => {
|
|
112
121
|
const { gioPlatform, minipInstance, dataStore } = this.growingIO;
|
|
113
|
-
let
|
|
114
|
-
let
|
|
115
|
-
|
|
116
|
-
vPath = p;
|
|
117
|
-
vQuery = keys(q)
|
|
118
|
-
.map((k) => `${k}=${q[k]}`)
|
|
119
|
-
.join('&');
|
|
120
|
-
};
|
|
122
|
+
let rPath = ''; // 进入小程序时的path
|
|
123
|
+
let rQuery = ''; // 进入小程序时的参数(启动参数)
|
|
124
|
+
let rAppId = ''; // scene=1037或1038时来源小程序、公众号或 App 的 appId
|
|
121
125
|
// 支持getEnterOptionsSync
|
|
122
126
|
if (
|
|
123
127
|
gioPlatform !== 'quickapp' &&
|
|
@@ -125,35 +129,25 @@ class AppEffects {
|
|
|
125
129
|
) {
|
|
126
130
|
const { path, query, scene, referrerInfo } =
|
|
127
131
|
minipInstance.minip.getEnterOptionsSync() || {};
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
!has(originQuery, k) &&
|
|
138
|
-
// 只处理字符串、数字和布尔类型的值
|
|
139
|
-
['string', 'number', 'boolean'].includes(typeOf(v))
|
|
140
|
-
) {
|
|
141
|
-
extraQuery.push(`${k}=${v}`);
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
const extraQueryString = extraQuery.join('&');
|
|
145
|
-
vQuery =
|
|
146
|
-
vQuery && extraQueryString
|
|
147
|
-
? `${vQuery}&${extraQueryString}`
|
|
148
|
-
: vQuery || extraQueryString;
|
|
132
|
+
rPath = path || args.path;
|
|
133
|
+
rQuery = query || args.query;
|
|
134
|
+
rAppId = referrerInfo?.appId || args?.referrerInfo?.appId || '';
|
|
135
|
+
dataStore.scene = scene || args.scene;
|
|
136
|
+
// 来源有额外参数时并入页面参数
|
|
137
|
+
if (!isEmpty(referrerInfo?.extraData)) {
|
|
138
|
+
rQuery = qsStringify(getLaunchQuery(rQuery, referrerInfo.extraData));
|
|
139
|
+
} else {
|
|
140
|
+
rQuery = qsStringify(rQuery);
|
|
149
141
|
}
|
|
150
142
|
} else {
|
|
151
143
|
// 不支持的按老逻辑兜底
|
|
152
|
-
const { path, query } = args;
|
|
153
|
-
|
|
144
|
+
const { path, query, referrerInfo } = args;
|
|
145
|
+
rPath = path;
|
|
146
|
+
rQuery = qsStringify(query);
|
|
147
|
+
rAppId = referrerInfo?.appId || '';
|
|
154
148
|
this.parseScene(args);
|
|
155
149
|
}
|
|
156
|
-
return { path:
|
|
150
|
+
return { path: rPath, query: rQuery, referralPage: rAppId };
|
|
157
151
|
};
|
|
158
152
|
|
|
159
153
|
// 获取来源场景值
|
|
@@ -188,13 +182,7 @@ class AppEffects {
|
|
|
188
182
|
// 构建访问事件
|
|
189
183
|
buildVisitEvent = (trackingId: string, props?: any) => {
|
|
190
184
|
const {
|
|
191
|
-
dataStore: {
|
|
192
|
-
getOriginalSource,
|
|
193
|
-
eventContextBuilder,
|
|
194
|
-
eventInterceptor,
|
|
195
|
-
eventHooks
|
|
196
|
-
},
|
|
197
|
-
minipInstance,
|
|
185
|
+
dataStore: { getOriginalSource, eventContextBuilder, eventInterceptor },
|
|
198
186
|
vdsConfig
|
|
199
187
|
} = this.growingIO;
|
|
200
188
|
const originalSource = getOriginalSource(trackingId);
|
|
@@ -202,22 +190,20 @@ class AppEffects {
|
|
|
202
190
|
const query = props?.query || '';
|
|
203
191
|
let event = {
|
|
204
192
|
eventType: 'VISIT',
|
|
205
|
-
...eventContextBuilder(trackingId, {
|
|
206
|
-
// params.path是生命周期值或者是已有的值
|
|
207
|
-
path: props?.path || '',
|
|
208
|
-
// params.query是对象说明是生命周期调用,否则是补发调用
|
|
209
|
-
query: typeOf(query) === 'string' ? query : qsStringify(query),
|
|
210
|
-
// visit事件要单独设一次title以覆盖eventContextBuilder中的lastPage的可能的title错误值
|
|
211
|
-
title:
|
|
212
|
-
eventHooks.currentPage?.title ||
|
|
213
|
-
minipInstance.getPageTitle(minipInstance.getCurrentPage()),
|
|
214
|
-
timestamp: eventHooks.currentPage.time
|
|
215
|
-
? eventHooks.currentPage.time - 1
|
|
216
|
-
: +Date.now()
|
|
217
|
-
})
|
|
193
|
+
...eventContextBuilder(trackingId, {})
|
|
218
194
|
};
|
|
195
|
+
if (!isEmpty(props) && props.path) {
|
|
196
|
+
// params.path是生命周期值或者是已有的值
|
|
197
|
+
event.path = props.path || '';
|
|
198
|
+
// params.query是对象说明是生命周期调用,否则是补发调用
|
|
199
|
+
event.query = typeOf(query) === 'string' ? query : qsStringify(query);
|
|
200
|
+
// 如果有来源
|
|
201
|
+
if (props.referralPage) {
|
|
202
|
+
event.referralPage = props.referralPage;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
219
205
|
// 配置使用初始来源时,visit使用初始来源数据
|
|
220
|
-
if (vdsConfig.originalSource && !
|
|
206
|
+
if (vdsConfig.originalSource && !isEmpty(originalSource)) {
|
|
221
207
|
event = { ...event, ...originalSource };
|
|
222
208
|
}
|
|
223
209
|
eventInterceptor(event);
|
|
@@ -304,15 +304,25 @@ class EventHooks implements EventHooksType {
|
|
|
304
304
|
});
|
|
305
305
|
};
|
|
306
306
|
|
|
307
|
-
growingApp = (app: any) =>
|
|
307
|
+
growingApp = (app: any) =>
|
|
308
|
+
isFunction(this.originalApp)
|
|
309
|
+
? this.originalApp(this.appOverriding(app))
|
|
310
|
+
: this.appOverriding(app);
|
|
308
311
|
|
|
309
|
-
growingPage = (page: any) =>
|
|
312
|
+
growingPage = (page: any) =>
|
|
313
|
+
isFunction(this.originalPage)
|
|
314
|
+
? this.originalPage(this.pageOverriding(page))
|
|
315
|
+
: this.pageOverriding(page);
|
|
310
316
|
|
|
311
317
|
growingComponent = (component: any) =>
|
|
312
|
-
this.originalComponent
|
|
318
|
+
isFunction(this.originalComponent)
|
|
319
|
+
? this.originalComponent(this.componentOverriding(component))
|
|
320
|
+
: this.componentOverriding(component);
|
|
313
321
|
|
|
314
322
|
growingBehavior = (behavior: any) =>
|
|
315
|
-
this.originalBehavior
|
|
323
|
+
isFunction(this.originalBehavior)
|
|
324
|
+
? this.originalBehavior(this.componentOverriding(behavior))
|
|
325
|
+
: this.componentOverriding(behavior);
|
|
316
326
|
|
|
317
327
|
nativeGrowing = (
|
|
318
328
|
designated: string[] = ['App', 'Page', 'Component', 'Behavior']
|
|
@@ -320,15 +330,12 @@ class EventHooks implements EventHooksType {
|
|
|
320
330
|
const self = this;
|
|
321
331
|
const { platformConfig } = this.growingIO;
|
|
322
332
|
const platformHooks = platformConfig.hooks;
|
|
323
|
-
this.setAppEffectCbs();
|
|
324
|
-
this.setPageEffectCbs();
|
|
325
333
|
if (designated.includes('App')) {
|
|
326
334
|
try {
|
|
327
335
|
// 重写App
|
|
328
336
|
if (platformHooks.App && !this.appHooked) {
|
|
329
|
-
this.originalApp = App || global.App || function () {};
|
|
330
337
|
App = function (...args) {
|
|
331
|
-
return self.
|
|
338
|
+
return self.originalApp(self.appOverriding(args[0]));
|
|
332
339
|
};
|
|
333
340
|
this.appHooked = true;
|
|
334
341
|
}
|
|
@@ -340,9 +347,8 @@ class EventHooks implements EventHooksType {
|
|
|
340
347
|
try {
|
|
341
348
|
// 重写Page
|
|
342
349
|
if (platformHooks.Page && !this.pageHooked) {
|
|
343
|
-
this.originalPage = Page || global.Page || function () {};
|
|
344
350
|
Page = function (...args) {
|
|
345
|
-
return self.
|
|
351
|
+
return self.originalPage(self.pageOverriding(args[0]));
|
|
346
352
|
};
|
|
347
353
|
this.pageHooked = true;
|
|
348
354
|
}
|
|
@@ -354,10 +360,8 @@ class EventHooks implements EventHooksType {
|
|
|
354
360
|
try {
|
|
355
361
|
// 重写Component
|
|
356
362
|
if (platformHooks.Component && !this.componentHooked) {
|
|
357
|
-
this.originalComponent =
|
|
358
|
-
Component || global.Component || function () {};
|
|
359
363
|
Component = function (...args) {
|
|
360
|
-
return self.
|
|
364
|
+
return self.originalComponent(self.componentOverriding(args[0]));
|
|
361
365
|
};
|
|
362
366
|
this.componentHooked = true;
|
|
363
367
|
}
|
|
@@ -369,9 +373,8 @@ class EventHooks implements EventHooksType {
|
|
|
369
373
|
try {
|
|
370
374
|
// 重写Behavior
|
|
371
375
|
if (platformHooks.Behavior && !this.behaviorHooked) {
|
|
372
|
-
this.originalBehavior = Behavior || global.Behavior || function () {};
|
|
373
376
|
Behavior = function (...args) {
|
|
374
|
-
return self.
|
|
377
|
+
return self.originalBehavior(self.componentOverriding(args[0]));
|
|
375
378
|
};
|
|
376
379
|
this.behaviorHooked = true;
|
|
377
380
|
}
|
|
@@ -381,26 +384,39 @@ class EventHooks implements EventHooksType {
|
|
|
381
384
|
}
|
|
382
385
|
};
|
|
383
386
|
|
|
384
|
-
//
|
|
387
|
+
// 初始化原始值
|
|
388
|
+
initOriginalValue = () => {
|
|
389
|
+
this.setAppEffectCbs();
|
|
390
|
+
this.setPageEffectCbs();
|
|
391
|
+
this.originalApp = niceTry(() => App || global.App);
|
|
392
|
+
this.originalPage = niceTry(() => Page || global.Page);
|
|
393
|
+
this.originalComponent = niceTry(() => Component || global.Component);
|
|
394
|
+
this.originalBehavior = niceTry(() => Behavior || global.Behavior);
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
// 初始化事件钩子
|
|
385
398
|
initEventHooks = () => {
|
|
386
399
|
const self = this;
|
|
387
400
|
const { platformConfig, gioPlatform } = this.growingIO;
|
|
401
|
+
this.initOriginalValue();
|
|
388
402
|
if (platformConfig.canHook) {
|
|
389
403
|
this.nativeGrowing();
|
|
390
|
-
getGlobal().GioApp = niceTry(() => App ??
|
|
391
|
-
getGlobal().GioPage = niceTry(() => Page ??
|
|
404
|
+
getGlobal().GioApp = niceTry(() => App ?? this.originalApp);
|
|
405
|
+
getGlobal().GioPage = niceTry(() => Page ?? this.originalPage);
|
|
392
406
|
getGlobal().GioComponent = niceTry(
|
|
393
|
-
() => Component ??
|
|
407
|
+
() => Component ?? this.originalComponent
|
|
408
|
+
);
|
|
409
|
+
getGlobal().GioBehavior = niceTry(
|
|
410
|
+
() => Behavior ?? this.originalBehavior
|
|
394
411
|
);
|
|
395
|
-
getGlobal().GioBehavior = niceTry(() => Behavior);
|
|
396
412
|
} else if (gioPlatform === 'quickapp') {
|
|
397
|
-
|
|
413
|
+
getGlobal().GioApp = function (...args) {
|
|
398
414
|
return self.appOverriding(args[0]);
|
|
399
415
|
};
|
|
400
|
-
|
|
416
|
+
getGlobal().GioPage = function (...args) {
|
|
401
417
|
return self.pageOverriding(args[0]);
|
|
402
418
|
};
|
|
403
|
-
|
|
419
|
+
getGlobal().GioComponent = function (...args) {
|
|
404
420
|
return self.pageOverriding(args[0]);
|
|
405
421
|
};
|
|
406
422
|
}
|
|
@@ -16,16 +16,14 @@ import {
|
|
|
16
16
|
qsParse,
|
|
17
17
|
niceTry,
|
|
18
18
|
getDynamicAttributes,
|
|
19
|
-
limitObject
|
|
19
|
+
limitObject,
|
|
20
|
+
getLaunchQuery
|
|
20
21
|
} from '@@/utils/tools';
|
|
21
22
|
import { EVENT } from '@@/types/base';
|
|
22
23
|
|
|
23
24
|
class MinipPage implements MinipPageType {
|
|
24
|
-
|
|
25
|
-
public
|
|
26
|
-
public query: any;
|
|
27
|
-
// 页面title (优先级:setNavigationBarTitle > data.gioPageTitle[不保证能取到] > config.js中设置的值 > tabBar配置)
|
|
28
|
-
public title: string;
|
|
25
|
+
// 根据页面存储的页面参数
|
|
26
|
+
public queryOption: any;
|
|
29
27
|
// 通过调用wx.setNavigationBarTitle设置的title
|
|
30
28
|
public settedTitle: any;
|
|
31
29
|
// 页面级属性
|
|
@@ -36,48 +34,108 @@ class MinipPage implements MinipPageType {
|
|
|
36
34
|
public currentLifecycle: string;
|
|
37
35
|
|
|
38
36
|
constructor(public growingIO: GrowingIOType) {
|
|
39
|
-
this.
|
|
37
|
+
this.queryOption = {};
|
|
40
38
|
this.settedTitle = {};
|
|
41
39
|
this.pageProps = {};
|
|
42
40
|
}
|
|
43
41
|
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const path =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
42
|
+
// 获取页面地址
|
|
43
|
+
getPagePath = () => {
|
|
44
|
+
const { minipInstance, inPlugin, dataStore, trackingId } = this.growingIO;
|
|
45
|
+
const path = minipInstance.getCurrentPath();
|
|
46
|
+
if (inPlugin) {
|
|
47
|
+
const vds = dataStore.getTrackerVds(trackingId);
|
|
48
|
+
// 插件中没有页面时直接将插件appId作为页面信息
|
|
49
|
+
return path || `/插件${vds.appId}`;
|
|
51
50
|
} else {
|
|
52
|
-
|
|
51
|
+
return (
|
|
52
|
+
path ||
|
|
53
|
+
dataStore.eventHooks.appEffects.enterParams?.path ||
|
|
54
|
+
// 作为页面组件时component created生命周期中的埋点会取不到页面堆栈,所以拿最近的一个page事件中的页面信息做兜底
|
|
55
|
+
dataStore.lastPageEvent[trackingId]?.path ||
|
|
56
|
+
// 没有最近的一个page事件说明在app初始化的生命周期中,有些框架可能会有异步处理逻辑导致事件触发比visit晚,则使用visit事件中的页面信息兜底
|
|
57
|
+
dataStore.lastVisitEvent[trackingId]?.path
|
|
58
|
+
);
|
|
53
59
|
}
|
|
54
|
-
|
|
55
|
-
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 获取页面参数
|
|
63
|
+
getPageQeury = () => {
|
|
64
|
+
const { minipInstance, dataStore, trackingId } = this.growingIO;
|
|
65
|
+
const stackPage = minipInstance.getCurrentPage();
|
|
66
|
+
const stackPath = minipInstance.getCurrentPath();
|
|
67
|
+
const { enterParams = {} } = dataStore.eventHooks.appEffects;
|
|
68
|
+
if (stackPath) {
|
|
69
|
+
const pageParams = stackPage.options ?? stackPage.$taroParams;
|
|
70
|
+
// 堆栈中有页面信息,则使用堆栈中的页面参数
|
|
71
|
+
if (!isEmpty(pageParams)) {
|
|
72
|
+
// 删掉taro框架中自带的字段
|
|
73
|
+
unset(pageParams, '$taroTimestamp');
|
|
74
|
+
// 有页面解析的option直接取
|
|
75
|
+
return this.qsQuery(pageParams);
|
|
76
|
+
} else if (!isEmpty(this.queryOption[stackPath])) {
|
|
77
|
+
// 没有option从hook获取的生命周期参数中取
|
|
78
|
+
return this.qsQuery(this.queryOption[stackPath]);
|
|
79
|
+
} else if (stackPath === enterParams.path) {
|
|
80
|
+
// 某些小程序虽然有页面堆栈,但是页面还没加载完,兜底取启动参数
|
|
81
|
+
return this.qsQuery(
|
|
82
|
+
getLaunchQuery(
|
|
83
|
+
enterParams?.query,
|
|
84
|
+
enterParams?.referrerInfo?.extraData
|
|
85
|
+
)
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
} else if (enterParams.path) {
|
|
89
|
+
// 堆栈中没有页面信息,但启动参数中有,说明是小程序刚启动还没加载页面,直接取启动参数
|
|
90
|
+
return this.qsQuery(
|
|
91
|
+
getLaunchQuery(enterParams?.query, enterParams?.referrerInfo?.extraData)
|
|
92
|
+
);
|
|
93
|
+
} else {
|
|
94
|
+
// 作为页面组件时component created生命周期中的埋点会取不到页面堆栈,所以拿最近的一个page事件中的页面信息做兜底
|
|
95
|
+
return dataStore.lastPageEvent[trackingId]?.path
|
|
96
|
+
? dataStore.lastPageEvent[trackingId]?.query
|
|
97
|
+
: // 没有最近的一个page事件说明在app初始化的生命周期中,有些框架可能会有异步处理逻辑导致事件触发比visit晚,则使用visit事件中的页面信息兜底
|
|
98
|
+
dataStore.lastVisitEvent[trackingId]?.query;
|
|
56
99
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// 获取页面标题
|
|
103
|
+
// 页面title (优先级:setNavigationBarTitle > data.gioPageTitle[不保证能取到] > config.js中设置的值 > tabBar配置)
|
|
104
|
+
getPageTitle = (trackingId?: string) => {
|
|
105
|
+
const { minipInstance, inPlugin, dataStore } = this.growingIO;
|
|
106
|
+
const path = minipInstance.getCurrentPath();
|
|
107
|
+
const title =
|
|
108
|
+
this.settedTitle[path] ||
|
|
109
|
+
minipInstance.getPageTitle(minipInstance.getCurrentPage());
|
|
110
|
+
if (inPlugin) {
|
|
111
|
+
const vds = dataStore.getTrackerVds(
|
|
112
|
+
trackingId || this.growingIO.trackingId
|
|
63
113
|
);
|
|
114
|
+
// 插件中没有页面时直接将插件appId作为页面信息
|
|
115
|
+
return (
|
|
116
|
+
title || `/插件${vds.appId}${path ? '_' + last(path.split('/')) : ''}`
|
|
117
|
+
);
|
|
118
|
+
} else {
|
|
119
|
+
return title;
|
|
120
|
+
}
|
|
64
121
|
};
|
|
65
122
|
|
|
66
|
-
//
|
|
67
|
-
|
|
123
|
+
// 格式化页面参数
|
|
124
|
+
qsQuery = (query = {}) => {
|
|
68
125
|
const filtQeury = { ...query };
|
|
69
126
|
unset(filtQeury, 'wxShoppingListScene');
|
|
70
127
|
return qsStringify(filtQeury);
|
|
71
128
|
};
|
|
72
129
|
|
|
73
|
-
//
|
|
130
|
+
// 获取页面来源
|
|
74
131
|
getReferralPage = (trackingId: string) => {
|
|
75
132
|
const {
|
|
76
133
|
minipInstance,
|
|
77
|
-
dataStore: { lastPageEvent, scene }
|
|
134
|
+
dataStore: { lastPageEvent, scene, eventHooks }
|
|
78
135
|
} = this.growingIO;
|
|
79
136
|
return (
|
|
80
137
|
lastPageEvent[trackingId]?.path ||
|
|
138
|
+
eventHooks.appEffects.enterParams?.referrerInfo?.appId ||
|
|
81
139
|
(scene ? `scn:${minipInstance.scnPrefix}${scene}` : null)
|
|
82
140
|
);
|
|
83
141
|
};
|
|
@@ -89,7 +147,7 @@ class MinipPage implements MinipPageType {
|
|
|
89
147
|
// 自定义path的地址参数截取(onShareAppMessage中的页面参数是拼在地址中的)
|
|
90
148
|
const customSplit = splitPath(result.path ?? '');
|
|
91
149
|
|
|
92
|
-
let path = this.
|
|
150
|
+
let path = this.getPagePath();
|
|
93
151
|
let parsedQeury: any = {};
|
|
94
152
|
let resultHasPath = has(result, 'path');
|
|
95
153
|
// 优先使用自定义的地址
|
|
@@ -114,7 +172,9 @@ class MinipPage implements MinipPageType {
|
|
|
114
172
|
// 自定义query没有值则使用当前页面默认参数
|
|
115
173
|
// 如果path存在,但是不携带参数,此时不使用当前页面的默认参数
|
|
116
174
|
if (!resultHasPath && isEmpty(parsedQeury)) {
|
|
117
|
-
|
|
175
|
+
const stackPage = this.growingIO.minipInstance.getCurrentPage();
|
|
176
|
+
parsedQeury =
|
|
177
|
+
stackPage.options || this.queryOption[stackPage.route] || {};
|
|
118
178
|
}
|
|
119
179
|
|
|
120
180
|
return [path, qsStringify(parsedQeury)];
|
|
@@ -144,7 +204,9 @@ class MinipPage implements MinipPageType {
|
|
|
144
204
|
|
|
145
205
|
// 给事件合并页面属性
|
|
146
206
|
eventSetPageProps = (trackingId: string, event: EVENT) => {
|
|
147
|
-
const pageProps = niceTry(
|
|
207
|
+
const pageProps = niceTry(
|
|
208
|
+
() => this.pageProps[trackingId][this.getPagePath()]
|
|
209
|
+
);
|
|
148
210
|
if (!isEmpty(pageProps)) {
|
|
149
211
|
return limitObject(
|
|
150
212
|
getDynamicAttributes({
|
|
@@ -6,10 +6,8 @@ import EMIT_MSG from '@@/constants/emitMsg';
|
|
|
6
6
|
class PageEffects {
|
|
7
7
|
public buildTabClickEvent: (tabItem: any) => void;
|
|
8
8
|
private prevEvent: any;
|
|
9
|
-
private argQuery: any;
|
|
10
9
|
constructor(public growingIO: GrowingIOType) {
|
|
11
10
|
this.prevEvent = {};
|
|
12
|
-
this.argQuery = {};
|
|
13
11
|
}
|
|
14
12
|
|
|
15
13
|
main = (page: any, event: PageHookLifeCircle, args: any) => {
|
|
@@ -22,15 +20,15 @@ class PageEffects {
|
|
|
22
20
|
platformConfig,
|
|
23
21
|
dataStore: {
|
|
24
22
|
getTrackerVds,
|
|
23
|
+
getOriginalSource,
|
|
24
|
+
setOriginalSource,
|
|
25
25
|
trackersExecute,
|
|
26
|
-
shareOut,
|
|
27
26
|
eventHooks,
|
|
28
27
|
toggleShareOut,
|
|
29
28
|
buildAppMessageEvent,
|
|
30
29
|
buildTimelineEvent,
|
|
31
30
|
buildAddFavorites
|
|
32
|
-
}
|
|
33
|
-
inPlugin
|
|
31
|
+
}
|
|
34
32
|
}: GrowingIOType = this.growingIO;
|
|
35
33
|
const { currentPage } = eventHooks;
|
|
36
34
|
if (
|
|
@@ -68,43 +66,34 @@ class PageEffects {
|
|
|
68
66
|
currentPage.currentLifecycle = event;
|
|
69
67
|
switch (event) {
|
|
70
68
|
case pageListeners.pageLoad: {
|
|
71
|
-
|
|
69
|
+
// 获取一次页面参数存起来,防止类似支付宝小程序只能通过生命周期获取页面参数或页面堆栈拿不到页面参数,做兜底
|
|
70
|
+
currentPage.queryOption[path] =
|
|
72
71
|
get(page, 'options') ||
|
|
73
72
|
get(page, '__displayReporter.query') ||
|
|
74
73
|
get(page, '$page.query') ||
|
|
75
74
|
get(page, '$wx.__displayReporter.query') ||
|
|
75
|
+
get(page, '$taroParams') ||
|
|
76
76
|
args[0] ||
|
|
77
77
|
{};
|
|
78
|
-
unset(
|
|
79
|
-
currentPage.parsePage(page, this.argQuery[path]);
|
|
78
|
+
unset(currentPage.queryOption[path], '$taroTimestamp');
|
|
80
79
|
break;
|
|
81
80
|
}
|
|
82
81
|
case pageListeners.pageShow: {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
trackersExecute((trackingId: string) => {
|
|
83
|
+
// 检查originalSource内容是否已经被消费,如果没有被消费是同一个页面,说明visit还没被发出去,要更新title
|
|
84
|
+
const originalSource = getOriginalSource(trackingId);
|
|
85
|
+
if (!isEmpty(originalSource) && originalSource.path === path) {
|
|
86
|
+
setOriginalSource(trackingId, {
|
|
87
|
+
...originalSource,
|
|
88
|
+
title: currentPage.getPageTitle()
|
|
89
|
+
});
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
} else if (!shareOut || !eventHooks.currentPage.time) {
|
|
97
|
-
// 不是因为分享切出再返回的onshow(视为第一次进入改页面)和切出去以后因为超时或者进入的场景值不一致时(会在appshow清掉页面时间),发page
|
|
98
|
-
currentPage.parsePage(page, this.argQuery[path]);
|
|
99
|
-
// 超时进入页面时前后path一致parsePage方法不会重置页面时间,可能会没有值,所以要补充重设一次
|
|
100
|
-
eventHooks.currentPage.time = Date.now();
|
|
101
|
-
trackersExecute((trackingId: string) => {
|
|
102
|
-
const { trackPage } = getTrackerVds(trackingId);
|
|
103
|
-
if (trackPage) {
|
|
104
|
-
this.buildPageEvent(trackingId);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
91
|
+
// 发page事件
|
|
92
|
+
const { trackPage } = getTrackerVds(trackingId);
|
|
93
|
+
if (trackPage) {
|
|
94
|
+
this.buildPageEvent(trackingId);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
108
97
|
// 分享标记置为false
|
|
109
98
|
toggleShareOut(false);
|
|
110
99
|
break;
|
|
@@ -165,18 +154,12 @@ class PageEffects {
|
|
|
165
154
|
eventContextBuilder,
|
|
166
155
|
eventInterceptor,
|
|
167
156
|
eventHooks: { currentPage }
|
|
168
|
-
}
|
|
169
|
-
minipInstance
|
|
157
|
+
}
|
|
170
158
|
} = this.growingIO;
|
|
171
159
|
const event = {
|
|
172
160
|
eventType: 'PAGE',
|
|
173
161
|
referralPage: currentPage.getReferralPage(trackingId),
|
|
174
|
-
...eventContextBuilder(trackingId)
|
|
175
|
-
// page事件要单独设一个title以覆盖eventContextBuilder中的lastPage的title错误值
|
|
176
|
-
title:
|
|
177
|
-
currentPage?.title ||
|
|
178
|
-
minipInstance.getPageTitle(minipInstance.getCurrentPage()),
|
|
179
|
-
timestamp: currentPage.time
|
|
162
|
+
...eventContextBuilder(trackingId)
|
|
180
163
|
};
|
|
181
164
|
// 合并页面属性
|
|
182
165
|
event.attributes = currentPage.eventSetPageProps(trackingId, event);
|