diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..b3851f83b289b6b9f9df6d474df4345146084979 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry=http://registry.npmmirror.com diff --git a/packages/analytics/README.md b/packages/analytics/README.md index b74ce25822450f986530eb25210cbf9f1f5656df..429483859143ffaac20069f4ad52cb0a9c643a64 100644 --- a/packages/analytics/README.md +++ b/packages/analytics/README.md @@ -22,3 +22,13 @@ 1. 事件数据字段从 data 更改为 properties; 2. 修复导入时自运行 storage,导致服务端渲染报错问题; + +# 0.0.6 + +1. 内置事件字段添加前缀"$" +2. cid,sid 使用 uuid 生成 + +# TODO + +1. 支持在 html 引入; +2. 支持错误告警上报; diff --git a/packages/analytics/package.json b/packages/analytics/package.json index a2f3cbfc8f4338cd5d17d1eb6a8fdc0e94ee15a9..ad77b2d6eb6ea9e450f6fc10731bc58b4f449a69 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -1,6 +1,6 @@ { "name": "@opensig/open-analytics", - "version": "0.0.5", + "version": "0.0.6", "description": "opendesign analytics", "main": "dist/open-analytics.mjs", "types": "dist/open-analytics.d.ts", @@ -14,12 +14,14 @@ }, "devDependencies": { "@types/ua-parser-js": "^0.7.39", + "@types/uuid": "^10.0.0", "typescript": "~5.3.3", "vite": "^5.3.4", "vite-plugin-dts": "^3.7.3" }, "dependencies": { "ua-parser-js": "^1.0.38", + "uuid": "^10.0.0", "web-vitals": "^4.2.2" }, "publishConfig": { diff --git a/packages/analytics/src/constant.ts b/packages/analytics/src/constant.ts index ba2632bf98c0c5cde95c1ce24e8541d633a1ddcd..13d198a6a7db58553fd3df213cda7a2ece3cc945 100644 --- a/packages/analytics/src/constant.ts +++ b/packages/analytics/src/constant.ts @@ -1,6 +1,5 @@ export const Constant = { OA_PREFIX: 'oa', // 本地存储key的前缀 - ID_LENGTH: 36, // 标识id长度 OA_ENABLED: '1', // 开启采集标识 OA_DISABLED: '0', // 关闭采集标识 SESSION_EXPIRE_TIME: 30 * 60 * 1000, // 会话标识有效期 diff --git a/packages/analytics/src/events/click.ts b/packages/analytics/src/events/click.ts index a2ba36daccf3ffc1e5bf57b030235a66f8c44790..4b8b83792be7cdcae15ae8691fa07f34cffcc58f 100644 --- a/packages/analytics/src/events/click.ts +++ b/packages/analytics/src/events/click.ts @@ -9,11 +9,11 @@ async function handleClick(e: MouseEvent, customData?: (event: MouseEvent) => Pr const cData = isFunction(customData) ? await customData(e) : {}; return { - url: window.location.href, - pageX, - pageY, - documentScrollLeft: scrollLeft, - documentScrollTop: scrollTop, + $url: window.location.href, + $pageX: pageX, + $pageY: pageY, + $documentScrollLeft: scrollLeft, + $documentScrollTop: scrollTop, ...cData, }; } diff --git a/packages/analytics/src/events/inp.ts b/packages/analytics/src/events/inp.ts index a3641118e5b69241eacbb1f59d9e402884d1fba2..c35d690a4e0be79baebdc708a53f5d3c83b3af94 100644 --- a/packages/analytics/src/events/inp.ts +++ b/packages/analytics/src/events/inp.ts @@ -7,8 +7,8 @@ export default { return new Promise((resolve) => { onINP((m) => { resolve({ - url: window.location.href, - inp: m.value, + $url: window.location.href, + $inp: m.value, }); }); }); diff --git a/packages/analytics/src/events/lcp.ts b/packages/analytics/src/events/lcp.ts index 397ba62e0d1014bd7f4fee7b22afc0883558e207..5596366dd1ad5a1e2675cf4dc97378d703c53ab8 100644 --- a/packages/analytics/src/events/lcp.ts +++ b/packages/analytics/src/events/lcp.ts @@ -7,8 +7,8 @@ export default { return new Promise((resolve) => { onLCP((m) => { resolve({ - url: window.location.href, - lcp: m.value, + $url: window.location.href, + $lcp: m.value, }); }); }); diff --git a/packages/analytics/src/events/performance.ts b/packages/analytics/src/events/performance.ts index 63630949f2bfa201730c4ffcd2c5ee9929b99434..cc16d2584e353fe4f254a1776dc3680b79e3b8f3 100644 --- a/packages/analytics/src/events/performance.ts +++ b/packages/analytics/src/events/performance.ts @@ -2,12 +2,12 @@ import { OpenEventKeys } from './_keys'; import { onFCP, onTTFB } from 'web-vitals'; interface PerformanceData { - url: string; - fcp: number; - ttfb: number; - load: number; - navigationEntry?: PerformanceNavigationTiming; - connection: { + $url: string; + $fcp: number; + $ttfb: number; + $load: number; + $navigationEntry?: PerformanceNavigationTiming; + $connection: { downlink: Megabit; // 有效带宽估算(单位:Mbps/s) effectiveType: EffectiveConnectionType; // 连接的有效类型 rtt: Millisecond; // 当前连接的往返时延评估 @@ -29,11 +29,11 @@ export default { collector: () => { return new Promise((resolve) => { const data: PerformanceData = { - url: window.location.href, - fcp: -1, - ttfb: -1, - load: -1, - connection: getConnection(), + $url: window.location.href, + $fcp: -1, + $ttfb: -1, + $load: -1, + $connection: getConnection(), }; let doneFcp = false; let doneTtfb = false; @@ -45,16 +45,16 @@ export default { }; onFCP((m) => { - data.fcp = m.value; + data.$fcp = m.value; doneFcp = true; doResolve(); }); onTTFB((m) => { doneTtfb = true; const entry = m.entries[0]; - data.ttfb = m.value; - data.navigationEntry = entry; - data.load = entry.domComplete - entry.startTime; + data.$ttfb = m.value; + data.$navigationEntry = entry; + data.$load = entry.domComplete - entry.startTime; doResolve(); }); }); diff --git a/packages/analytics/src/events/pv.ts b/packages/analytics/src/events/pv.ts index 4d9e1b6b826fad046656c3301c441cdff28e358a..a338a36d5d571f47b56c8df8607d1871b500bd8b 100644 --- a/packages/analytics/src/events/pv.ts +++ b/packages/analytics/src/events/pv.ts @@ -4,12 +4,12 @@ export default { event: OpenEventKeys.PV, collector: () => { return { - url: window.location.href, - path: window.location.pathname, - hash: window.location.hash, - search: window.location.search, - title: document.title, - referrer: document.referrer, + $url: window.location.href, + $path: window.location.pathname, + $hash: window.location.hash, + $search: window.location.search, + $title: document.title, + $referrer: document.referrer, }; }, }; diff --git a/packages/analytics/src/open-analytics.ts b/packages/analytics/src/open-analytics.ts index ff2aab5776d0b04463df7657ac62266ac44cabc2..07cbd08f0a61e69f538666f577021298ed590270 100644 --- a/packages/analytics/src/open-analytics.ts +++ b/packages/analytics/src/open-analytics.ts @@ -43,7 +43,7 @@ function initHeader(keys: StoreKeyIns, appId: string): EventHeader { const aKey = keys.client; const client = store.getAlways(aKey, { defaultValue: () => ({ - id: uniqueId('', Constant.ID_LENGTH), + id: uniqueId(), }), setOption: { expire: Date.now() + Constant.CLIENT_EXPIRE_TIME, @@ -70,7 +70,7 @@ function initHeader(keys: StoreKeyIns, appId: string): EventHeader { function getSessionId(sKey: string) { const session = store.getAlways(sKey, { defaultValue: () => ({ - id: uniqueId('', Constant.ID_LENGTH), + id: uniqueId(), }), setOption: { expire: Date.now() + Constant.SESSION_EXPIRE_TIME, diff --git a/packages/analytics/src/utils.ts b/packages/analytics/src/utils.ts index a7ccf5bdf8b0668d23ea93ac71c3860162b7c74c..a86fd821ccd6885e898d7953d604e63f5b6fabca 100644 --- a/packages/analytics/src/utils.ts +++ b/packages/analytics/src/utils.ts @@ -1,20 +1,9 @@ +import { v4 as uuidV4 } from 'uuid'; /** * 生成随机字符串 - * @param prefix 前缀 - * @param length 字符串长度 */ -export function uniqueId(prefix: string = '', length: number = 8, Separator: string = '-'): string { - const gen = (len: number): string => { - if (len <= 11) { - return Math.random() - .toString(36) - .slice(2, 2 + len) - .padEnd(len, '0'); - } else { - return gen(11) + gen(len - 11); - } - }; - return prefix ? `${prefix}${Separator}${gen(length)}` : gen(length); +export function uniqueId(): string { + return uuidV4(); } /** * 判断是否是函数 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44f6ba7dcc8109e0b232c7d90e76f3e2409cf0f4..ce91add2d2a8c92b84cd1a2a8a06678e001602c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: ua-parser-js: specifier: ^1.0.38 version: 1.0.38 + uuid: + specifier: ^10.0.0 + version: 10.0.0 web-vitals: specifier: ^4.2.2 version: 4.2.2 @@ -39,6 +42,9 @@ importers: '@types/ua-parser-js': specifier: ^0.7.39 version: 0.7.39 + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 typescript: specifier: ~5.3.3 version: 5.3.3 @@ -477,6 +483,7 @@ packages: resolution: {integrity: sha512-r+SI2t8srMPYZeoa1w0o/AfoVt9akI1ihgazGYPQGRilVAkuzMGiTtexNZkrPkQsyFrvqq/ni8f3zOnHw4hUbA==} cpu: [arm] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -484,6 +491,7 @@ packages: resolution: {integrity: sha512-+tYiL4QVjtI3KliKBGtUU7yhw0GMcJJuB9mLTCEauHEsqfk49gtUBXGtGP3h1LW8MbaTY6rSFIQV1XOBps1gBA==} cpu: [arm] os: [linux] + libc: [musl] requiresBuild: true optional: true @@ -491,6 +499,7 @@ packages: resolution: {integrity: sha512-OR5DcvZiYN75mXDNQQxlQPTv4D+uNCUsmSCSY2FolLf9W5I4DSoJyg7z9Ea3TjKfhPSGgMJiey1aWvlWuBzMtg==} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -498,6 +507,7 @@ packages: resolution: {integrity: sha512-Hw3jSfWdUSauEYFBSFIte6I8m6jOj+3vifLg8EU3lreWulAUpch4JBjDMtlKosrBzkr0kwKgL9iCfjA8L3geoA==} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true optional: true @@ -505,6 +515,7 @@ packages: resolution: {integrity: sha512-rhjvoPBhBwVnJRq/+hi2Q3EMiVF538/o9dBuj9TVLclo9DuONqt5xfWSaE6MYiFKpo/lFPJ/iSI72rYWw5Hc7w==} cpu: [ppc64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -512,6 +523,7 @@ packages: resolution: {integrity: sha512-EAz6vjPwHHs2qOCnpQkw4xs14XJq84I81sDRGPEjKPFVPBw7fwvtwhVjcZR6SLydCv8zNK8YGFblKWd/vRmP8g==} cpu: [riscv64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -519,6 +531,7 @@ packages: resolution: {integrity: sha512-IJSUX1xb8k/zN9j2I7B5Re6B0NNJDJ1+soezjNojhT8DEVeDNptq2jgycCOpRhyGj0+xBn7Cq+PK7Q+nd2hxLA==} cpu: [s390x] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -526,6 +539,7 @@ packages: resolution: {integrity: sha512-OgaToJ8jSxTpgGkZSkwKE+JQGihdcaqnyHEFOSAU45utQ+yLruE1dkonB2SDI8t375wOKgNn8pQvaWY9kPzxDQ==} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -533,6 +547,7 @@ packages: resolution: {integrity: sha512-5V3mPpWkB066XZZBgSd1lwozBk7tmOkKtquyCJ6T4LN3mzKENXyBwWNQn8d0Ci81hvlBw5RoFgleVpL6aScLYg==} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true optional: true @@ -633,6 +648,10 @@ packages: resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} dev: true + /@types/uuid@10.0.0: + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + dev: true + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.3.3): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1975,6 +1994,11 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + dev: false + /validator@13.12.0: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'}