@macroui/event-tracker 1.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/LICENSE +21 -0
- package/README.md +343 -0
- package/bin/event-tracker-suggest.mjs +141 -0
- package/bin/event-tracker.mjs +157 -0
- package/dist/event-tracker.cjs +3449 -0
- package/dist/event-tracker.js +3455 -0
- package/dist/event-tracker.min.js +1 -0
- package/dist/event-tracker.mjs +3402 -0
- package/dist/plugin/auto-track.cjs +201 -0
- package/dist/plugin/auto-track.mjs +199 -0
- package/dist/plugin/debug-sender.cjs +214 -0
- package/dist/plugin/debug-sender.mjs +211 -0
- package/dist/plugin/encrypt.cjs +284 -0
- package/dist/plugin/encrypt.mjs +275 -0
- package/dist/plugin/exposure.cjs +121 -0
- package/dist/plugin/exposure.mjs +119 -0
- package/dist/plugin/indexeddb-sender.cjs +94 -0
- package/dist/plugin/indexeddb-sender.mjs +92 -0
- package/dist/plugin/pageleave.cjs +74 -0
- package/dist/plugin/pageleave.mjs +72 -0
- package/dist/plugin/pageload.cjs +198 -0
- package/dist/plugin/pageload.mjs +196 -0
- package/dist/plugin/session-event.cjs +142 -0
- package/dist/plugin/session-event.mjs +140 -0
- package/dist/plugin/webview-bridge.cjs +111 -0
- package/dist/plugin/webview-bridge.mjs +109 -0
- package/dist/types/core/env.d.ts +10 -0
- package/dist/types/core/errors.d.ts +76 -0
- package/dist/types/core/failed-queue.d.ts +24 -0
- package/dist/types/core/identity-api.d.ts +6 -0
- package/dist/types/core/identity.d.ts +39 -0
- package/dist/types/core/instance-channel.d.ts +34 -0
- package/dist/types/core/lifecycle.d.ts +26 -0
- package/dist/types/core/logger.d.ts +13 -0
- package/dist/types/core/plugin.d.ts +60 -0
- package/dist/types/core/profile-api.d.ts +6 -0
- package/dist/types/core/profile-store.d.ts +23 -0
- package/dist/types/core/register-api.d.ts +22 -0
- package/dist/types/core/retry-policy.d.ts +33 -0
- package/dist/types/core/send-pipeline.d.ts +55 -0
- package/dist/types/core/signed-identity.d.ts +29 -0
- package/dist/types/core/stage.d.ts +48 -0
- package/dist/types/core/track-api.d.ts +6 -0
- package/dist/types/core/tracker.d.ts +130 -0
- package/dist/types/core/uuid.d.ts +4 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/plugins/auto-track/index.d.ts +21 -0
- package/dist/types/plugins/debug-sender/index.d.ts +24 -0
- package/dist/types/plugins/encrypt/index.d.ts +56 -0
- package/dist/types/plugins/exposure/index.d.ts +18 -0
- package/dist/types/plugins/indexeddb-sender/index.d.ts +15 -0
- package/dist/types/plugins/pageleave/index.d.ts +12 -0
- package/dist/types/plugins/pageload/index.d.ts +14 -0
- package/dist/types/plugins/session-event/index.d.ts +14 -0
- package/dist/types/plugins/webview-bridge/index.d.ts +33 -0
- package/dist/types/presets/preset-properties.d.ts +25 -0
- package/dist/types/send/ajax-sender.d.ts +11 -0
- package/dist/types/send/batch-sender.d.ts +17 -0
- package/dist/types/send/beacon-sender.d.ts +10 -0
- package/dist/types/send/encode.d.ts +8 -0
- package/dist/types/send/image-sender.d.ts +10 -0
- package/dist/types/send/sender.d.ts +20 -0
- package/dist/types/storage/indexeddb-store.d.ts +14 -0
- package/dist/types/storage/store.d.ts +56 -0
- package/dist/types/types/common.d.ts +26 -0
- package/dist/types/types/config.d.ts +117 -0
- package/dist/types/types/constants.d.ts +110 -0
- package/dist/types/types/index.d.ts +25 -0
- package/dist/types/types.test-d.d.ts +5 -0
- package/dist/types.test-d.ts +103 -0
- package/package.json +218 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器端辅助方法
|
|
3
|
+
*/
|
|
4
|
+
function isBrowser() {
|
|
5
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 序列化 & 编码
|
|
10
|
+
*/
|
|
11
|
+
function encodeEvent(event, encryptor) {
|
|
12
|
+
var json = JSON.stringify(event);
|
|
13
|
+
return json;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* indexeddb-sender 插件:把事件写到 IndexedDB(用于离线缓存 / 批量消费)
|
|
18
|
+
* - 不实际发送,只把序列化事件追加到指定 IDB store
|
|
19
|
+
* - 适合后续被 webview bridge / native / service worker 消费
|
|
20
|
+
*/
|
|
21
|
+
function indexedDBSender(opts) {
|
|
22
|
+
if (opts === void 0) { opts = {}; }
|
|
23
|
+
var dbName = opts.dbName || 'event-tracker-outbox';
|
|
24
|
+
var storeName = opts.storeName || 'outbox';
|
|
25
|
+
var max = opts.max || 500;
|
|
26
|
+
var dbPromise = null;
|
|
27
|
+
function openDB() {
|
|
28
|
+
if (!isBrowser() || typeof indexedDB === 'undefined')
|
|
29
|
+
return Promise.resolve(null);
|
|
30
|
+
return new Promise(function (resolve) {
|
|
31
|
+
try {
|
|
32
|
+
var req_1 = indexedDB.open(dbName, 1);
|
|
33
|
+
req_1.onupgradeneeded = function () {
|
|
34
|
+
var db = req_1.result;
|
|
35
|
+
if (!db.objectStoreNames.contains(storeName)) {
|
|
36
|
+
db.createObjectStore(storeName, { autoIncrement: true });
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
req_1.onsuccess = function () { return resolve(req_1.result); };
|
|
40
|
+
req_1.onerror = function () { return resolve(null); };
|
|
41
|
+
}
|
|
42
|
+
catch (_a) {
|
|
43
|
+
resolve(null);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
var interceptor = {
|
|
48
|
+
name: 'indexeddb-sender',
|
|
49
|
+
priority: 60,
|
|
50
|
+
entry: function (ctx) {
|
|
51
|
+
if (ctx.meta.stage !== 'sendDataStage')
|
|
52
|
+
return;
|
|
53
|
+
var ev = ctx.data;
|
|
54
|
+
dbPromise !== null && dbPromise !== void 0 ? dbPromise : (dbPromise = openDB());
|
|
55
|
+
dbPromise.then(function (db) {
|
|
56
|
+
if (!db)
|
|
57
|
+
return;
|
|
58
|
+
try {
|
|
59
|
+
var tx = db.transaction(storeName, 'readwrite');
|
|
60
|
+
var store_1 = tx.objectStore(storeName);
|
|
61
|
+
var payload_1 = encodeEvent(ev);
|
|
62
|
+
// 限制大小:> max 则删头
|
|
63
|
+
var cntReq_1 = store_1.count();
|
|
64
|
+
cntReq_1.onsuccess = function () {
|
|
65
|
+
if (cntReq_1.result >= max) {
|
|
66
|
+
store_1.delete(IDBKeyRange.lowerBound(0, true));
|
|
67
|
+
}
|
|
68
|
+
store_1.add({ time: Date.now(), payload: payload_1 });
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (_a) {
|
|
72
|
+
/* ignore */
|
|
73
|
+
}
|
|
74
|
+
}).catch(function () { });
|
|
75
|
+
return ev;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
name: 'indexeddb-sender',
|
|
80
|
+
install: function (_a) {
|
|
81
|
+
var stages = _a.stages;
|
|
82
|
+
if (!isBrowser())
|
|
83
|
+
return;
|
|
84
|
+
stages.sendDataStage.register(interceptor);
|
|
85
|
+
},
|
|
86
|
+
uninstall: function () {
|
|
87
|
+
dbPromise = null;
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export { indexedDBSender };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 浏览器端辅助方法
|
|
5
|
+
*/
|
|
6
|
+
function isBrowser() {
|
|
7
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
|
|
12
|
+
* 命名风格对齐神策,方便跨平台对接
|
|
13
|
+
*/
|
|
14
|
+
/** 预置事件名 */
|
|
15
|
+
var PresetEvent = {
|
|
16
|
+
WebPageLeave: '$WebPageLeave'};
|
|
17
|
+
/** 预置属性 key */
|
|
18
|
+
var PresetProperty = {
|
|
19
|
+
URLPath: '$url_path',
|
|
20
|
+
Title: '$title',
|
|
21
|
+
EventDuration: '$event_duration',
|
|
22
|
+
ViewportPosition: '$viewport_position'};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* pageleave 插件:用户离开页面(关闭、跳转、切到后台)时上报
|
|
26
|
+
* - $WebPageLeave 事件
|
|
27
|
+
* - 包含 $event_duration / $url_path / $referrer / $viewport_position
|
|
28
|
+
* - 包含 page_visible 标记(visibilitychange API)
|
|
29
|
+
*/
|
|
30
|
+
function pageLeave(_opts) {
|
|
31
|
+
var sdkRef = null;
|
|
32
|
+
var enterTime = Date.now();
|
|
33
|
+
function fire(reason) {
|
|
34
|
+
var _a;
|
|
35
|
+
if (!sdkRef)
|
|
36
|
+
return;
|
|
37
|
+
var dur = Date.now() - enterTime;
|
|
38
|
+
sdkRef.track(PresetEvent.WebPageLeave, (_a = {},
|
|
39
|
+
_a[PresetProperty.EventDuration] = dur,
|
|
40
|
+
_a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
|
|
41
|
+
_a[PresetProperty.Title] = document.title,
|
|
42
|
+
_a[PresetProperty.ViewportPosition] = window.scrollY || 0,
|
|
43
|
+
_a.$page_leave_reason = reason,
|
|
44
|
+
_a));
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
name: 'pageleave',
|
|
48
|
+
install: function (_a) {
|
|
49
|
+
var sdk = _a.sdk;
|
|
50
|
+
if (!isBrowser())
|
|
51
|
+
return;
|
|
52
|
+
sdkRef = sdk;
|
|
53
|
+
enterTime = Date.now();
|
|
54
|
+
// 重新进入页面时刷新 enterTime
|
|
55
|
+
var onVisible = function () {
|
|
56
|
+
if (document.visibilityState === 'visible')
|
|
57
|
+
enterTime = Date.now();
|
|
58
|
+
};
|
|
59
|
+
document.addEventListener('visibilitychange', onVisible);
|
|
60
|
+
// 关闭/离开
|
|
61
|
+
window.addEventListener('pagehide', function () { return fire('pagehide'); });
|
|
62
|
+
window.addEventListener('beforeunload', function () { return fire('unload'); });
|
|
63
|
+
document.addEventListener('visibilitychange', function () {
|
|
64
|
+
if (document.visibilityState === 'hidden')
|
|
65
|
+
fire('hidden');
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
uninstall: function () {
|
|
69
|
+
sdkRef = null;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.pageLeave = pageLeave;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器端辅助方法
|
|
3
|
+
*/
|
|
4
|
+
function isBrowser() {
|
|
5
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
|
|
10
|
+
* 命名风格对齐神策,方便跨平台对接
|
|
11
|
+
*/
|
|
12
|
+
/** 预置事件名 */
|
|
13
|
+
var PresetEvent = {
|
|
14
|
+
WebPageLeave: '$WebPageLeave'};
|
|
15
|
+
/** 预置属性 key */
|
|
16
|
+
var PresetProperty = {
|
|
17
|
+
URLPath: '$url_path',
|
|
18
|
+
Title: '$title',
|
|
19
|
+
EventDuration: '$event_duration',
|
|
20
|
+
ViewportPosition: '$viewport_position'};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* pageleave 插件:用户离开页面(关闭、跳转、切到后台)时上报
|
|
24
|
+
* - $WebPageLeave 事件
|
|
25
|
+
* - 包含 $event_duration / $url_path / $referrer / $viewport_position
|
|
26
|
+
* - 包含 page_visible 标记(visibilitychange API)
|
|
27
|
+
*/
|
|
28
|
+
function pageLeave(_opts) {
|
|
29
|
+
var sdkRef = null;
|
|
30
|
+
var enterTime = Date.now();
|
|
31
|
+
function fire(reason) {
|
|
32
|
+
var _a;
|
|
33
|
+
if (!sdkRef)
|
|
34
|
+
return;
|
|
35
|
+
var dur = Date.now() - enterTime;
|
|
36
|
+
sdkRef.track(PresetEvent.WebPageLeave, (_a = {},
|
|
37
|
+
_a[PresetProperty.EventDuration] = dur,
|
|
38
|
+
_a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
|
|
39
|
+
_a[PresetProperty.Title] = document.title,
|
|
40
|
+
_a[PresetProperty.ViewportPosition] = window.scrollY || 0,
|
|
41
|
+
_a.$page_leave_reason = reason,
|
|
42
|
+
_a));
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
name: 'pageleave',
|
|
46
|
+
install: function (_a) {
|
|
47
|
+
var sdk = _a.sdk;
|
|
48
|
+
if (!isBrowser())
|
|
49
|
+
return;
|
|
50
|
+
sdkRef = sdk;
|
|
51
|
+
enterTime = Date.now();
|
|
52
|
+
// 重新进入页面时刷新 enterTime
|
|
53
|
+
var onVisible = function () {
|
|
54
|
+
if (document.visibilityState === 'visible')
|
|
55
|
+
enterTime = Date.now();
|
|
56
|
+
};
|
|
57
|
+
document.addEventListener('visibilitychange', onVisible);
|
|
58
|
+
// 关闭/离开
|
|
59
|
+
window.addEventListener('pagehide', function () { return fire('pagehide'); });
|
|
60
|
+
window.addEventListener('beforeunload', function () { return fire('unload'); });
|
|
61
|
+
document.addEventListener('visibilitychange', function () {
|
|
62
|
+
if (document.visibilityState === 'hidden')
|
|
63
|
+
fire('hidden');
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
uninstall: function () {
|
|
67
|
+
sdkRef = null;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { pageLeave };
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 浏览器端辅助方法
|
|
5
|
+
*/
|
|
6
|
+
function isBrowser() {
|
|
7
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
|
|
12
|
+
* 命名风格对齐神策,方便跨平台对接
|
|
13
|
+
*/
|
|
14
|
+
/** 预置事件名 */
|
|
15
|
+
var PresetEvent = {
|
|
16
|
+
WebPageLoad: '$WebPageLoad'};
|
|
17
|
+
/** 预置属性 key */
|
|
18
|
+
var PresetProperty = {
|
|
19
|
+
// 设备 / 环境
|
|
20
|
+
AppId: '$app_id',
|
|
21
|
+
AppVersion: '$app_version',
|
|
22
|
+
Lib: '$lib',
|
|
23
|
+
LibMethod: '$lib_method',
|
|
24
|
+
LibDetail: '$lib_detail',
|
|
25
|
+
LibVersion: '$lib_version',
|
|
26
|
+
ScreenWidth: '$screen_width',
|
|
27
|
+
ScreenHeight: '$screen_height',
|
|
28
|
+
ViewportWidth: '$viewport_width',
|
|
29
|
+
ViewportHeight: '$viewport_height',
|
|
30
|
+
TimezoneOffset: '$timezone_offset',
|
|
31
|
+
UserAgent: '$user_agent',
|
|
32
|
+
Language: '$language',
|
|
33
|
+
FirstBrowserCharset: '$first_browser_charset',
|
|
34
|
+
FirstBrowserLanguage: '$first_browser_language',
|
|
35
|
+
// 位置 / 流量来源
|
|
36
|
+
URL: '$url',
|
|
37
|
+
URLPath: '$url_path',
|
|
38
|
+
Title: '$title',
|
|
39
|
+
Referrer: '$referrer',
|
|
40
|
+
ReferrerHost: '$referrer_host',
|
|
41
|
+
LatestReferrer: '$latest_referrer',
|
|
42
|
+
LatestReferrerHost: '$latest_referrer_host',
|
|
43
|
+
LatestLandingPage: '$latest_landing_page',
|
|
44
|
+
LatestSearchKeyword: '$latest_search_keyword',
|
|
45
|
+
LatestTrafficSourceType: '$latest_traffic_source_type',
|
|
46
|
+
FirstReferrer: '$first_referrer',
|
|
47
|
+
FirstReferrerHost: '$first_referrer_host',
|
|
48
|
+
FirstSearchKeyword: '$first_search_keyword',
|
|
49
|
+
FirstTrafficSourceType: '$first_traffic_source_type',
|
|
50
|
+
FirstVisitTime: '$first_visit_time',
|
|
51
|
+
SearchKeywordId: '$search_keyword_id',
|
|
52
|
+
SearchKeywordIdHash: '$search_keyword_id_hash',
|
|
53
|
+
SearchKeywordIdType: '$search_keyword_id_type',
|
|
54
|
+
IsFirstDay: '$is_first_day',
|
|
55
|
+
IsFirstTime: '$is_first_time',
|
|
56
|
+
// UTM
|
|
57
|
+
LatestUtmSource: '$latest_utm_source',
|
|
58
|
+
LatestUtmMedium: '$latest_utm_medium',
|
|
59
|
+
LatestUtmCampaign: '$latest_utm_campaign',
|
|
60
|
+
LatestUtmContent: '$latest_utm_content',
|
|
61
|
+
LatestUtmTerm: '$latest_utm_term',
|
|
62
|
+
Utms: '$utms',
|
|
63
|
+
// 身份
|
|
64
|
+
DistinctId: '$distinct_id',
|
|
65
|
+
AnonymousId: '$anonymous_id',
|
|
66
|
+
FirstId: '$first_id',
|
|
67
|
+
OriginalId: '$original_id',
|
|
68
|
+
LoginId: '$login_id',
|
|
69
|
+
IsLoginId: '$is_login_id',
|
|
70
|
+
IdentityLoginId: '$identity_login_id',
|
|
71
|
+
IdentityAnonymousId: '$identity_anonymous_id',
|
|
72
|
+
IdentityCookieId: '$identity_cookie_id',
|
|
73
|
+
IdentityEmail: '$identity_email',
|
|
74
|
+
IdentityMobile: '$identity_mobile',
|
|
75
|
+
// 全埋点元素属性
|
|
76
|
+
ElementSelector: '$element_selector',
|
|
77
|
+
ElementPath: '$element_path',
|
|
78
|
+
ElementType: '$element_type',
|
|
79
|
+
ElementId: '$element_id',
|
|
80
|
+
ElementClassName: '$element_class_name',
|
|
81
|
+
ElementName: '$element_name',
|
|
82
|
+
ElementContent: '$element_content',
|
|
83
|
+
ElementTargetUrl: '$element_target_url',
|
|
84
|
+
ElementPosition: '$element_position',
|
|
85
|
+
PageX: '$page_x',
|
|
86
|
+
PageY: '$page_y',
|
|
87
|
+
// 性能
|
|
88
|
+
PageHeight: '$page_height',
|
|
89
|
+
PageResourceSize: '$page_resource_size',
|
|
90
|
+
EventDuration: '$event_duration',
|
|
91
|
+
ViewportPosition: '$viewport_position',
|
|
92
|
+
// 渠道
|
|
93
|
+
LatestWxAdClickId: '$latest_wx_ad_click_id',
|
|
94
|
+
LatestWxAdCallbacks: '$latest_wx_ad_callbacks',
|
|
95
|
+
LatestWxAdHashKey: '$latest_wx_ad_hash_key',
|
|
96
|
+
IsChannelCallbackEvent: '$is_channel_callback_event',
|
|
97
|
+
// 会话
|
|
98
|
+
EventSessionId: '$event_session_id',
|
|
99
|
+
// 元信息
|
|
100
|
+
Time: '$time',
|
|
101
|
+
Event: '$event',
|
|
102
|
+
Option: '$option',
|
|
103
|
+
Project: '$project',
|
|
104
|
+
Token: '$token',
|
|
105
|
+
// 特殊
|
|
106
|
+
SignupMethod: '$signup_method',
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* pageload 插件:performance API 采集首屏加载性能
|
|
111
|
+
* - $WebPageLoad 事件,包含:
|
|
112
|
+
* $load_time / $dom_ready_time / $dom_interactive_time / $response_time
|
|
113
|
+
* $page_resource_size / $page_height / $viewport_position
|
|
114
|
+
*/
|
|
115
|
+
function pageLoad(opts) {
|
|
116
|
+
if (opts === void 0) { opts = {}; }
|
|
117
|
+
var sdkRef = null;
|
|
118
|
+
function fire() {
|
|
119
|
+
var _a;
|
|
120
|
+
if (!sdkRef)
|
|
121
|
+
return;
|
|
122
|
+
var props = (_a = {},
|
|
123
|
+
_a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
|
|
124
|
+
_a[PresetProperty.Title] = document.title,
|
|
125
|
+
_a);
|
|
126
|
+
// 尝试 performance API
|
|
127
|
+
try {
|
|
128
|
+
var perf = (typeof performance !== 'undefined' ? performance : null);
|
|
129
|
+
if (perf) {
|
|
130
|
+
var nav = perf.getEntriesByType('navigation')[0];
|
|
131
|
+
if (nav) {
|
|
132
|
+
if (typeof nav.domContentLoadedEventEnd === 'number') {
|
|
133
|
+
props['$dom_ready_time'] = Math.round(nav.domContentLoadedEventEnd - nav.startTime);
|
|
134
|
+
}
|
|
135
|
+
if (typeof nav.domInteractive === 'number') {
|
|
136
|
+
props['$dom_interactive_time'] = Math.round(nav.domInteractive - nav.startTime);
|
|
137
|
+
}
|
|
138
|
+
if (typeof nav.loadEventEnd === 'number' && typeof nav.startTime === 'number') {
|
|
139
|
+
props['$load_time'] = Math.round(nav.loadEventEnd - nav.startTime);
|
|
140
|
+
}
|
|
141
|
+
if (typeof nav.responseEnd === 'number' && typeof nav.requestStart === 'number') {
|
|
142
|
+
props['$response_time'] = Math.round(nav.responseEnd - nav.requestStart);
|
|
143
|
+
}
|
|
144
|
+
if (typeof nav.transferSize === 'number') {
|
|
145
|
+
props[PresetProperty.PageResourceSize] = nav.transferSize;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// paint
|
|
149
|
+
var fp = perf.getEntriesByName('first-paint')[0];
|
|
150
|
+
var fcp = perf.getEntriesByName('first-contentful-paint')[0];
|
|
151
|
+
if (fp)
|
|
152
|
+
props['$first_paint'] = Math.round(fp.startTime);
|
|
153
|
+
if (fcp)
|
|
154
|
+
props['$first_contentful_paint'] = Math.round(fcp.startTime);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (_b) {
|
|
158
|
+
/* ignore */
|
|
159
|
+
}
|
|
160
|
+
// 页面尺寸
|
|
161
|
+
try {
|
|
162
|
+
if (document.documentElement) {
|
|
163
|
+
props[PresetProperty.PageHeight] = document.documentElement.scrollHeight;
|
|
164
|
+
props[PresetProperty.ViewportPosition] = window.scrollY || 0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (_c) {
|
|
168
|
+
/* ignore */
|
|
169
|
+
}
|
|
170
|
+
sdkRef.track(PresetEvent.WebPageLoad, props);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
name: 'pageload',
|
|
174
|
+
install: function (_a) {
|
|
175
|
+
var sdk = _a.sdk;
|
|
176
|
+
if (!isBrowser())
|
|
177
|
+
return;
|
|
178
|
+
sdkRef = sdk;
|
|
179
|
+
var fireNow = opts.immediate !== false;
|
|
180
|
+
if (document.readyState === 'complete') {
|
|
181
|
+
if (fireNow)
|
|
182
|
+
fire();
|
|
183
|
+
else
|
|
184
|
+
window.addEventListener('load', fire, { once: true });
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
window.addEventListener('load', function () {
|
|
188
|
+
if (fireNow)
|
|
189
|
+
fire();
|
|
190
|
+
else
|
|
191
|
+
setTimeout(fire, 0);
|
|
192
|
+
}, { once: true });
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
exports.pageLoad = pageLoad;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器端辅助方法
|
|
3
|
+
*/
|
|
4
|
+
function isBrowser() {
|
|
5
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
|
|
10
|
+
* 命名风格对齐神策,方便跨平台对接
|
|
11
|
+
*/
|
|
12
|
+
/** 预置事件名 */
|
|
13
|
+
var PresetEvent = {
|
|
14
|
+
WebPageLoad: '$WebPageLoad'};
|
|
15
|
+
/** 预置属性 key */
|
|
16
|
+
var PresetProperty = {
|
|
17
|
+
// 设备 / 环境
|
|
18
|
+
AppId: '$app_id',
|
|
19
|
+
AppVersion: '$app_version',
|
|
20
|
+
Lib: '$lib',
|
|
21
|
+
LibMethod: '$lib_method',
|
|
22
|
+
LibDetail: '$lib_detail',
|
|
23
|
+
LibVersion: '$lib_version',
|
|
24
|
+
ScreenWidth: '$screen_width',
|
|
25
|
+
ScreenHeight: '$screen_height',
|
|
26
|
+
ViewportWidth: '$viewport_width',
|
|
27
|
+
ViewportHeight: '$viewport_height',
|
|
28
|
+
TimezoneOffset: '$timezone_offset',
|
|
29
|
+
UserAgent: '$user_agent',
|
|
30
|
+
Language: '$language',
|
|
31
|
+
FirstBrowserCharset: '$first_browser_charset',
|
|
32
|
+
FirstBrowserLanguage: '$first_browser_language',
|
|
33
|
+
// 位置 / 流量来源
|
|
34
|
+
URL: '$url',
|
|
35
|
+
URLPath: '$url_path',
|
|
36
|
+
Title: '$title',
|
|
37
|
+
Referrer: '$referrer',
|
|
38
|
+
ReferrerHost: '$referrer_host',
|
|
39
|
+
LatestReferrer: '$latest_referrer',
|
|
40
|
+
LatestReferrerHost: '$latest_referrer_host',
|
|
41
|
+
LatestLandingPage: '$latest_landing_page',
|
|
42
|
+
LatestSearchKeyword: '$latest_search_keyword',
|
|
43
|
+
LatestTrafficSourceType: '$latest_traffic_source_type',
|
|
44
|
+
FirstReferrer: '$first_referrer',
|
|
45
|
+
FirstReferrerHost: '$first_referrer_host',
|
|
46
|
+
FirstSearchKeyword: '$first_search_keyword',
|
|
47
|
+
FirstTrafficSourceType: '$first_traffic_source_type',
|
|
48
|
+
FirstVisitTime: '$first_visit_time',
|
|
49
|
+
SearchKeywordId: '$search_keyword_id',
|
|
50
|
+
SearchKeywordIdHash: '$search_keyword_id_hash',
|
|
51
|
+
SearchKeywordIdType: '$search_keyword_id_type',
|
|
52
|
+
IsFirstDay: '$is_first_day',
|
|
53
|
+
IsFirstTime: '$is_first_time',
|
|
54
|
+
// UTM
|
|
55
|
+
LatestUtmSource: '$latest_utm_source',
|
|
56
|
+
LatestUtmMedium: '$latest_utm_medium',
|
|
57
|
+
LatestUtmCampaign: '$latest_utm_campaign',
|
|
58
|
+
LatestUtmContent: '$latest_utm_content',
|
|
59
|
+
LatestUtmTerm: '$latest_utm_term',
|
|
60
|
+
Utms: '$utms',
|
|
61
|
+
// 身份
|
|
62
|
+
DistinctId: '$distinct_id',
|
|
63
|
+
AnonymousId: '$anonymous_id',
|
|
64
|
+
FirstId: '$first_id',
|
|
65
|
+
OriginalId: '$original_id',
|
|
66
|
+
LoginId: '$login_id',
|
|
67
|
+
IsLoginId: '$is_login_id',
|
|
68
|
+
IdentityLoginId: '$identity_login_id',
|
|
69
|
+
IdentityAnonymousId: '$identity_anonymous_id',
|
|
70
|
+
IdentityCookieId: '$identity_cookie_id',
|
|
71
|
+
IdentityEmail: '$identity_email',
|
|
72
|
+
IdentityMobile: '$identity_mobile',
|
|
73
|
+
// 全埋点元素属性
|
|
74
|
+
ElementSelector: '$element_selector',
|
|
75
|
+
ElementPath: '$element_path',
|
|
76
|
+
ElementType: '$element_type',
|
|
77
|
+
ElementId: '$element_id',
|
|
78
|
+
ElementClassName: '$element_class_name',
|
|
79
|
+
ElementName: '$element_name',
|
|
80
|
+
ElementContent: '$element_content',
|
|
81
|
+
ElementTargetUrl: '$element_target_url',
|
|
82
|
+
ElementPosition: '$element_position',
|
|
83
|
+
PageX: '$page_x',
|
|
84
|
+
PageY: '$page_y',
|
|
85
|
+
// 性能
|
|
86
|
+
PageHeight: '$page_height',
|
|
87
|
+
PageResourceSize: '$page_resource_size',
|
|
88
|
+
EventDuration: '$event_duration',
|
|
89
|
+
ViewportPosition: '$viewport_position',
|
|
90
|
+
// 渠道
|
|
91
|
+
LatestWxAdClickId: '$latest_wx_ad_click_id',
|
|
92
|
+
LatestWxAdCallbacks: '$latest_wx_ad_callbacks',
|
|
93
|
+
LatestWxAdHashKey: '$latest_wx_ad_hash_key',
|
|
94
|
+
IsChannelCallbackEvent: '$is_channel_callback_event',
|
|
95
|
+
// 会话
|
|
96
|
+
EventSessionId: '$event_session_id',
|
|
97
|
+
// 元信息
|
|
98
|
+
Time: '$time',
|
|
99
|
+
Event: '$event',
|
|
100
|
+
Option: '$option',
|
|
101
|
+
Project: '$project',
|
|
102
|
+
Token: '$token',
|
|
103
|
+
// 特殊
|
|
104
|
+
SignupMethod: '$signup_method',
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* pageload 插件:performance API 采集首屏加载性能
|
|
109
|
+
* - $WebPageLoad 事件,包含:
|
|
110
|
+
* $load_time / $dom_ready_time / $dom_interactive_time / $response_time
|
|
111
|
+
* $page_resource_size / $page_height / $viewport_position
|
|
112
|
+
*/
|
|
113
|
+
function pageLoad(opts) {
|
|
114
|
+
if (opts === void 0) { opts = {}; }
|
|
115
|
+
var sdkRef = null;
|
|
116
|
+
function fire() {
|
|
117
|
+
var _a;
|
|
118
|
+
if (!sdkRef)
|
|
119
|
+
return;
|
|
120
|
+
var props = (_a = {},
|
|
121
|
+
_a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
|
|
122
|
+
_a[PresetProperty.Title] = document.title,
|
|
123
|
+
_a);
|
|
124
|
+
// 尝试 performance API
|
|
125
|
+
try {
|
|
126
|
+
var perf = (typeof performance !== 'undefined' ? performance : null);
|
|
127
|
+
if (perf) {
|
|
128
|
+
var nav = perf.getEntriesByType('navigation')[0];
|
|
129
|
+
if (nav) {
|
|
130
|
+
if (typeof nav.domContentLoadedEventEnd === 'number') {
|
|
131
|
+
props['$dom_ready_time'] = Math.round(nav.domContentLoadedEventEnd - nav.startTime);
|
|
132
|
+
}
|
|
133
|
+
if (typeof nav.domInteractive === 'number') {
|
|
134
|
+
props['$dom_interactive_time'] = Math.round(nav.domInteractive - nav.startTime);
|
|
135
|
+
}
|
|
136
|
+
if (typeof nav.loadEventEnd === 'number' && typeof nav.startTime === 'number') {
|
|
137
|
+
props['$load_time'] = Math.round(nav.loadEventEnd - nav.startTime);
|
|
138
|
+
}
|
|
139
|
+
if (typeof nav.responseEnd === 'number' && typeof nav.requestStart === 'number') {
|
|
140
|
+
props['$response_time'] = Math.round(nav.responseEnd - nav.requestStart);
|
|
141
|
+
}
|
|
142
|
+
if (typeof nav.transferSize === 'number') {
|
|
143
|
+
props[PresetProperty.PageResourceSize] = nav.transferSize;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// paint
|
|
147
|
+
var fp = perf.getEntriesByName('first-paint')[0];
|
|
148
|
+
var fcp = perf.getEntriesByName('first-contentful-paint')[0];
|
|
149
|
+
if (fp)
|
|
150
|
+
props['$first_paint'] = Math.round(fp.startTime);
|
|
151
|
+
if (fcp)
|
|
152
|
+
props['$first_contentful_paint'] = Math.round(fcp.startTime);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (_b) {
|
|
156
|
+
/* ignore */
|
|
157
|
+
}
|
|
158
|
+
// 页面尺寸
|
|
159
|
+
try {
|
|
160
|
+
if (document.documentElement) {
|
|
161
|
+
props[PresetProperty.PageHeight] = document.documentElement.scrollHeight;
|
|
162
|
+
props[PresetProperty.ViewportPosition] = window.scrollY || 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (_c) {
|
|
166
|
+
/* ignore */
|
|
167
|
+
}
|
|
168
|
+
sdkRef.track(PresetEvent.WebPageLoad, props);
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
name: 'pageload',
|
|
172
|
+
install: function (_a) {
|
|
173
|
+
var sdk = _a.sdk;
|
|
174
|
+
if (!isBrowser())
|
|
175
|
+
return;
|
|
176
|
+
sdkRef = sdk;
|
|
177
|
+
var fireNow = opts.immediate !== false;
|
|
178
|
+
if (document.readyState === 'complete') {
|
|
179
|
+
if (fireNow)
|
|
180
|
+
fire();
|
|
181
|
+
else
|
|
182
|
+
window.addEventListener('load', fire, { once: true });
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
window.addEventListener('load', function () {
|
|
186
|
+
if (fireNow)
|
|
187
|
+
fire();
|
|
188
|
+
else
|
|
189
|
+
setTimeout(fire, 0);
|
|
190
|
+
}, { once: true });
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export { pageLoad };
|