bw-frontend-sdk 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.
- package/README.md +386 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../reporter.js","../errorTracker.js","../eventTracker.js","../performanceTracker.js","../userBehaviorTracker.js","../thirdPartyIntegrator.js","../configManager.js","../index.js"],"sourcesContent":["// 上报器\nexport class Reporter {\n constructor(config) {\n this.config = config\n this.isReporting = false\n }\n \n // 上报数据\n async report(type, data) {\n if (this.isReporting) return\n \n this.isReporting = true\n \n try {\n const reportData = this.formatReportData(type, data)\n \n // 优先使用自定义上报函数\n if (this.config.getConfig().customReport) {\n await this.config.getConfig().customReport(type, reportData)\n } else {\n // 使用默认上报方式\n await this.defaultReport(type, reportData)\n }\n } catch (error) {\n console.error('上报失败:', error)\n } finally {\n this.isReporting = false\n }\n }\n \n // 格式化上报数据\n formatReportData(type, data) {\n const baseData = {\n type,\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n user: this.config.getUser(),\n config: {\n appId: this.config.getConfig().appId,\n appVersion: this.config.getConfig().appVersion,\n environment: this.config.getConfig().environment\n }\n }\n \n return {\n ...baseData,\n data: Array.isArray(data) ? data : [data]\n }\n }\n \n // 默认上报方式\n async defaultReport(type, reportData) {\n const reportUrl = this.config.getReportUrl()\n const thirdPartyConfig = this.config.getThirdPartyConfig()\n \n // 上报到后端接口\n if (reportUrl) {\n await this.reportToBackend(reportUrl, reportData)\n }\n \n // 上报到第三方埋点\n if (thirdPartyConfig && Object.keys(thirdPartyConfig).length > 0) {\n await this.reportToThirdParty(thirdPartyConfig, reportData)\n }\n }\n \n // 上报到后端接口\n async reportToBackend(url, data) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n return await response.json()\n } catch (error) {\n console.error('后端上报失败:', error)\n throw error\n }\n }\n \n // 上报到第三方埋点\n async reportToThirdParty(config, data) {\n const promises = []\n \n // 百度统计\n if (config.baidu && window._hmt) {\n promises.push(this.reportToBaidu(config.baidu, data))\n }\n \n // 友盟统计\n if (config.umeng && window._um) {\n promises.push(this.reportToUmeng(config.umeng, data))\n }\n \n // 神策数据\n if (config.sensors && window.sensors) {\n promises.push(this.reportToSensors(config.sensors, data))\n }\n \n // 腾讯云分析\n if (config.tencent && window.MTA) {\n promises.push(this.reportToTencent(config.tencent, data))\n }\n \n // 自定义第三方\n if (config.custom) {\n promises.push(this.reportToCustom(config.custom, data))\n }\n \n try {\n await Promise.allSettled(promises)\n } catch (error) {\n console.error('第三方上报失败:', error)\n }\n }\n \n // 上报到百度统计\n async reportToBaidu(config, data) {\n if (window._hmt) {\n window._hmt.push(['_trackEvent', data.type, JSON.stringify(data.data)])\n }\n }\n \n // 上报到友盟统计\n async reportToUmeng(config, data) {\n if (window._um) {\n window._um.push(['track', data.type, data.data])\n }\n }\n \n // 上报到神策数据\n async reportToSensors(config, data) {\n if (window.sensors) {\n window.sensors.track(data.type, data.data[0] || {})\n }\n }\n \n // 上报到腾讯云分析\n async reportToTencent(config, data) {\n if (window.MTA) {\n window.MTA.Event.stat(data.type, data.data[0] || {})\n }\n }\n \n // 上报到自定义第三方\n async reportToCustom(config, data) {\n if (typeof config.report === 'function') {\n await config.report(data)\n }\n }\n} ","// 错误追踪器\nimport { Reporter } from './reporter'\n\nexport class ErrorTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.errorQueue = []\n this.isInitialized = false\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 监听 JavaScript 错误\n if (config.enableErrorTracking) {\n this.setupErrorListener()\n }\n \n // 监听未处理的 Promise 拒绝\n if (config.enableUnhandledRejection) {\n this.setupUnhandledRejectionListener()\n }\n \n // 监听资源加载错误\n if (config.enableResourceError) {\n this.setupResourceErrorListener()\n }\n \n this.isInitialized = true\n }\n \n // 设置错误监听器\n setupErrorListener() {\n window.addEventListener('error', (event) => {\n this.handleError(event.error || event.message, {\n type: 'javascript',\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n stack: event.error?.stack\n })\n }, true)\n }\n \n // 设置未处理 Promise 拒绝监听器\n setupUnhandledRejectionListener() {\n window.addEventListener('unhandledrejection', (event) => {\n this.handleError(event.reason, {\n type: 'unhandledrejection',\n stack: event.reason?.stack\n })\n })\n }\n \n // 设置资源错误监听器\n setupResourceErrorListener() {\n window.addEventListener('error', (event) => {\n if (event.target && event.target !== window) {\n this.handleError(`Resource load failed: ${event.target.src || event.target.href}`, {\n type: 'resource',\n tagName: event.target.tagName,\n src: event.target.src,\n href: event.target.href\n })\n }\n }, true)\n }\n \n // 处理错误\n handleError(error, context = {}) {\n const errorInfo = {\n message: error?.message || error?.toString() || error,\n stack: error?.stack || context.stack,\n type: context.type || 'unknown',\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n ...context\n }\n \n // 添加到队列\n this.errorQueue.push(errorInfo)\n \n // 检查队列大小\n if (this.errorQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushErrorQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('error', [errorInfo])\n }\n }\n \n // 手动上报错误\n reportError(error, context = {}) {\n this.handleError(error, context)\n }\n \n // 刷新错误队列\n flushErrorQueue() {\n if (this.errorQueue.length > 0) {\n this.reporter.report('error', [...this.errorQueue])\n this.errorQueue = []\n }\n }\n \n // 销毁\n destroy() {\n this.flushErrorQueue()\n this.isInitialized = false\n }\n} ","// 事件追踪器\nimport { Reporter } from './reporter'\n\nexport class EventTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.eventQueue = []\n this.isInitialized = false\n this.clickListener = null\n this.pageViewListener = null\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 监听点击事件\n if (config.enableClickTracking) {\n this.setupClickTracking()\n }\n \n // 监听页面浏览\n if (config.enablePageViewTracking) {\n this.setupPageViewTracking()\n }\n \n // 设置定时上报\n this.setupPeriodicReport()\n \n this.isInitialized = true\n }\n \n // 设置点击追踪\n setupClickTracking() {\n this.clickListener = (event) => {\n const target = event.target\n const clickData = {\n type: 'click',\n timestamp: Date.now(),\n url: window.location.href,\n element: {\n tagName: target.tagName,\n className: target.className,\n id: target.id,\n text: target.textContent?.substring(0, 50)\n },\n position: {\n x: event.clientX,\n y: event.clientY\n }\n }\n \n this.handleEvent('click', clickData)\n }\n \n document.addEventListener('click', this.clickListener, true)\n }\n \n // 设置页面浏览追踪\n setupPageViewTracking() {\n // 初始页面浏览\n this.handleEvent('pageview', {\n type: 'pageview',\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n referrer: document.referrer\n })\n \n // 监听路由变化(适用于 SPA)\n this.pageViewListener = () => {\n this.handleEvent('pageview', {\n type: 'pageview',\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n referrer: document.referrer\n })\n }\n \n // 监听 popstate 事件\n window.addEventListener('popstate', this.pageViewListener)\n \n // 监听 pushstate 和 replacestate\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n \n history.pushState = function(...args) {\n originalPushState.apply(history, args)\n setTimeout(() => {\n this.pageViewListener()\n }, 0)\n }.bind(this)\n \n history.replaceState = function(...args) {\n originalReplaceState.apply(history, args)\n setTimeout(() => {\n this.pageViewListener()\n }, 0)\n }.bind(this)\n }\n \n // 设置定时上报\n setupPeriodicReport() {\n const interval = this.config.getConfig().reportInterval\n if (interval > 0) {\n setInterval(() => {\n this.flushEventQueue()\n }, interval)\n }\n }\n \n // 处理事件\n handleEvent(eventName, data) {\n const eventInfo = {\n eventName,\n ...data,\n user: this.config.getUser(),\n config: {\n appId: this.config.getConfig().appId,\n appVersion: this.config.getConfig().appVersion,\n environment: this.config.getConfig().environment\n }\n }\n \n // 添加到队列\n this.eventQueue.push(eventInfo)\n \n // 检查队列大小\n if (this.eventQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushEventQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('event', [eventInfo])\n }\n }\n \n // 手动上报事件\n reportEvent(eventName, data = {}) {\n this.handleEvent(eventName, {\n type: 'custom',\n timestamp: Date.now(),\n url: window.location.href,\n ...data\n })\n }\n \n // 刷新事件队列\n flushEventQueue() {\n if (this.eventQueue.length > 0) {\n this.reporter.report('event', [...this.eventQueue])\n this.eventQueue = []\n }\n }\n \n // 销毁\n destroy() {\n this.flushEventQueue()\n \n if (this.clickListener) {\n document.removeEventListener('click', this.clickListener, true)\n }\n \n if (this.pageViewListener) {\n window.removeEventListener('popstate', this.pageViewListener)\n }\n \n this.isInitialized = false\n }\n} ","// 性能监控器\nimport { Reporter } from './reporter'\n\nexport class PerformanceTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.isInitialized = false\n this.pageStartTime = Date.now()\n this.performanceQueue = []\n this.thirdPartySDKs = {}\n \n // 性能指标\n this.metrics = {\n fcp: 0, // First Contentful Paint\n lcp: 0, // Largest Contentful Paint\n fid: 0, // First Input Delay\n cls: 0, // Cumulative Layout Shift\n ttfb: 0, // Time to First Byte\n domLoad: 0, // DOM加载时间\n windowLoad: 0, // 页面完全加载时间\n resourceLoad: [], // 资源加载时间\n apiRequests: [] // API请求时间\n }\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 监控页面性能\n if (config.enablePerformanceTracking) {\n this.setupPerformanceMonitoring()\n }\n \n // 监控资源加载\n if (config.enableResourceTracking) {\n this.setupResourceMonitoring()\n }\n \n // 监控API请求\n if (config.enableApiTracking) {\n this.setupApiMonitoring()\n }\n \n // 监控用户交互性能\n if (config.enableInteractionTracking) {\n this.setupInteractionMonitoring()\n }\n \n // 初始化第三方SDK\n this.initThirdPartySDKs()\n \n this.isInitialized = true\n }\n \n // 设置性能监控\n setupPerformanceMonitoring() {\n // 等待页面加载完成\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.captureDOMLoadTime()\n })\n } else {\n this.captureDOMLoadTime()\n }\n \n window.addEventListener('load', () => {\n this.captureWindowLoadTime()\n this.captureWebVitals()\n this.reportPerformanceMetrics()\n })\n \n // 监控页面可见性变化\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n this.handlePageHidden()\n } else {\n this.handlePageVisible()\n }\n })\n }\n \n // 设置资源监控\n setupResourceMonitoring() {\n // 监控资源加载\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === 'resource') {\n this.handleResourceLoad(entry)\n }\n }\n })\n \n try {\n observer.observe({ entryTypes: ['resource'] })\n } catch (e) {\n // 降级方案:手动监控\n this.setupResourceFallback()\n }\n }\n \n // 设置API监控\n setupApiMonitoring() {\n // 拦截fetch请求\n const originalFetch = window.fetch\n window.fetch = async (...args) => {\n const startTime = performance.now()\n try {\n const response = await originalFetch(...args)\n const endTime = performance.now()\n this.handleApiRequest(args[0], endTime - startTime, response.status)\n return response\n } catch (error) {\n const endTime = performance.now()\n this.handleApiRequest(args[0], endTime - startTime, 'error')\n throw error\n }\n }\n \n // 拦截XMLHttpRequest\n const originalXHROpen = XMLHttpRequest.prototype.open\n const originalXHRSend = XMLHttpRequest.prototype.send\n \n XMLHttpRequest.prototype.open = function(method, url, ...args) {\n this._startTime = performance.now()\n this._url = url\n this._method = method\n return originalXHROpen.apply(this, [method, url, ...args])\n }\n \n XMLHttpRequest.prototype.send = function(...args) {\n const xhr = this\n const originalOnReadyStateChange = xhr.onreadystatechange\n \n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n const endTime = performance.now()\n const duration = endTime - xhr._startTime\n this.handleApiRequest(xhr._url, duration, xhr.status)\n }\n \n if (originalOnReadyStateChange) {\n originalOnReadyStateChange.apply(xhr, arguments)\n }\n }.bind(this)\n \n return originalXHRSend.apply(xhr, args)\n }.bind(this)\n }\n \n // 设置交互监控\n setupInteractionMonitoring() {\n // 监控用户交互延迟\n let firstInputTime = 0\n let firstInputDelay = 0\n \n const handleFirstInput = (event) => {\n if (firstInputTime === 0) {\n firstInputTime = performance.now()\n firstInputDelay = firstInputTime - this.metrics.fcp\n \n this.metrics.fid = firstInputDelay\n \n // 移除事件监听器\n document.removeEventListener('click', handleFirstInput, true)\n document.removeEventListener('keydown', handleFirstInput, true)\n document.removeEventListener('touchstart', handleFirstInput, true)\n }\n }\n \n document.addEventListener('click', handleFirstInput, true)\n document.addEventListener('keydown', handleFirstInput, true)\n document.addEventListener('touchstart', handleFirstInput, true)\n }\n \n // 捕获DOM加载时间\n captureDOMLoadTime() {\n this.metrics.domLoad = performance.now()\n }\n \n // 捕获页面完全加载时间\n captureWindowLoadTime() {\n this.metrics.windowLoad = performance.now()\n }\n \n // 捕获Web Vitals指标\n captureWebVitals() {\n // First Contentful Paint\n if ('PerformanceObserver' in window) {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n this.metrics.fcp = entry.startTime\n }\n }\n })\n observer.observe({ entryTypes: ['paint'] })\n } catch (e) {\n console.warn('FCP监控失败:', e)\n }\n }\n \n // Largest Contentful Paint\n if ('PerformanceObserver' in window) {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.metrics.lcp = entry.startTime\n }\n })\n observer.observe({ entryTypes: ['largest-contentful-paint'] })\n } catch (e) {\n console.warn('LCP监控失败:', e)\n }\n }\n \n // Cumulative Layout Shift\n if ('PerformanceObserver' in window) {\n try {\n let clsValue = 0\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!entry.hadRecentInput) {\n clsValue += entry.value\n }\n }\n this.metrics.cls = clsValue\n })\n observer.observe({ entryTypes: ['layout-shift'] })\n } catch (e) {\n console.warn('CLS监控失败:', e)\n }\n }\n }\n \n // 处理资源加载\n handleResourceLoad(entry) {\n const resourceInfo = {\n name: entry.name,\n type: entry.initiatorType,\n duration: entry.duration,\n size: entry.transferSize,\n timestamp: Date.now()\n }\n \n this.metrics.resourceLoad.push(resourceInfo)\n \n // 检查资源加载性能\n if (entry.duration > 3000) { // 超过3秒的资源\n this.reportSlowResource(resourceInfo)\n }\n }\n \n // 处理API请求\n handleApiRequest(url, duration, status) {\n const apiInfo = {\n url: typeof url === 'string' ? url : url.toString(),\n duration,\n status,\n timestamp: Date.now()\n }\n \n this.metrics.apiRequests.push(apiInfo)\n \n // 检查API性能\n if (duration > 5000) { // 超过5秒的API\n this.reportSlowApi(apiInfo)\n }\n }\n \n // 处理页面隐藏\n handlePageHidden() {\n this.calculatePageStayTime()\n }\n \n // 处理页面显示\n handlePageVisible() {\n this.pageStartTime = Date.now()\n }\n \n // 计算页面停留时间\n calculatePageStayTime() {\n const stayTime = Date.now() - this.pageStartTime\n this.reportPageStayTime(stayTime)\n }\n \n // 上报性能指标\n reportPerformanceMetrics() {\n const performanceData = {\n type: 'performance',\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n metrics: this.metrics,\n user: this.config.getUser(),\n device: this.getDeviceInfo()\n }\n \n this.performanceQueue.push(performanceData)\n \n // 检查队列大小\n if (this.performanceQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushPerformanceQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('performance', [performanceData])\n }\n }\n \n // 上报慢资源\n reportSlowResource(resourceInfo) {\n this.reporter.report('slow_resource', [resourceInfo])\n }\n \n // 上报慢API\n reportSlowApi(apiInfo) {\n this.reporter.report('slow_api', [apiInfo])\n }\n \n // 上报页面停留时间\n reportPageStayTime(stayTime) {\n const stayData = {\n type: 'page_stay',\n url: window.location.href,\n stayTime,\n timestamp: Date.now()\n }\n \n this.reporter.report('page_stay', [stayData])\n }\n \n // 获取设备信息\n getDeviceInfo() {\n return {\n screen: {\n width: screen.width,\n height: screen.height,\n availWidth: screen.availWidth,\n availHeight: screen.availHeight,\n colorDepth: screen.colorDepth,\n pixelDepth: screen.pixelDepth\n },\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight\n },\n connection: navigator.connection ? {\n effectiveType: navigator.connection.effectiveType,\n downlink: navigator.connection.downlink,\n rtt: navigator.connection.rtt\n } : null,\n memory: navigator.memory ? {\n usedJSHeapSize: navigator.memory.usedJSHeapSize,\n totalJSHeapSize: navigator.memory.totalJSHeapSize,\n jsHeapSizeLimit: navigator.memory.jsHeapSizeLimit\n } : null\n }\n }\n \n // 初始化第三方SDK\n initThirdPartySDKs() {\n const config = this.config.getThirdPartyConfig()\n \n // 百度统计\n if (config.baidu && window._hmt) {\n this.thirdPartySDKs.baidu = window._hmt\n }\n \n // 友盟统计\n if (config.umeng && window._um) {\n this.thirdPartySDKs.umeng = window._um\n }\n \n // 神策数据\n if (config.sensors && window.sensors) {\n this.thirdPartySDKs.sensors = window.sensors\n }\n \n // 腾讯云分析\n if (config.tencent && window.MTA) {\n this.thirdPartySDKs.tencent = window.MTA\n }\n }\n \n // 刷新性能队列\n flushPerformanceQueue() {\n if (this.performanceQueue.length > 0) {\n this.reporter.report('performance', [...this.performanceQueue])\n this.performanceQueue = []\n }\n }\n \n // 手动上报性能指标\n reportPerformance(metrics = {}) {\n const performanceData = {\n type: 'custom_performance',\n timestamp: Date.now(),\n url: window.location.href,\n metrics,\n user: this.config.getUser()\n }\n \n this.reporter.report('performance', [performanceData])\n }\n \n // 获取当前性能指标\n getCurrentMetrics() {\n return { ...this.metrics }\n }\n \n // 销毁\n destroy() {\n this.flushPerformanceQueue()\n this.isInitialized = false\n }\n} ","// 用户行为追踪器\nimport { Reporter } from './reporter'\n\nexport class UserBehaviorTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.isInitialized = false\n this.behaviorQueue = []\n this.sessionId = this.generateSessionId()\n this.pageStartTime = Date.now()\n this.scrollDepth = 0\n this.mouseMovements = []\n this.keyStrokes = []\n this.formInteractions = []\n \n // 行为数据\n this.behaviors = {\n pageViews: [],\n clicks: [],\n scrolls: [],\n formSubmissions: [],\n navigation: [],\n timeOnPage: 0\n }\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 追踪页面浏览\n if (config.enablePageViewTracking) {\n this.setupPageViewTracking()\n }\n \n // 追踪用户交互\n if (config.enableUserInteractionTracking) {\n this.setupUserInteractionTracking()\n }\n \n // 追踪表单行为\n if (config.enableFormTracking) {\n this.setupFormTracking()\n }\n \n // 追踪滚动行为\n if (config.enableScrollTracking) {\n this.setupScrollTracking()\n }\n \n // 追踪鼠标移动\n if (config.enableMouseTracking) {\n this.setupMouseTracking()\n }\n \n // 追踪键盘输入\n if (config.enableKeyboardTracking) {\n this.setupKeyboardTracking()\n }\n \n // 追踪页面停留时间\n this.setupTimeTracking()\n \n // 追踪访问来源\n this.trackReferrer()\n \n this.isInitialized = true\n }\n \n // 设置页面浏览追踪\n setupPageViewTracking() {\n // 初始页面浏览\n this.trackPageView()\n \n // 监听路由变化\n this.setupRouteChangeTracking()\n \n // 监听页面可见性变化\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n this.handlePageHidden()\n } else {\n this.handlePageVisible()\n }\n })\n }\n \n // 设置路由变化追踪\n setupRouteChangeTracking() {\n // 监听 popstate 事件\n window.addEventListener('popstate', () => {\n this.trackPageView()\n })\n \n // 监听 pushstate 和 replacestate\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n \n history.pushState = function(...args) {\n originalPushState.apply(history, args)\n setTimeout(() => {\n this.trackPageView()\n }, 0)\n }.bind(this)\n \n history.replaceState = function(...args) {\n originalReplaceState.apply(history, args)\n setTimeout(() => {\n this.trackPageView()\n }, 0)\n }.bind(this)\n }\n \n // 设置用户交互追踪\n setupUserInteractionTracking() {\n // 点击追踪\n document.addEventListener('click', (event) => {\n this.trackClick(event)\n }, true)\n \n // 双击追踪\n document.addEventListener('dblclick', (event) => {\n this.trackDoubleClick(event)\n }, true)\n \n // 右键点击追踪\n document.addEventListener('contextmenu', (event) => {\n this.trackRightClick(event)\n }, true)\n \n // 触摸事件追踪\n if ('ontouchstart' in window) {\n document.addEventListener('touchstart', (event) => {\n this.trackTouch(event)\n }, true)\n }\n }\n \n // 设置表单追踪\n setupFormTracking() {\n // 表单提交\n document.addEventListener('submit', (event) => {\n this.trackFormSubmission(event)\n }, true)\n \n // 表单字段变化\n document.addEventListener('change', (event) => {\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'SELECT' || event.target.tagName === 'TEXTAREA') {\n this.trackFormFieldChange(event)\n }\n }, true)\n \n // 表单字段聚焦\n document.addEventListener('focus', (event) => {\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'SELECT' || event.target.tagName === 'TEXTAREA') {\n this.trackFormFieldFocus(event)\n }\n }, true)\n \n // 表单字段失焦\n document.addEventListener('blur', (event) => {\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'SELECT' || event.target.tagName === 'TEXTAREA') {\n this.trackFormFieldBlur(event)\n }\n }, true)\n }\n \n // 设置滚动追踪\n setupScrollTracking() {\n let scrollTimeout\n let lastScrollTop = 0\n \n document.addEventListener('scroll', () => {\n clearTimeout(scrollTimeout)\n \n scrollTimeout = setTimeout(() => {\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n const scrollHeight = document.documentElement.scrollHeight\n const clientHeight = document.documentElement.clientHeight\n \n // 计算滚动深度百分比\n const scrollDepth = Math.round((scrollTop / (scrollHeight - clientHeight)) * 100)\n \n if (scrollDepth > this.scrollDepth) {\n this.scrollDepth = scrollDepth\n this.trackScroll(scrollDepth, scrollTop)\n }\n }, 100)\n }, { passive: true })\n }\n \n // 设置鼠标移动追踪\n setupMouseTracking() {\n let mouseTimeout\n let mouseMovements = []\n \n document.addEventListener('mousemove', (event) => {\n clearTimeout(mouseTimeout)\n \n mouseMovements.push({\n x: event.clientX,\n y: event.clientY,\n timestamp: Date.now()\n })\n \n // 限制鼠标移动记录数量\n if (mouseMovements.length > 100) {\n mouseMovements.shift()\n }\n \n mouseTimeout = setTimeout(() => {\n if (mouseMovements.length > 10) {\n this.trackMouseMovement(mouseMovements)\n mouseMovements = []\n }\n }, 1000)\n }, { passive: true })\n }\n \n // 设置键盘追踪\n setupKeyboardTracking() {\n document.addEventListener('keydown', (event) => {\n // 不追踪密码字段\n if (event.target.type === 'password') return\n \n this.trackKeyStroke(event)\n }, true)\n }\n \n // 设置时间追踪\n setupTimeTracking() {\n // 每秒更新页面停留时间\n setInterval(() => {\n this.behaviors.timeOnPage += 1\n }, 1000)\n \n // 页面卸载时上报停留时间\n window.addEventListener('beforeunload', () => {\n this.reportTimeOnPage()\n })\n }\n \n // 追踪访问来源\n trackReferrer() {\n const referrer = document.referrer\n if (referrer) {\n const referrerData = {\n type: 'referrer',\n url: referrer,\n domain: this.extractDomain(referrer),\n timestamp: Date.now()\n }\n \n this.behaviors.navigation.push(referrerData)\n this.reportBehavior('referrer', referrerData)\n }\n }\n \n // 追踪页面浏览\n trackPageView() {\n const pageViewData = {\n type: 'pageview',\n url: window.location.href,\n title: document.title,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n referrer: document.referrer\n }\n \n this.behaviors.pageViews.push(pageViewData)\n this.reportBehavior('pageview', pageViewData)\n \n // 重置页面相关数据\n this.pageStartTime = Date.now()\n this.scrollDepth = 0\n }\n \n // 追踪点击\n trackClick(event) {\n const clickData = {\n type: 'click',\n element: {\n tagName: event.target.tagName,\n className: event.target.className,\n id: event.target.id,\n text: event.target.textContent?.substring(0, 50),\n href: event.target.href\n },\n position: {\n x: event.clientX,\n y: event.clientY,\n pageX: event.pageX,\n pageY: event.pageY\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.behaviors.clicks.push(clickData)\n this.reportBehavior('click', clickData)\n }\n \n // 追踪双击\n trackDoubleClick(event) {\n const doubleClickData = {\n type: 'doubleclick',\n element: {\n tagName: event.target.tagName,\n className: event.target.className,\n id: event.target.id\n },\n position: {\n x: event.clientX,\n y: event.clientY\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('doubleclick', doubleClickData)\n }\n \n // 追踪右键点击\n trackRightClick(event) {\n const rightClickData = {\n type: 'rightclick',\n element: {\n tagName: event.target.tagName,\n className: event.target.className,\n id: event.target.id\n },\n position: {\n x: event.clientX,\n y: event.clientY\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('rightclick', rightClickData)\n }\n \n // 追踪触摸\n trackTouch(event) {\n const touchData = {\n type: 'touch',\n touches: Array.from(event.touches).map(touch => ({\n x: touch.clientX,\n y: touch.clientY,\n identifier: touch.identifier\n })),\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('touch', touchData)\n }\n \n // 追踪表单提交\n trackFormSubmission(event) {\n const formData = {\n type: 'form_submission',\n form: {\n action: event.target.action,\n method: event.target.method,\n id: event.target.id,\n className: event.target.className\n },\n fields: this.getFormFields(event.target),\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.behaviors.formSubmissions.push(formData)\n this.reportBehavior('form_submission', formData)\n }\n \n // 追踪表单字段变化\n trackFormFieldChange(event) {\n const fieldData = {\n type: 'form_field_change',\n field: {\n name: event.target.name,\n type: event.target.type,\n value: event.target.type === 'password' ? '***' : event.target.value,\n id: event.target.id\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('form_field_change', fieldData)\n }\n \n // 追踪表单字段聚焦\n trackFormFieldFocus(event) {\n const focusData = {\n type: 'form_field_focus',\n field: {\n name: event.target.name,\n type: event.target.type,\n id: event.target.id\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('form_field_focus', focusData)\n }\n \n // 追踪表单字段失焦\n trackFormFieldBlur(event) {\n const blurData = {\n type: 'form_field_blur',\n field: {\n name: event.target.name,\n type: event.target.type,\n id: event.target.id\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('form_field_blur', blurData)\n }\n \n // 追踪滚动\n trackScroll(depth, scrollTop) {\n const scrollData = {\n type: 'scroll',\n depth: depth,\n scrollTop: scrollTop,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('scroll', scrollData)\n }\n \n // 追踪鼠标移动\n trackMouseMovement(movements) {\n const mouseData = {\n type: 'mouse_movement',\n movements: movements,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('mouse_movement', mouseData)\n }\n \n // 追踪键盘输入\n trackKeyStroke(event) {\n const keyData = {\n type: 'keystroke',\n key: event.key,\n code: event.code,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n metaKey: event.metaKey,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('keystroke', keyData)\n }\n \n // 处理页面隐藏\n handlePageHidden() {\n this.reportTimeOnPage()\n }\n \n // 处理页面显示\n handlePageVisible() {\n this.pageStartTime = Date.now()\n }\n \n // 上报页面停留时间\n reportTimeOnPage() {\n const timeData = {\n type: 'time_on_page',\n time: this.behaviors.timeOnPage,\n url: window.location.href,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('time_on_page', timeData)\n }\n \n // 上报行为数据\n reportBehavior(type, data) {\n const behaviorData = {\n type,\n data,\n user: this.config.getUser(),\n config: {\n appId: this.config.getConfig().appId,\n appVersion: this.config.getConfig().appVersion,\n environment: this.config.getConfig().environment\n }\n }\n \n // 添加到队列\n this.behaviorQueue.push(behaviorData)\n \n // 检查队列大小\n if (this.behaviorQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushBehaviorQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('behavior', [behaviorData])\n }\n }\n \n // 手动上报行为\n reportCustomBehavior(eventName, data = {}) {\n const customData = {\n type: 'custom_behavior',\n eventName,\n ...data,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('custom_behavior', customData)\n }\n \n // 刷新行为队列\n flushBehaviorQueue() {\n if (this.behaviorQueue.length > 0) {\n this.reporter.report('behavior', [...this.behaviorQueue])\n this.behaviorQueue = []\n }\n }\n \n // 获取表单字段信息\n getFormFields(form) {\n const fields = []\n const formElements = form.elements\n \n for (let i = 0; i < formElements.length; i++) {\n const element = formElements[i]\n if (element.name) {\n fields.push({\n name: element.name,\n type: element.type,\n value: element.type === 'password' ? '***' : element.value\n })\n }\n }\n \n return fields\n }\n \n // 提取域名\n extractDomain(url) {\n try {\n return new URL(url).hostname\n } catch (e) {\n return url\n }\n }\n \n // 生成会话ID\n generateSessionId() {\n return 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)\n }\n \n // 获取当前行为数据\n getCurrentBehaviors() {\n return { ...this.behaviors }\n }\n \n // 获取会话ID\n getSessionId() {\n return this.sessionId\n }\n \n // 销毁\n destroy() {\n this.flushBehaviorQueue()\n this.reportTimeOnPage()\n this.isInitialized = false\n }\n} ","// 第三方SDK集成器\nexport class ThirdPartyIntegrator {\n constructor(config) {\n this.config = config\n this.integratedSDKs = {}\n this.isInitialized = false\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getThirdPartyConfig()\n \n // 初始化百度统计\n if (config.baidu && config.baidu.enabled) {\n this.initBaiduAnalytics(config.baidu)\n }\n \n // 初始化友盟统计\n if (config.umeng && config.umeng.enabled) {\n this.initUmengAnalytics(config.umeng)\n }\n \n // 初始化神策数据\n if (config.sensors && config.sensors.enabled) {\n this.initSensorsAnalytics(config.sensors)\n }\n \n // 初始化腾讯云分析\n if (config.tencent && config.tencent.enabled) {\n this.initTencentAnalytics(config.tencent)\n }\n \n // 初始化Google Analytics\n if (config.google && config.google.enabled) {\n this.initGoogleAnalytics(config.google)\n }\n \n // 初始化自定义第三方\n if (config.custom && config.custom.enabled) {\n this.initCustomAnalytics(config.custom)\n }\n \n this.isInitialized = true\n }\n \n // 初始化百度统计\n initBaiduAnalytics(config) {\n try {\n if (window._hmt) {\n this.integratedSDKs.baidu = {\n name: 'baidu',\n instance: window._hmt,\n config: config\n }\n \n // 设置百度统计配置\n if (config.siteId) {\n window._hmt.push(['_setAccount', config.siteId])\n }\n \n if (config.autoPageview !== false) {\n window._hmt.push(['_trackPageview'])\n }\n \n console.log('百度统计集成成功')\n } else {\n console.warn('百度统计未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('百度统计集成失败:', error)\n }\n }\n \n // 初始化友盟统计\n initUmengAnalytics(config) {\n try {\n if (window._um) {\n this.integratedSDKs.umeng = {\n name: 'umeng',\n instance: window._um,\n config: config\n }\n \n // 设置友盟统计配置\n if (config.siteId) {\n window._um.push(['setAccount', config.siteId])\n }\n \n if (config.autoPageview !== false) {\n window._um.push(['trackPageview'])\n }\n \n console.log('友盟统计集成成功')\n } else {\n console.warn('友盟统计未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('友盟统计集成失败:', error)\n }\n }\n \n // 初始化神策数据\n initSensorsAnalytics(config) {\n try {\n if (window.sensors) {\n this.integratedSDKs.sensors = {\n name: 'sensors',\n instance: window.sensors,\n config: config\n }\n \n // 设置神策数据配置\n if (config.serverUrl) {\n window.sensors.setServerUrl(config.serverUrl)\n }\n \n if (config.siteId) {\n window.sensors.setSiteId(config.siteId)\n }\n \n if (config.autoPageview !== false) {\n window.sensors.trackPageview()\n }\n \n console.log('神策数据集成成功')\n } else {\n console.warn('神策数据未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('神策数据集成失败:', error)\n }\n }\n \n // 初始化腾讯云分析\n initTencentAnalytics(config) {\n try {\n if (window.MTA) {\n this.integratedSDKs.tencent = {\n name: 'tencent',\n instance: window.MTA,\n config: config\n }\n \n // 设置腾讯云分析配置\n if (config.appId) {\n window.MTA.setAppId(config.appId)\n }\n \n if (config.autoPageview !== false) {\n window.MTA.trackPageview()\n }\n \n console.log('腾讯云分析集成成功')\n } else {\n console.warn('腾讯云分析未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('腾讯云分析集成失败:', error)\n }\n }\n \n // 初始化Google Analytics\n initGoogleAnalytics(config) {\n try {\n if (window.gtag) {\n this.integratedSDKs.google = {\n name: 'google',\n instance: window.gtag,\n config: config\n }\n \n // 设置Google Analytics配置\n if (config.measurementId) {\n window.gtag('config', config.measurementId, {\n page_title: document.title,\n page_location: window.location.href\n })\n }\n \n console.log('Google Analytics集成成功')\n } else {\n console.warn('Google Analytics未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('Google Analytics集成失败:', error)\n }\n }\n \n // 初始化自定义第三方\n initCustomAnalytics(config) {\n try {\n if (typeof config.init === 'function') {\n const instance = config.init(config)\n this.integratedSDKs.custom = {\n name: 'custom',\n instance: instance,\n config: config\n }\n \n console.log('自定义第三方集成成功')\n } else {\n console.warn('自定义第三方配置缺少init函数')\n }\n } catch (error) {\n console.error('自定义第三方集成失败:', error)\n }\n }\n \n // 上报事件到所有集成的第三方SDK\n reportEvent(eventName, eventData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportToSDK(sdk, eventName, eventData)\n } catch (error) {\n console.error(`上报事件到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报页面浏览到所有集成的第三方SDK\n reportPageView(pageData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportPageViewToSDK(sdk, pageData)\n } catch (error) {\n console.error(`上报页面浏览到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报用户信息到所有集成的第三方SDK\n reportUser(userData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportUserToSDK(sdk, userData)\n } catch (error) {\n console.error(`上报用户信息到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报性能指标到所有集成的第三方SDK\n reportPerformance(performanceData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportPerformanceToSDK(sdk, performanceData)\n } catch (error) {\n console.error(`上报性能指标到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报事件到特定SDK\n reportToSDK(sdk, eventName, eventData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_trackEvent', eventName, JSON.stringify(eventData)])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['track', eventName, eventData])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.track) {\n sdk.instance.track(eventName, eventData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.Event && sdk.instance.Event.stat) {\n sdk.instance.Event.stat(eventName, eventData)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('event', eventName, eventData)\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.track === 'function') {\n sdk.instance.track(eventName, eventData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 上报页面浏览到特定SDK\n reportPageViewToSDK(sdk, pageData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_trackPageview', pageData.url || window.location.href])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['trackPageview', pageData.url || window.location.href])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.trackPageview) {\n sdk.instance.trackPageview(pageData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.trackPageview) {\n sdk.instance.trackPageview(pageData.url || window.location.href)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('config', sdk.config.measurementId, {\n page_title: pageData.title || document.title,\n page_location: pageData.url || window.location.href\n })\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.trackPageview === 'function') {\n sdk.instance.trackPageview(pageData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 上报用户信息到特定SDK\n reportUserToSDK(sdk, userData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_setUserTag', 'userId', userData.userId])\n sdk.instance.push(['_setUserTag', 'userType', userData.userType])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['setUserTag', 'userId', userData.userId])\n sdk.instance.push(['setUserTag', 'userType', userData.userType])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.setProfile) {\n sdk.instance.setProfile(userData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.setUserInfo) {\n sdk.instance.setUserInfo(userData)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('set', 'user_id', userData.userId)\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.setUser === 'function') {\n sdk.instance.setUser(userData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 上报性能指标到特定SDK\n reportPerformanceToSDK(sdk, performanceData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_trackEvent', 'performance', JSON.stringify(performanceData)])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['track', 'performance', performanceData])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.track) {\n sdk.instance.track('performance', performanceData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.Event && sdk.instance.Event.stat) {\n sdk.instance.Event.stat('performance', performanceData)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('event', 'performance', performanceData)\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.trackPerformance === 'function') {\n sdk.instance.trackPerformance(performanceData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 检查SDK是否已集成\n isSDKIntegrated(sdkName) {\n return !!this.integratedSDKs[sdkName]\n }\n \n // 获取已集成的SDK列表\n getIntegratedSDKs() {\n return Object.keys(this.integratedSDKs)\n }\n \n // 获取特定SDK的实例\n getSDKInstance(sdkName) {\n return this.integratedSDKs[sdkName]?.instance || null\n }\n \n // 销毁所有集成的SDK\n destroy() {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n if (sdk.instance && typeof sdk.instance.destroy === 'function') {\n sdk.instance.destroy()\n }\n } catch (error) {\n console.error(`销毁${sdk.name}失败:`, error)\n }\n })\n \n this.integratedSDKs = {}\n this.isInitialized = false\n }\n} ","// 配置管理器\nexport class ConfigManager {\n constructor(options = {}) {\n this.config = {\n // 基础配置\n appId: options.appId || '',\n appVersion: options.appVersion || '1.0.0',\n environment: options.environment || 'production',\n \n // 上报配置\n reportUrl: options.reportUrl || '',\n reportInterval: options.reportInterval || 5000, // 批量上报间隔\n maxQueueSize: options.maxQueueSize || 100, // 最大队列大小\n \n // 错误追踪配置\n enableErrorTracking: options.enableErrorTracking !== false,\n enableUnhandledRejection: options.enableUnhandledRejection !== false,\n enableResourceError: options.enableResourceError !== false,\n \n // 事件追踪配置\n enableEventTracking: options.enableEventTracking !== false,\n enableClickTracking: options.enableClickTracking !== false,\n enablePageViewTracking: options.enablePageViewTracking !== false,\n \n // 性能监控配置\n enablePerformanceTracking: options.enablePerformanceTracking !== false,\n enableResourceTracking: options.enableResourceTracking !== false,\n enableApiTracking: options.enableApiTracking !== false,\n enableInteractionTracking: options.enableInteractionTracking !== false,\n \n // 用户行为追踪配置\n enableUserInteractionTracking: options.enableUserInteractionTracking !== false,\n enableFormTracking: options.enableFormTracking !== false,\n enableScrollTracking: options.enableScrollTracking !== false,\n enableMouseTracking: options.enableMouseTracking !== false,\n enableKeyboardTracking: options.enableKeyboardTracking !== false,\n \n // 第三方埋点配置\n thirdPartyConfig: options.thirdPartyConfig || {},\n \n // 用户信息\n user: options.user || null,\n \n // 自定义上报函数\n customReport: options.customReport || null\n }\n \n this.user = null\n }\n \n // 更新配置\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig }\n }\n \n // 设置用户信息\n setUser(userInfo) {\n this.user = userInfo\n }\n \n // 获取配置\n getConfig() {\n return this.config\n }\n \n // 获取用户信息\n getUser() {\n return this.user\n }\n \n // 获取上报URL\n getReportUrl() {\n return this.config.reportUrl\n }\n \n // 获取第三方配置\n getThirdPartyConfig() {\n return this.config.thirdPartyConfig\n }\n \n // 检查是否启用错误追踪\n isErrorTrackingEnabled() {\n return this.config.enableErrorTracking\n }\n \n // 检查是否启用事件追踪\n isEventTrackingEnabled() {\n return this.config.enableEventTracking\n }\n} ","// 前端 SDK 主入口\nimport { ErrorTracker } from './errorTracker'\nimport { EventTracker } from './eventTracker'\nimport { PerformanceTracker } from './performanceTracker'\nimport { UserBehaviorTracker } from './userBehaviorTracker'\nimport { ThirdPartyIntegrator } from './thirdPartyIntegrator'\nimport { ConfigManager } from './configManager'\n\nclass FrontendSDK {\n constructor(options = {}) {\n this.config = new ConfigManager(options)\n this.errorTracker = new ErrorTracker(this.config)\n this.eventTracker = new EventTracker(this.config)\n this.performanceTracker = new PerformanceTracker(this.config)\n this.userBehaviorTracker = new UserBehaviorTracker(this.config)\n this.thirdPartyIntegrator = new ThirdPartyIntegrator(this.config)\n \n this.init()\n }\n \n init() {\n // 初始化错误追踪\n this.errorTracker.init()\n \n // 初始化事件追踪\n this.eventTracker.init()\n \n // 初始化性能监控\n this.performanceTracker.init()\n \n // 初始化用户行为追踪\n this.userBehaviorTracker.init()\n \n // 初始化第三方SDK集成\n this.thirdPartyIntegrator.init()\n \n console.log('Frontend SDK 初始化完成')\n }\n \n // 手动上报错误\n reportError(error, context = {}) {\n this.errorTracker.reportError(error, context)\n }\n \n // 手动上报事件\n reportEvent(eventName, data = {}) {\n this.eventTracker.reportEvent(eventName, data)\n }\n \n // 手动上报性能指标\n reportPerformance(metrics = {}) {\n this.performanceTracker.reportPerformance(metrics)\n }\n \n // 手动上报用户行为\n reportBehavior(eventName, data = {}) {\n this.userBehaviorTracker.reportCustomBehavior(eventName, data)\n }\n \n // 设置用户信息\n setUser(userInfo) {\n this.config.setUser(userInfo)\n // 同步到第三方SDK\n this.thirdPartyIntegrator.reportUser(userInfo)\n }\n \n // 设置自定义配置\n setConfig(config) {\n this.config.updateConfig(config)\n }\n \n // 获取性能指标\n getPerformanceMetrics() {\n return this.performanceTracker.getCurrentMetrics()\n }\n \n // 获取用户行为数据\n getBehaviorData() {\n return this.userBehaviorTracker.getCurrentBehaviors()\n }\n \n // 获取会话ID\n getSessionId() {\n return this.userBehaviorTracker.getSessionId()\n }\n \n // 检查第三方SDK是否已集成\n isThirdPartySDKIntegrated(sdkName) {\n return this.thirdPartyIntegrator.isSDKIntegrated(sdkName)\n }\n \n // 获取已集成的第三方SDK列表\n getIntegratedThirdPartySDKs() {\n return this.thirdPartyIntegrator.getIntegratedSDKs()\n }\n \n // 销毁 SDK\n destroy() {\n this.errorTracker.destroy()\n this.eventTracker.destroy()\n this.performanceTracker.destroy()\n this.userBehaviorTracker.destroy()\n this.thirdPartyIntegrator.destroy()\n console.log('Frontend SDK 已销毁')\n }\n}\n\nexport default FrontendSDK "],"names":["Reporter","constructor","config","this","isReporting","report","type","data","reportData","formatReportData","getConfig","customReport","defaultReport","error","console","timestamp","Date","now","url","window","location","href","userAgent","navigator","user","getUser","appId","appVersion","environment","Array","isArray","reportUrl","getReportUrl","thirdPartyConfig","getThirdPartyConfig","reportToBackend","Object","keys","length","reportToThirdParty","response","fetch","method","headers","body","JSON","stringify","ok","Error","status","statusText","json","promises","baidu","_hmt","push","reportToBaidu","umeng","_um","reportToUmeng","sensors","reportToSensors","tencent","MTA","reportToTencent","custom","reportToCustom","Promise","allSettled","track","Event","stat","ErrorTracker","reporter","errorQueue","isInitialized","init","enableErrorTracking","setupErrorListener","enableUnhandledRejection","setupUnhandledRejectionListener","enableResourceError","setupResourceErrorListener","addEventListener","event","handleError","message","filename","lineno","colno","stack","reason","target","src","tagName","context","errorInfo","toString","maxQueueSize","flushErrorQueue","reportInterval","reportError","destroy","EventTracker","eventQueue","clickListener","pageViewListener","enableClickTracking","setupClickTracking","enablePageViewTracking","setupPageViewTracking","setupPeriodicReport","clickData","element","className","id","text","textContent","substring","position","x","clientX","y","clientY","handleEvent","document","title","referrer","originalPushState","history","pushState","originalReplaceState","replaceState","args","apply","setTimeout","bind","interval","setInterval","flushEventQueue","eventName","eventInfo","reportEvent","removeEventListener","PerformanceTracker","pageStartTime","performanceQueue","thirdPartySDKs","metrics","fcp","lcp","fid","cls","ttfb","domLoad","windowLoad","resourceLoad","apiRequests","enablePerformanceTracking","setupPerformanceMonitoring","enableResourceTracking","setupResourceMonitoring","enableApiTracking","setupApiMonitoring","enableInteractionTracking","setupInteractionMonitoring","initThirdPartySDKs","readyState","captureDOMLoadTime","captureWindowLoadTime","captureWebVitals","reportPerformanceMetrics","hidden","handlePageHidden","handlePageVisible","observer","PerformanceObserver","list","entry","getEntries","entryType","handleResourceLoad","observe","entryTypes","e","setupResourceFallback","originalFetch","async","startTime","performance","endTime","handleApiRequest","originalXHROpen","XMLHttpRequest","prototype","open","originalXHRSend","send","_startTime","_url","_method","xhr","originalOnReadyStateChange","onreadystatechange","duration","arguments","firstInputTime","firstInputDelay","handleFirstInput","name","warn","clsValue","hadRecentInput","value","resourceInfo","initiatorType","size","transferSize","reportSlowResource","apiInfo","reportSlowApi","calculatePageStayTime","stayTime","reportPageStayTime","performanceData","device","getDeviceInfo","flushPerformanceQueue","stayData","screen","width","height","availWidth","availHeight","colorDepth","pixelDepth","viewport","innerWidth","innerHeight","connection","effectiveType","downlink","rtt","memory","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","reportPerformance","getCurrentMetrics","UserBehaviorTracker","behaviorQueue","sessionId","generateSessionId","scrollDepth","mouseMovements","keyStrokes","formInteractions","behaviors","pageViews","clicks","scrolls","formSubmissions","navigation","timeOnPage","enableUserInteractionTracking","setupUserInteractionTracking","enableFormTracking","setupFormTracking","enableScrollTracking","setupScrollTracking","enableMouseTracking","setupMouseTracking","enableKeyboardTracking","setupKeyboardTracking","setupTimeTracking","trackReferrer","trackPageView","setupRouteChangeTracking","trackClick","trackDoubleClick","trackRightClick","trackTouch","trackFormSubmission","trackFormFieldChange","trackFormFieldFocus","trackFormFieldBlur","scrollTimeout","clearTimeout","scrollTop","pageYOffset","documentElement","scrollHeight","clientHeight","Math","round","trackScroll","passive","mouseTimeout","shift","trackMouseMovement","trackKeyStroke","reportTimeOnPage","referrerData","domain","extractDomain","reportBehavior","pageViewData","pageX","pageY","doubleClickData","rightClickData","touchData","touches","from","map","touch","identifier","formData","form","action","fields","getFormFields","fieldData","field","focusData","blurData","depth","scrollData","movements","mouseData","keyData","key","code","ctrlKey","shiftKey","altKey","metaKey","timeData","time","behaviorData","flushBehaviorQueue","reportCustomBehavior","customData","formElements","elements","i","URL","hostname","random","substr","getCurrentBehaviors","getSessionId","ThirdPartyIntegrator","integratedSDKs","enabled","initBaiduAnalytics","initUmengAnalytics","initSensorsAnalytics","initTencentAnalytics","google","initGoogleAnalytics","initCustomAnalytics","instance","siteId","autoPageview","log","serverUrl","setServerUrl","setSiteId","trackPageview","setAppId","gtag","measurementId","page_title","page_location","eventData","values","forEach","sdk","reportToSDK","reportPageView","pageData","reportPageViewToSDK","reportUser","userData","reportUserToSDK","reportPerformanceToSDK","userId","userType","setProfile","setUserInfo","setUser","trackPerformance","isSDKIntegrated","sdkName","getIntegratedSDKs","getSDKInstance","ConfigManager","options","enableEventTracking","updateConfig","newConfig","userInfo","isErrorTrackingEnabled","isEventTrackingEnabled","FrontendSDK","errorTracker","eventTracker","performanceTracker","userBehaviorTracker","thirdPartyIntegrator","setConfig","getPerformanceMetrics","getBehaviorData","isThirdPartySDKIntegrated","getIntegratedThirdPartySDKs"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";class e{constructor(e){this.config=e,this.isReporting=!1}async report(e,t){if(!this.isReporting){this.isReporting=!0;try{const i=this.formatReportData(e,t);this.config.getConfig().customReport?await this.config.getConfig().customReport(e,i):await this.defaultReport(e,i)}catch(e){console.error("上报失败:",e)}finally{this.isReporting=!1}}}formatReportData(e,t){return{...{type:e,timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent,user:this.config.getUser(),config:{appId:this.config.getConfig().appId,appVersion:this.config.getConfig().appVersion,environment:this.config.getConfig().environment}},data:Array.isArray(t)?t:[t]}}async defaultReport(e,t){const i=this.config.getReportUrl(),r=this.config.getThirdPartyConfig();i&&await this.reportToBackend(i,t),r&&Object.keys(r).length>0&&await this.reportToThirdParty(r,t)}async reportToBackend(e,t){try{const i=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);return await i.json()}catch(e){throw console.error("后端上报失败:",e),e}}async reportToThirdParty(e,t){const i=[];e.baidu&&window._hmt&&i.push(this.reportToBaidu(e.baidu,t)),e.umeng&&window._um&&i.push(this.reportToUmeng(e.umeng,t)),e.sensors&&window.sensors&&i.push(this.reportToSensors(e.sensors,t)),e.tencent&&window.MTA&&i.push(this.reportToTencent(e.tencent,t)),e.custom&&i.push(this.reportToCustom(e.custom,t));try{await Promise.allSettled(i)}catch(e){console.error("第三方上报失败:",e)}}async reportToBaidu(e,t){window._hmt&&window._hmt.push(["_trackEvent",t.type,JSON.stringify(t.data)])}async reportToUmeng(e,t){window._um&&window._um.push(["track",t.type,t.data])}async reportToSensors(e,t){window.sensors&&window.sensors.track(t.type,t.data[0]||{})}async reportToTencent(e,t){window.MTA&&window.MTA.Event.stat(t.type,t.data[0]||{})}async reportToCustom(e,t){"function"==typeof e.report&&await e.report(t)}}class t{constructor(t){this.config=t,this.reporter=new e(t),this.errorQueue=[],this.isInitialized=!1}init(){if(this.isInitialized)return;const e=this.config.getConfig();e.enableErrorTracking&&this.setupErrorListener(),e.enableUnhandledRejection&&this.setupUnhandledRejectionListener(),e.enableResourceError&&this.setupResourceErrorListener(),this.isInitialized=!0}setupErrorListener(){window.addEventListener("error",e=>{this.handleError(e.error||e.message,{type:"javascript",filename:e.filename,lineno:e.lineno,colno:e.colno,stack:e.error?.stack})},!0)}setupUnhandledRejectionListener(){window.addEventListener("unhandledrejection",e=>{this.handleError(e.reason,{type:"unhandledrejection",stack:e.reason?.stack})})}setupResourceErrorListener(){window.addEventListener("error",e=>{e.target&&e.target!==window&&this.handleError(`Resource load failed: ${e.target.src||e.target.href}`,{type:"resource",tagName:e.target.tagName,src:e.target.src,href:e.target.href})},!0)}handleError(e,t={}){const i={message:e?.message||e?.toString()||e,stack:e?.stack||t.stack,type:t.type||"unknown",timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent,...t};this.errorQueue.push(i),this.errorQueue.length>=this.config.getConfig().maxQueueSize&&this.flushErrorQueue(),0===this.config.getConfig().reportInterval&&this.reporter.report("error",[i])}reportError(e,t={}){this.handleError(e,t)}flushErrorQueue(){this.errorQueue.length>0&&(this.reporter.report("error",[...this.errorQueue]),this.errorQueue=[])}destroy(){this.flushErrorQueue(),this.isInitialized=!1}}class i{constructor(t){this.config=t,this.reporter=new e(t),this.eventQueue=[],this.isInitialized=!1,this.clickListener=null,this.pageViewListener=null}init(){if(this.isInitialized)return;const e=this.config.getConfig();e.enableClickTracking&&this.setupClickTracking(),e.enablePageViewTracking&&this.setupPageViewTracking(),this.setupPeriodicReport(),this.isInitialized=!0}setupClickTracking(){this.clickListener=e=>{const t=e.target,i={type:"click",timestamp:Date.now(),url:window.location.href,element:{tagName:t.tagName,className:t.className,id:t.id,text:t.textContent?.substring(0,50)},position:{x:e.clientX,y:e.clientY}};this.handleEvent("click",i)},document.addEventListener("click",this.clickListener,!0)}setupPageViewTracking(){this.handleEvent("pageview",{type:"pageview",timestamp:Date.now(),url:window.location.href,title:document.title,referrer:document.referrer}),this.pageViewListener=()=>{this.handleEvent("pageview",{type:"pageview",timestamp:Date.now(),url:window.location.href,title:document.title,referrer:document.referrer})},window.addEventListener("popstate",this.pageViewListener);const e=history.pushState,t=history.replaceState;history.pushState=function(...t){e.apply(history,t),setTimeout(()=>{this.pageViewListener()},0)}.bind(this),history.replaceState=function(...e){t.apply(history,e),setTimeout(()=>{this.pageViewListener()},0)}.bind(this)}setupPeriodicReport(){const e=this.config.getConfig().reportInterval;e>0&&setInterval(()=>{this.flushEventQueue()},e)}handleEvent(e,t){const i={eventName:e,...t,user:this.config.getUser(),config:{appId:this.config.getConfig().appId,appVersion:this.config.getConfig().appVersion,environment:this.config.getConfig().environment}};this.eventQueue.push(i),this.eventQueue.length>=this.config.getConfig().maxQueueSize&&this.flushEventQueue(),0===this.config.getConfig().reportInterval&&this.reporter.report("event",[i])}reportEvent(e,t={}){this.handleEvent(e,{type:"custom",timestamp:Date.now(),url:window.location.href,...t})}flushEventQueue(){this.eventQueue.length>0&&(this.reporter.report("event",[...this.eventQueue]),this.eventQueue=[])}destroy(){this.flushEventQueue(),this.clickListener&&document.removeEventListener("click",this.clickListener,!0),this.pageViewListener&&window.removeEventListener("popstate",this.pageViewListener),this.isInitialized=!1}}class r{constructor(t){this.config=t,this.reporter=new e(t),this.isInitialized=!1,this.pageStartTime=Date.now(),this.performanceQueue=[],this.thirdPartySDKs={},this.metrics={fcp:0,lcp:0,fid:0,cls:0,ttfb:0,domLoad:0,windowLoad:0,resourceLoad:[],apiRequests:[]}}init(){if(this.isInitialized)return;const e=this.config.getConfig();e.enablePerformanceTracking&&this.setupPerformanceMonitoring(),e.enableResourceTracking&&this.setupResourceMonitoring(),e.enableApiTracking&&this.setupApiMonitoring(),e.enableInteractionTracking&&this.setupInteractionMonitoring(),this.initThirdPartySDKs(),this.isInitialized=!0}setupPerformanceMonitoring(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{this.captureDOMLoadTime()}):this.captureDOMLoadTime(),window.addEventListener("load",()=>{this.captureWindowLoadTime(),this.captureWebVitals(),this.reportPerformanceMetrics()}),document.addEventListener("visibilitychange",()=>{document.hidden?this.handlePageHidden():this.handlePageVisible()})}setupResourceMonitoring(){const e=new PerformanceObserver(e=>{for(const t of e.getEntries())"resource"===t.entryType&&this.handleResourceLoad(t)});try{e.observe({entryTypes:["resource"]})}catch(e){this.setupResourceFallback()}}setupApiMonitoring(){const e=window.fetch;window.fetch=async(...t)=>{const i=performance.now();try{const r=await e(...t),n=performance.now();return this.handleApiRequest(t[0],n-i,r.status),r}catch(e){const r=performance.now();throw this.handleApiRequest(t[0],r-i,"error"),e}};const t=XMLHttpRequest.prototype.open,i=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(e,i,...r){return this._startTime=performance.now(),this._url=i,this._method=e,t.apply(this,[e,i,...r])},XMLHttpRequest.prototype.send=function(...e){const t=this,r=t.onreadystatechange;return t.onreadystatechange=function(){if(4===t.readyState){const e=performance.now()-t._startTime;this.handleApiRequest(t._url,e,t.status)}r&&r.apply(t,arguments)}.bind(this),i.apply(t,e)}.bind(this)}setupInteractionMonitoring(){let e=0,t=0;const i=r=>{0===e&&(e=performance.now(),t=e-this.metrics.fcp,this.metrics.fid=t,document.removeEventListener("click",i,!0),document.removeEventListener("keydown",i,!0),document.removeEventListener("touchstart",i,!0))};document.addEventListener("click",i,!0),document.addEventListener("keydown",i,!0),document.addEventListener("touchstart",i,!0)}captureDOMLoadTime(){this.metrics.domLoad=performance.now()}captureWindowLoadTime(){this.metrics.windowLoad=performance.now()}captureWebVitals(){if("PerformanceObserver"in window)try{new PerformanceObserver(e=>{for(const t of e.getEntries())"first-contentful-paint"===t.name&&(this.metrics.fcp=t.startTime)}).observe({entryTypes:["paint"]})}catch(e){console.warn("FCP监控失败:",e)}if("PerformanceObserver"in window)try{new PerformanceObserver(e=>{for(const t of e.getEntries())this.metrics.lcp=t.startTime}).observe({entryTypes:["largest-contentful-paint"]})}catch(e){console.warn("LCP监控失败:",e)}if("PerformanceObserver"in window)try{let e=0;new PerformanceObserver(t=>{for(const i of t.getEntries())i.hadRecentInput||(e+=i.value);this.metrics.cls=e}).observe({entryTypes:["layout-shift"]})}catch(e){console.warn("CLS监控失败:",e)}}handleResourceLoad(e){const t={name:e.name,type:e.initiatorType,duration:e.duration,size:e.transferSize,timestamp:Date.now()};this.metrics.resourceLoad.push(t),e.duration>3e3&&this.reportSlowResource(t)}handleApiRequest(e,t,i){const r={url:"string"==typeof e?e:e.toString(),duration:t,status:i,timestamp:Date.now()};this.metrics.apiRequests.push(r),t>5e3&&this.reportSlowApi(r)}handlePageHidden(){this.calculatePageStayTime()}handlePageVisible(){this.pageStartTime=Date.now()}calculatePageStayTime(){const e=Date.now()-this.pageStartTime;this.reportPageStayTime(e)}reportPerformanceMetrics(){const e={type:"performance",timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent,metrics:this.metrics,user:this.config.getUser(),device:this.getDeviceInfo()};this.performanceQueue.push(e),this.performanceQueue.length>=this.config.getConfig().maxQueueSize&&this.flushPerformanceQueue(),0===this.config.getConfig().reportInterval&&this.reporter.report("performance",[e])}reportSlowResource(e){this.reporter.report("slow_resource",[e])}reportSlowApi(e){this.reporter.report("slow_api",[e])}reportPageStayTime(e){const t={type:"page_stay",url:window.location.href,stayTime:e,timestamp:Date.now()};this.reporter.report("page_stay",[t])}getDeviceInfo(){return{screen:{width:screen.width,height:screen.height,availWidth:screen.availWidth,availHeight:screen.availHeight,colorDepth:screen.colorDepth,pixelDepth:screen.pixelDepth},viewport:{width:window.innerWidth,height:window.innerHeight},connection:navigator.connection?{effectiveType:navigator.connection.effectiveType,downlink:navigator.connection.downlink,rtt:navigator.connection.rtt}:null,memory:navigator.memory?{usedJSHeapSize:navigator.memory.usedJSHeapSize,totalJSHeapSize:navigator.memory.totalJSHeapSize,jsHeapSizeLimit:navigator.memory.jsHeapSizeLimit}:null}}initThirdPartySDKs(){const e=this.config.getThirdPartyConfig();e.baidu&&window._hmt&&(this.thirdPartySDKs.baidu=window._hmt),e.umeng&&window._um&&(this.thirdPartySDKs.umeng=window._um),e.sensors&&window.sensors&&(this.thirdPartySDKs.sensors=window.sensors),e.tencent&&window.MTA&&(this.thirdPartySDKs.tencent=window.MTA)}flushPerformanceQueue(){this.performanceQueue.length>0&&(this.reporter.report("performance",[...this.performanceQueue]),this.performanceQueue=[])}reportPerformance(e={}){const t={type:"custom_performance",timestamp:Date.now(),url:window.location.href,metrics:e,user:this.config.getUser()};this.reporter.report("performance",[t])}getCurrentMetrics(){return{...this.metrics}}destroy(){this.flushPerformanceQueue(),this.isInitialized=!1}}class n{constructor(t){this.config=t,this.reporter=new e(t),this.isInitialized=!1,this.behaviorQueue=[],this.sessionId=this.generateSessionId(),this.pageStartTime=Date.now(),this.scrollDepth=0,this.mouseMovements=[],this.keyStrokes=[],this.formInteractions=[],this.behaviors={pageViews:[],clicks:[],scrolls:[],formSubmissions:[],navigation:[],timeOnPage:0}}init(){if(this.isInitialized)return;const e=this.config.getConfig();e.enablePageViewTracking&&this.setupPageViewTracking(),e.enableUserInteractionTracking&&this.setupUserInteractionTracking(),e.enableFormTracking&&this.setupFormTracking(),e.enableScrollTracking&&this.setupScrollTracking(),e.enableMouseTracking&&this.setupMouseTracking(),e.enableKeyboardTracking&&this.setupKeyboardTracking(),this.setupTimeTracking(),this.trackReferrer(),this.isInitialized=!0}setupPageViewTracking(){this.trackPageView(),this.setupRouteChangeTracking(),document.addEventListener("visibilitychange",()=>{document.hidden?this.handlePageHidden():this.handlePageVisible()})}setupRouteChangeTracking(){window.addEventListener("popstate",()=>{this.trackPageView()});const e=history.pushState,t=history.replaceState;history.pushState=function(...t){e.apply(history,t),setTimeout(()=>{this.trackPageView()},0)}.bind(this),history.replaceState=function(...e){t.apply(history,e),setTimeout(()=>{this.trackPageView()},0)}.bind(this)}setupUserInteractionTracking(){document.addEventListener("click",e=>{this.trackClick(e)},!0),document.addEventListener("dblclick",e=>{this.trackDoubleClick(e)},!0),document.addEventListener("contextmenu",e=>{this.trackRightClick(e)},!0),"ontouchstart"in window&&document.addEventListener("touchstart",e=>{this.trackTouch(e)},!0)}setupFormTracking(){document.addEventListener("submit",e=>{this.trackFormSubmission(e)},!0),document.addEventListener("change",e=>{"INPUT"!==e.target.tagName&&"SELECT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName||this.trackFormFieldChange(e)},!0),document.addEventListener("focus",e=>{"INPUT"!==e.target.tagName&&"SELECT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName||this.trackFormFieldFocus(e)},!0),document.addEventListener("blur",e=>{"INPUT"!==e.target.tagName&&"SELECT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName||this.trackFormFieldBlur(e)},!0)}setupScrollTracking(){let e;document.addEventListener("scroll",()=>{clearTimeout(e),e=setTimeout(()=>{const e=window.pageYOffset||document.documentElement.scrollTop,t=document.documentElement.scrollHeight,i=document.documentElement.clientHeight,r=Math.round(e/(t-i)*100);r>this.scrollDepth&&(this.scrollDepth=r,this.trackScroll(r,e))},100)},{passive:!0})}setupMouseTracking(){let e,t=[];document.addEventListener("mousemove",i=>{clearTimeout(e),t.push({x:i.clientX,y:i.clientY,timestamp:Date.now()}),t.length>100&&t.shift(),e=setTimeout(()=>{t.length>10&&(this.trackMouseMovement(t),t=[])},1e3)},{passive:!0})}setupKeyboardTracking(){document.addEventListener("keydown",e=>{"password"!==e.target.type&&this.trackKeyStroke(e)},!0)}setupTimeTracking(){setInterval(()=>{this.behaviors.timeOnPage+=1},1e3),window.addEventListener("beforeunload",()=>{this.reportTimeOnPage()})}trackReferrer(){const e=document.referrer;if(e){const t={type:"referrer",url:e,domain:this.extractDomain(e),timestamp:Date.now()};this.behaviors.navigation.push(t),this.reportBehavior("referrer",t)}}trackPageView(){const e={type:"pageview",url:window.location.href,title:document.title,timestamp:Date.now(),sessionId:this.sessionId,referrer:document.referrer};this.behaviors.pageViews.push(e),this.reportBehavior("pageview",e),this.pageStartTime=Date.now(),this.scrollDepth=0}trackClick(e){const t={type:"click",element:{tagName:e.target.tagName,className:e.target.className,id:e.target.id,text:e.target.textContent?.substring(0,50),href:e.target.href},position:{x:e.clientX,y:e.clientY,pageX:e.pageX,pageY:e.pageY},timestamp:Date.now(),sessionId:this.sessionId};this.behaviors.clicks.push(t),this.reportBehavior("click",t)}trackDoubleClick(e){const t={type:"doubleclick",element:{tagName:e.target.tagName,className:e.target.className,id:e.target.id},position:{x:e.clientX,y:e.clientY},timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("doubleclick",t)}trackRightClick(e){const t={type:"rightclick",element:{tagName:e.target.tagName,className:e.target.className,id:e.target.id},position:{x:e.clientX,y:e.clientY},timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("rightclick",t)}trackTouch(e){const t={type:"touch",touches:Array.from(e.touches).map(e=>({x:e.clientX,y:e.clientY,identifier:e.identifier})),timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("touch",t)}trackFormSubmission(e){const t={type:"form_submission",form:{action:e.target.action,method:e.target.method,id:e.target.id,className:e.target.className},fields:this.getFormFields(e.target),timestamp:Date.now(),sessionId:this.sessionId};this.behaviors.formSubmissions.push(t),this.reportBehavior("form_submission",t)}trackFormFieldChange(e){const t={type:"form_field_change",field:{name:e.target.name,type:e.target.type,value:"password"===e.target.type?"***":e.target.value,id:e.target.id},timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("form_field_change",t)}trackFormFieldFocus(e){const t={type:"form_field_focus",field:{name:e.target.name,type:e.target.type,id:e.target.id},timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("form_field_focus",t)}trackFormFieldBlur(e){const t={type:"form_field_blur",field:{name:e.target.name,type:e.target.type,id:e.target.id},timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("form_field_blur",t)}trackScroll(e,t){const i={type:"scroll",depth:e,scrollTop:t,timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("scroll",i)}trackMouseMovement(e){const t={type:"mouse_movement",movements:e,timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("mouse_movement",t)}trackKeyStroke(e){const t={type:"keystroke",key:e.key,code:e.code,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("keystroke",t)}handlePageHidden(){this.reportTimeOnPage()}handlePageVisible(){this.pageStartTime=Date.now()}reportTimeOnPage(){const e={type:"time_on_page",time:this.behaviors.timeOnPage,url:window.location.href,timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("time_on_page",e)}reportBehavior(e,t){const i={type:e,data:t,user:this.config.getUser(),config:{appId:this.config.getConfig().appId,appVersion:this.config.getConfig().appVersion,environment:this.config.getConfig().environment}};this.behaviorQueue.push(i),this.behaviorQueue.length>=this.config.getConfig().maxQueueSize&&this.flushBehaviorQueue(),0===this.config.getConfig().reportInterval&&this.reporter.report("behavior",[i])}reportCustomBehavior(e,t={}){const i={type:"custom_behavior",eventName:e,...t,timestamp:Date.now(),sessionId:this.sessionId};this.reportBehavior("custom_behavior",i)}flushBehaviorQueue(){this.behaviorQueue.length>0&&(this.reporter.report("behavior",[...this.behaviorQueue]),this.behaviorQueue=[])}getFormFields(e){const t=[],i=e.elements;for(let e=0;e<i.length;e++){const r=i[e];r.name&&t.push({name:r.name,type:r.type,value:"password"===r.type?"***":r.value})}return t}extractDomain(e){try{return new URL(e).hostname}catch(t){return e}}generateSessionId(){return"session_"+Date.now()+"_"+Math.random().toString(36).substr(2,9)}getCurrentBehaviors(){return{...this.behaviors}}getSessionId(){return this.sessionId}destroy(){this.flushBehaviorQueue(),this.reportTimeOnPage(),this.isInitialized=!1}}class s{constructor(e){this.config=e,this.integratedSDKs={},this.isInitialized=!1}init(){if(this.isInitialized)return;const e=this.config.getThirdPartyConfig();e.baidu&&e.baidu.enabled&&this.initBaiduAnalytics(e.baidu),e.umeng&&e.umeng.enabled&&this.initUmengAnalytics(e.umeng),e.sensors&&e.sensors.enabled&&this.initSensorsAnalytics(e.sensors),e.tencent&&e.tencent.enabled&&this.initTencentAnalytics(e.tencent),e.google&&e.google.enabled&&this.initGoogleAnalytics(e.google),e.custom&&e.custom.enabled&&this.initCustomAnalytics(e.custom),this.isInitialized=!0}initBaiduAnalytics(e){try{window._hmt?(this.integratedSDKs.baidu={name:"baidu",instance:window._hmt,config:e},e.siteId&&window._hmt.push(["_setAccount",e.siteId]),!1!==e.autoPageview&&window._hmt.push(["_trackPageview"]),console.log("百度统计集成成功")):console.warn("百度统计未加载,请检查脚本是否正确引入")}catch(e){console.error("百度统计集成失败:",e)}}initUmengAnalytics(e){try{window._um?(this.integratedSDKs.umeng={name:"umeng",instance:window._um,config:e},e.siteId&&window._um.push(["setAccount",e.siteId]),!1!==e.autoPageview&&window._um.push(["trackPageview"]),console.log("友盟统计集成成功")):console.warn("友盟统计未加载,请检查脚本是否正确引入")}catch(e){console.error("友盟统计集成失败:",e)}}initSensorsAnalytics(e){try{window.sensors?(this.integratedSDKs.sensors={name:"sensors",instance:window.sensors,config:e},e.serverUrl&&window.sensors.setServerUrl(e.serverUrl),e.siteId&&window.sensors.setSiteId(e.siteId),!1!==e.autoPageview&&window.sensors.trackPageview(),console.log("神策数据集成成功")):console.warn("神策数据未加载,请检查脚本是否正确引入")}catch(e){console.error("神策数据集成失败:",e)}}initTencentAnalytics(e){try{window.MTA?(this.integratedSDKs.tencent={name:"tencent",instance:window.MTA,config:e},e.appId&&window.MTA.setAppId(e.appId),!1!==e.autoPageview&&window.MTA.trackPageview(),console.log("腾讯云分析集成成功")):console.warn("腾讯云分析未加载,请检查脚本是否正确引入")}catch(e){console.error("腾讯云分析集成失败:",e)}}initGoogleAnalytics(e){try{window.gtag?(this.integratedSDKs.google={name:"google",instance:window.gtag,config:e},e.measurementId&&window.gtag("config",e.measurementId,{page_title:document.title,page_location:window.location.href}),console.log("Google Analytics集成成功")):console.warn("Google Analytics未加载,请检查脚本是否正确引入")}catch(e){console.error("Google Analytics集成失败:",e)}}initCustomAnalytics(e){try{if("function"==typeof e.init){const t=e.init(e);this.integratedSDKs.custom={name:"custom",instance:t,config:e},console.log("自定义第三方集成成功")}else console.warn("自定义第三方配置缺少init函数")}catch(e){console.error("自定义第三方集成失败:",e)}}reportEvent(e,t={}){Object.values(this.integratedSDKs).forEach(i=>{try{this.reportToSDK(i,e,t)}catch(e){console.error(`上报事件到${i.name}失败:`,e)}})}reportPageView(e={}){Object.values(this.integratedSDKs).forEach(t=>{try{this.reportPageViewToSDK(t,e)}catch(e){console.error(`上报页面浏览到${t.name}失败:`,e)}})}reportUser(e={}){Object.values(this.integratedSDKs).forEach(t=>{try{this.reportUserToSDK(t,e)}catch(e){console.error(`上报用户信息到${t.name}失败:`,e)}})}reportPerformance(e={}){Object.values(this.integratedSDKs).forEach(t=>{try{this.reportPerformanceToSDK(t,e)}catch(e){console.error(`上报性能指标到${t.name}失败:`,e)}})}reportToSDK(e,t,i){switch(e.name){case"baidu":e.instance&&e.instance.push&&e.instance.push(["_trackEvent",t,JSON.stringify(i)]);break;case"umeng":e.instance&&e.instance.push&&e.instance.push(["track",t,i]);break;case"sensors":e.instance&&e.instance.track&&e.instance.track(t,i);break;case"tencent":e.instance&&e.instance.Event&&e.instance.Event.stat&&e.instance.Event.stat(t,i);break;case"google":e.instance&&"function"==typeof e.instance&&e.instance("event",t,i);break;case"custom":e.instance&&"function"==typeof e.instance.track&&e.instance.track(t,i);break;default:console.warn(`未知的SDK类型: ${e.name}`)}}reportPageViewToSDK(e,t){switch(e.name){case"baidu":e.instance&&e.instance.push&&e.instance.push(["_trackPageview",t.url||window.location.href]);break;case"umeng":e.instance&&e.instance.push&&e.instance.push(["trackPageview",t.url||window.location.href]);break;case"sensors":e.instance&&e.instance.trackPageview&&e.instance.trackPageview(t);break;case"tencent":e.instance&&e.instance.trackPageview&&e.instance.trackPageview(t.url||window.location.href);break;case"google":e.instance&&"function"==typeof e.instance&&e.instance("config",e.config.measurementId,{page_title:t.title||document.title,page_location:t.url||window.location.href});break;case"custom":e.instance&&"function"==typeof e.instance.trackPageview&&e.instance.trackPageview(t);break;default:console.warn(`未知的SDK类型: ${e.name}`)}}reportUserToSDK(e,t){switch(e.name){case"baidu":e.instance&&e.instance.push&&(e.instance.push(["_setUserTag","userId",t.userId]),e.instance.push(["_setUserTag","userType",t.userType]));break;case"umeng":e.instance&&e.instance.push&&(e.instance.push(["setUserTag","userId",t.userId]),e.instance.push(["setUserTag","userType",t.userType]));break;case"sensors":e.instance&&e.instance.setProfile&&e.instance.setProfile(t);break;case"tencent":e.instance&&e.instance.setUserInfo&&e.instance.setUserInfo(t);break;case"google":e.instance&&"function"==typeof e.instance&&e.instance("set","user_id",t.userId);break;case"custom":e.instance&&"function"==typeof e.instance.setUser&&e.instance.setUser(t);break;default:console.warn(`未知的SDK类型: ${e.name}`)}}reportPerformanceToSDK(e,t){switch(e.name){case"baidu":e.instance&&e.instance.push&&e.instance.push(["_trackEvent","performance",JSON.stringify(t)]);break;case"umeng":e.instance&&e.instance.push&&e.instance.push(["track","performance",t]);break;case"sensors":e.instance&&e.instance.track&&e.instance.track("performance",t);break;case"tencent":e.instance&&e.instance.Event&&e.instance.Event.stat&&e.instance.Event.stat("performance",t);break;case"google":e.instance&&"function"==typeof e.instance&&e.instance("event","performance",t);break;case"custom":e.instance&&"function"==typeof e.instance.trackPerformance&&e.instance.trackPerformance(t);break;default:console.warn(`未知的SDK类型: ${e.name}`)}}isSDKIntegrated(e){return!!this.integratedSDKs[e]}getIntegratedSDKs(){return Object.keys(this.integratedSDKs)}getSDKInstance(e){return this.integratedSDKs[e]?.instance||null}destroy(){Object.values(this.integratedSDKs).forEach(e=>{try{e.instance&&"function"==typeof e.instance.destroy&&e.instance.destroy()}catch(t){console.error(`销毁${e.name}失败:`,t)}}),this.integratedSDKs={},this.isInitialized=!1}}class o{constructor(e={}){this.config={appId:e.appId||"",appVersion:e.appVersion||"1.0.0",environment:e.environment||"production",reportUrl:e.reportUrl||"",reportInterval:e.reportInterval||5e3,maxQueueSize:e.maxQueueSize||100,enableErrorTracking:!1!==e.enableErrorTracking,enableUnhandledRejection:!1!==e.enableUnhandledRejection,enableResourceError:!1!==e.enableResourceError,enableEventTracking:!1!==e.enableEventTracking,enableClickTracking:!1!==e.enableClickTracking,enablePageViewTracking:!1!==e.enablePageViewTracking,enablePerformanceTracking:!1!==e.enablePerformanceTracking,enableResourceTracking:!1!==e.enableResourceTracking,enableApiTracking:!1!==e.enableApiTracking,enableInteractionTracking:!1!==e.enableInteractionTracking,enableUserInteractionTracking:!1!==e.enableUserInteractionTracking,enableFormTracking:!1!==e.enableFormTracking,enableScrollTracking:!1!==e.enableScrollTracking,enableMouseTracking:!1!==e.enableMouseTracking,enableKeyboardTracking:!1!==e.enableKeyboardTracking,thirdPartyConfig:e.thirdPartyConfig||{},user:e.user||null,customReport:e.customReport||null},this.user=null}updateConfig(e){this.config={...this.config,...e}}setUser(e){this.user=e}getConfig(){return this.config}getUser(){return this.user}getReportUrl(){return this.config.reportUrl}getThirdPartyConfig(){return this.config.thirdPartyConfig}isErrorTrackingEnabled(){return this.config.enableErrorTracking}isEventTrackingEnabled(){return this.config.enableEventTracking}}module.exports=class{constructor(e={}){this.config=new o(e),this.errorTracker=new t(this.config),this.eventTracker=new i(this.config),this.performanceTracker=new r(this.config),this.userBehaviorTracker=new n(this.config),this.thirdPartyIntegrator=new s(this.config),this.init()}init(){this.errorTracker.init(),this.eventTracker.init(),this.performanceTracker.init(),this.userBehaviorTracker.init(),this.thirdPartyIntegrator.init(),console.log("Frontend SDK 初始化完成")}reportError(e,t={}){this.errorTracker.reportError(e,t)}reportEvent(e,t={}){this.eventTracker.reportEvent(e,t)}reportPerformance(e={}){this.performanceTracker.reportPerformance(e)}reportBehavior(e,t={}){this.userBehaviorTracker.reportCustomBehavior(e,t)}setUser(e){this.config.setUser(e),this.thirdPartyIntegrator.reportUser(e)}setConfig(e){this.config.updateConfig(e)}getPerformanceMetrics(){return this.performanceTracker.getCurrentMetrics()}getBehaviorData(){return this.userBehaviorTracker.getCurrentBehaviors()}getSessionId(){return this.userBehaviorTracker.getSessionId()}isThirdPartySDKIntegrated(e){return this.thirdPartyIntegrator.isSDKIntegrated(e)}getIntegratedThirdPartySDKs(){return this.thirdPartyIntegrator.getIntegratedSDKs()}destroy(){this.errorTracker.destroy(),this.eventTracker.destroy(),this.performanceTracker.destroy(),this.userBehaviorTracker.destroy(),this.thirdPartyIntegrator.destroy(),console.log("Frontend SDK 已销毁")}};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../reporter.js","../errorTracker.js","../eventTracker.js","../performanceTracker.js","../userBehaviorTracker.js","../thirdPartyIntegrator.js","../configManager.js","../index.js"],"sourcesContent":["// 上报器\nexport class Reporter {\n constructor(config) {\n this.config = config\n this.isReporting = false\n }\n \n // 上报数据\n async report(type, data) {\n if (this.isReporting) return\n \n this.isReporting = true\n \n try {\n const reportData = this.formatReportData(type, data)\n \n // 优先使用自定义上报函数\n if (this.config.getConfig().customReport) {\n await this.config.getConfig().customReport(type, reportData)\n } else {\n // 使用默认上报方式\n await this.defaultReport(type, reportData)\n }\n } catch (error) {\n console.error('上报失败:', error)\n } finally {\n this.isReporting = false\n }\n }\n \n // 格式化上报数据\n formatReportData(type, data) {\n const baseData = {\n type,\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n user: this.config.getUser(),\n config: {\n appId: this.config.getConfig().appId,\n appVersion: this.config.getConfig().appVersion,\n environment: this.config.getConfig().environment\n }\n }\n \n return {\n ...baseData,\n data: Array.isArray(data) ? data : [data]\n }\n }\n \n // 默认上报方式\n async defaultReport(type, reportData) {\n const reportUrl = this.config.getReportUrl()\n const thirdPartyConfig = this.config.getThirdPartyConfig()\n \n // 上报到后端接口\n if (reportUrl) {\n await this.reportToBackend(reportUrl, reportData)\n }\n \n // 上报到第三方埋点\n if (thirdPartyConfig && Object.keys(thirdPartyConfig).length > 0) {\n await this.reportToThirdParty(thirdPartyConfig, reportData)\n }\n }\n \n // 上报到后端接口\n async reportToBackend(url, data) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n return await response.json()\n } catch (error) {\n console.error('后端上报失败:', error)\n throw error\n }\n }\n \n // 上报到第三方埋点\n async reportToThirdParty(config, data) {\n const promises = []\n \n // 百度统计\n if (config.baidu && window._hmt) {\n promises.push(this.reportToBaidu(config.baidu, data))\n }\n \n // 友盟统计\n if (config.umeng && window._um) {\n promises.push(this.reportToUmeng(config.umeng, data))\n }\n \n // 神策数据\n if (config.sensors && window.sensors) {\n promises.push(this.reportToSensors(config.sensors, data))\n }\n \n // 腾讯云分析\n if (config.tencent && window.MTA) {\n promises.push(this.reportToTencent(config.tencent, data))\n }\n \n // 自定义第三方\n if (config.custom) {\n promises.push(this.reportToCustom(config.custom, data))\n }\n \n try {\n await Promise.allSettled(promises)\n } catch (error) {\n console.error('第三方上报失败:', error)\n }\n }\n \n // 上报到百度统计\n async reportToBaidu(config, data) {\n if (window._hmt) {\n window._hmt.push(['_trackEvent', data.type, JSON.stringify(data.data)])\n }\n }\n \n // 上报到友盟统计\n async reportToUmeng(config, data) {\n if (window._um) {\n window._um.push(['track', data.type, data.data])\n }\n }\n \n // 上报到神策数据\n async reportToSensors(config, data) {\n if (window.sensors) {\n window.sensors.track(data.type, data.data[0] || {})\n }\n }\n \n // 上报到腾讯云分析\n async reportToTencent(config, data) {\n if (window.MTA) {\n window.MTA.Event.stat(data.type, data.data[0] || {})\n }\n }\n \n // 上报到自定义第三方\n async reportToCustom(config, data) {\n if (typeof config.report === 'function') {\n await config.report(data)\n }\n }\n} ","// 错误追踪器\nimport { Reporter } from './reporter'\n\nexport class ErrorTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.errorQueue = []\n this.isInitialized = false\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 监听 JavaScript 错误\n if (config.enableErrorTracking) {\n this.setupErrorListener()\n }\n \n // 监听未处理的 Promise 拒绝\n if (config.enableUnhandledRejection) {\n this.setupUnhandledRejectionListener()\n }\n \n // 监听资源加载错误\n if (config.enableResourceError) {\n this.setupResourceErrorListener()\n }\n \n this.isInitialized = true\n }\n \n // 设置错误监听器\n setupErrorListener() {\n window.addEventListener('error', (event) => {\n this.handleError(event.error || event.message, {\n type: 'javascript',\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n stack: event.error?.stack\n })\n }, true)\n }\n \n // 设置未处理 Promise 拒绝监听器\n setupUnhandledRejectionListener() {\n window.addEventListener('unhandledrejection', (event) => {\n this.handleError(event.reason, {\n type: 'unhandledrejection',\n stack: event.reason?.stack\n })\n })\n }\n \n // 设置资源错误监听器\n setupResourceErrorListener() {\n window.addEventListener('error', (event) => {\n if (event.target && event.target !== window) {\n this.handleError(`Resource load failed: ${event.target.src || event.target.href}`, {\n type: 'resource',\n tagName: event.target.tagName,\n src: event.target.src,\n href: event.target.href\n })\n }\n }, true)\n }\n \n // 处理错误\n handleError(error, context = {}) {\n const errorInfo = {\n message: error?.message || error?.toString() || error,\n stack: error?.stack || context.stack,\n type: context.type || 'unknown',\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n ...context\n }\n \n // 添加到队列\n this.errorQueue.push(errorInfo)\n \n // 检查队列大小\n if (this.errorQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushErrorQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('error', [errorInfo])\n }\n }\n \n // 手动上报错误\n reportError(error, context = {}) {\n this.handleError(error, context)\n }\n \n // 刷新错误队列\n flushErrorQueue() {\n if (this.errorQueue.length > 0) {\n this.reporter.report('error', [...this.errorQueue])\n this.errorQueue = []\n }\n }\n \n // 销毁\n destroy() {\n this.flushErrorQueue()\n this.isInitialized = false\n }\n} ","// 事件追踪器\nimport { Reporter } from './reporter'\n\nexport class EventTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.eventQueue = []\n this.isInitialized = false\n this.clickListener = null\n this.pageViewListener = null\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 监听点击事件\n if (config.enableClickTracking) {\n this.setupClickTracking()\n }\n \n // 监听页面浏览\n if (config.enablePageViewTracking) {\n this.setupPageViewTracking()\n }\n \n // 设置定时上报\n this.setupPeriodicReport()\n \n this.isInitialized = true\n }\n \n // 设置点击追踪\n setupClickTracking() {\n this.clickListener = (event) => {\n const target = event.target\n const clickData = {\n type: 'click',\n timestamp: Date.now(),\n url: window.location.href,\n element: {\n tagName: target.tagName,\n className: target.className,\n id: target.id,\n text: target.textContent?.substring(0, 50)\n },\n position: {\n x: event.clientX,\n y: event.clientY\n }\n }\n \n this.handleEvent('click', clickData)\n }\n \n document.addEventListener('click', this.clickListener, true)\n }\n \n // 设置页面浏览追踪\n setupPageViewTracking() {\n // 初始页面浏览\n this.handleEvent('pageview', {\n type: 'pageview',\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n referrer: document.referrer\n })\n \n // 监听路由变化(适用于 SPA)\n this.pageViewListener = () => {\n this.handleEvent('pageview', {\n type: 'pageview',\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n referrer: document.referrer\n })\n }\n \n // 监听 popstate 事件\n window.addEventListener('popstate', this.pageViewListener)\n \n // 监听 pushstate 和 replacestate\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n \n history.pushState = function(...args) {\n originalPushState.apply(history, args)\n setTimeout(() => {\n this.pageViewListener()\n }, 0)\n }.bind(this)\n \n history.replaceState = function(...args) {\n originalReplaceState.apply(history, args)\n setTimeout(() => {\n this.pageViewListener()\n }, 0)\n }.bind(this)\n }\n \n // 设置定时上报\n setupPeriodicReport() {\n const interval = this.config.getConfig().reportInterval\n if (interval > 0) {\n setInterval(() => {\n this.flushEventQueue()\n }, interval)\n }\n }\n \n // 处理事件\n handleEvent(eventName, data) {\n const eventInfo = {\n eventName,\n ...data,\n user: this.config.getUser(),\n config: {\n appId: this.config.getConfig().appId,\n appVersion: this.config.getConfig().appVersion,\n environment: this.config.getConfig().environment\n }\n }\n \n // 添加到队列\n this.eventQueue.push(eventInfo)\n \n // 检查队列大小\n if (this.eventQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushEventQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('event', [eventInfo])\n }\n }\n \n // 手动上报事件\n reportEvent(eventName, data = {}) {\n this.handleEvent(eventName, {\n type: 'custom',\n timestamp: Date.now(),\n url: window.location.href,\n ...data\n })\n }\n \n // 刷新事件队列\n flushEventQueue() {\n if (this.eventQueue.length > 0) {\n this.reporter.report('event', [...this.eventQueue])\n this.eventQueue = []\n }\n }\n \n // 销毁\n destroy() {\n this.flushEventQueue()\n \n if (this.clickListener) {\n document.removeEventListener('click', this.clickListener, true)\n }\n \n if (this.pageViewListener) {\n window.removeEventListener('popstate', this.pageViewListener)\n }\n \n this.isInitialized = false\n }\n} ","// 性能监控器\nimport { Reporter } from './reporter'\n\nexport class PerformanceTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.isInitialized = false\n this.pageStartTime = Date.now()\n this.performanceQueue = []\n this.thirdPartySDKs = {}\n \n // 性能指标\n this.metrics = {\n fcp: 0, // First Contentful Paint\n lcp: 0, // Largest Contentful Paint\n fid: 0, // First Input Delay\n cls: 0, // Cumulative Layout Shift\n ttfb: 0, // Time to First Byte\n domLoad: 0, // DOM加载时间\n windowLoad: 0, // 页面完全加载时间\n resourceLoad: [], // 资源加载时间\n apiRequests: [] // API请求时间\n }\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 监控页面性能\n if (config.enablePerformanceTracking) {\n this.setupPerformanceMonitoring()\n }\n \n // 监控资源加载\n if (config.enableResourceTracking) {\n this.setupResourceMonitoring()\n }\n \n // 监控API请求\n if (config.enableApiTracking) {\n this.setupApiMonitoring()\n }\n \n // 监控用户交互性能\n if (config.enableInteractionTracking) {\n this.setupInteractionMonitoring()\n }\n \n // 初始化第三方SDK\n this.initThirdPartySDKs()\n \n this.isInitialized = true\n }\n \n // 设置性能监控\n setupPerformanceMonitoring() {\n // 等待页面加载完成\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.captureDOMLoadTime()\n })\n } else {\n this.captureDOMLoadTime()\n }\n \n window.addEventListener('load', () => {\n this.captureWindowLoadTime()\n this.captureWebVitals()\n this.reportPerformanceMetrics()\n })\n \n // 监控页面可见性变化\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n this.handlePageHidden()\n } else {\n this.handlePageVisible()\n }\n })\n }\n \n // 设置资源监控\n setupResourceMonitoring() {\n // 监控资源加载\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === 'resource') {\n this.handleResourceLoad(entry)\n }\n }\n })\n \n try {\n observer.observe({ entryTypes: ['resource'] })\n } catch (e) {\n // 降级方案:手动监控\n this.setupResourceFallback()\n }\n }\n \n // 设置API监控\n setupApiMonitoring() {\n // 拦截fetch请求\n const originalFetch = window.fetch\n window.fetch = async (...args) => {\n const startTime = performance.now()\n try {\n const response = await originalFetch(...args)\n const endTime = performance.now()\n this.handleApiRequest(args[0], endTime - startTime, response.status)\n return response\n } catch (error) {\n const endTime = performance.now()\n this.handleApiRequest(args[0], endTime - startTime, 'error')\n throw error\n }\n }\n \n // 拦截XMLHttpRequest\n const originalXHROpen = XMLHttpRequest.prototype.open\n const originalXHRSend = XMLHttpRequest.prototype.send\n \n XMLHttpRequest.prototype.open = function(method, url, ...args) {\n this._startTime = performance.now()\n this._url = url\n this._method = method\n return originalXHROpen.apply(this, [method, url, ...args])\n }\n \n XMLHttpRequest.prototype.send = function(...args) {\n const xhr = this\n const originalOnReadyStateChange = xhr.onreadystatechange\n \n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n const endTime = performance.now()\n const duration = endTime - xhr._startTime\n this.handleApiRequest(xhr._url, duration, xhr.status)\n }\n \n if (originalOnReadyStateChange) {\n originalOnReadyStateChange.apply(xhr, arguments)\n }\n }.bind(this)\n \n return originalXHRSend.apply(xhr, args)\n }.bind(this)\n }\n \n // 设置交互监控\n setupInteractionMonitoring() {\n // 监控用户交互延迟\n let firstInputTime = 0\n let firstInputDelay = 0\n \n const handleFirstInput = (event) => {\n if (firstInputTime === 0) {\n firstInputTime = performance.now()\n firstInputDelay = firstInputTime - this.metrics.fcp\n \n this.metrics.fid = firstInputDelay\n \n // 移除事件监听器\n document.removeEventListener('click', handleFirstInput, true)\n document.removeEventListener('keydown', handleFirstInput, true)\n document.removeEventListener('touchstart', handleFirstInput, true)\n }\n }\n \n document.addEventListener('click', handleFirstInput, true)\n document.addEventListener('keydown', handleFirstInput, true)\n document.addEventListener('touchstart', handleFirstInput, true)\n }\n \n // 捕获DOM加载时间\n captureDOMLoadTime() {\n this.metrics.domLoad = performance.now()\n }\n \n // 捕获页面完全加载时间\n captureWindowLoadTime() {\n this.metrics.windowLoad = performance.now()\n }\n \n // 捕获Web Vitals指标\n captureWebVitals() {\n // First Contentful Paint\n if ('PerformanceObserver' in window) {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n this.metrics.fcp = entry.startTime\n }\n }\n })\n observer.observe({ entryTypes: ['paint'] })\n } catch (e) {\n console.warn('FCP监控失败:', e)\n }\n }\n \n // Largest Contentful Paint\n if ('PerformanceObserver' in window) {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.metrics.lcp = entry.startTime\n }\n })\n observer.observe({ entryTypes: ['largest-contentful-paint'] })\n } catch (e) {\n console.warn('LCP监控失败:', e)\n }\n }\n \n // Cumulative Layout Shift\n if ('PerformanceObserver' in window) {\n try {\n let clsValue = 0\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!entry.hadRecentInput) {\n clsValue += entry.value\n }\n }\n this.metrics.cls = clsValue\n })\n observer.observe({ entryTypes: ['layout-shift'] })\n } catch (e) {\n console.warn('CLS监控失败:', e)\n }\n }\n }\n \n // 处理资源加载\n handleResourceLoad(entry) {\n const resourceInfo = {\n name: entry.name,\n type: entry.initiatorType,\n duration: entry.duration,\n size: entry.transferSize,\n timestamp: Date.now()\n }\n \n this.metrics.resourceLoad.push(resourceInfo)\n \n // 检查资源加载性能\n if (entry.duration > 3000) { // 超过3秒的资源\n this.reportSlowResource(resourceInfo)\n }\n }\n \n // 处理API请求\n handleApiRequest(url, duration, status) {\n const apiInfo = {\n url: typeof url === 'string' ? url : url.toString(),\n duration,\n status,\n timestamp: Date.now()\n }\n \n this.metrics.apiRequests.push(apiInfo)\n \n // 检查API性能\n if (duration > 5000) { // 超过5秒的API\n this.reportSlowApi(apiInfo)\n }\n }\n \n // 处理页面隐藏\n handlePageHidden() {\n this.calculatePageStayTime()\n }\n \n // 处理页面显示\n handlePageVisible() {\n this.pageStartTime = Date.now()\n }\n \n // 计算页面停留时间\n calculatePageStayTime() {\n const stayTime = Date.now() - this.pageStartTime\n this.reportPageStayTime(stayTime)\n }\n \n // 上报性能指标\n reportPerformanceMetrics() {\n const performanceData = {\n type: 'performance',\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n metrics: this.metrics,\n user: this.config.getUser(),\n device: this.getDeviceInfo()\n }\n \n this.performanceQueue.push(performanceData)\n \n // 检查队列大小\n if (this.performanceQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushPerformanceQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('performance', [performanceData])\n }\n }\n \n // 上报慢资源\n reportSlowResource(resourceInfo) {\n this.reporter.report('slow_resource', [resourceInfo])\n }\n \n // 上报慢API\n reportSlowApi(apiInfo) {\n this.reporter.report('slow_api', [apiInfo])\n }\n \n // 上报页面停留时间\n reportPageStayTime(stayTime) {\n const stayData = {\n type: 'page_stay',\n url: window.location.href,\n stayTime,\n timestamp: Date.now()\n }\n \n this.reporter.report('page_stay', [stayData])\n }\n \n // 获取设备信息\n getDeviceInfo() {\n return {\n screen: {\n width: screen.width,\n height: screen.height,\n availWidth: screen.availWidth,\n availHeight: screen.availHeight,\n colorDepth: screen.colorDepth,\n pixelDepth: screen.pixelDepth\n },\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight\n },\n connection: navigator.connection ? {\n effectiveType: navigator.connection.effectiveType,\n downlink: navigator.connection.downlink,\n rtt: navigator.connection.rtt\n } : null,\n memory: navigator.memory ? {\n usedJSHeapSize: navigator.memory.usedJSHeapSize,\n totalJSHeapSize: navigator.memory.totalJSHeapSize,\n jsHeapSizeLimit: navigator.memory.jsHeapSizeLimit\n } : null\n }\n }\n \n // 初始化第三方SDK\n initThirdPartySDKs() {\n const config = this.config.getThirdPartyConfig()\n \n // 百度统计\n if (config.baidu && window._hmt) {\n this.thirdPartySDKs.baidu = window._hmt\n }\n \n // 友盟统计\n if (config.umeng && window._um) {\n this.thirdPartySDKs.umeng = window._um\n }\n \n // 神策数据\n if (config.sensors && window.sensors) {\n this.thirdPartySDKs.sensors = window.sensors\n }\n \n // 腾讯云分析\n if (config.tencent && window.MTA) {\n this.thirdPartySDKs.tencent = window.MTA\n }\n }\n \n // 刷新性能队列\n flushPerformanceQueue() {\n if (this.performanceQueue.length > 0) {\n this.reporter.report('performance', [...this.performanceQueue])\n this.performanceQueue = []\n }\n }\n \n // 手动上报性能指标\n reportPerformance(metrics = {}) {\n const performanceData = {\n type: 'custom_performance',\n timestamp: Date.now(),\n url: window.location.href,\n metrics,\n user: this.config.getUser()\n }\n \n this.reporter.report('performance', [performanceData])\n }\n \n // 获取当前性能指标\n getCurrentMetrics() {\n return { ...this.metrics }\n }\n \n // 销毁\n destroy() {\n this.flushPerformanceQueue()\n this.isInitialized = false\n }\n} ","// 用户行为追踪器\nimport { Reporter } from './reporter'\n\nexport class UserBehaviorTracker {\n constructor(config) {\n this.config = config\n this.reporter = new Reporter(config)\n this.isInitialized = false\n this.behaviorQueue = []\n this.sessionId = this.generateSessionId()\n this.pageStartTime = Date.now()\n this.scrollDepth = 0\n this.mouseMovements = []\n this.keyStrokes = []\n this.formInteractions = []\n \n // 行为数据\n this.behaviors = {\n pageViews: [],\n clicks: [],\n scrolls: [],\n formSubmissions: [],\n navigation: [],\n timeOnPage: 0\n }\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getConfig()\n \n // 追踪页面浏览\n if (config.enablePageViewTracking) {\n this.setupPageViewTracking()\n }\n \n // 追踪用户交互\n if (config.enableUserInteractionTracking) {\n this.setupUserInteractionTracking()\n }\n \n // 追踪表单行为\n if (config.enableFormTracking) {\n this.setupFormTracking()\n }\n \n // 追踪滚动行为\n if (config.enableScrollTracking) {\n this.setupScrollTracking()\n }\n \n // 追踪鼠标移动\n if (config.enableMouseTracking) {\n this.setupMouseTracking()\n }\n \n // 追踪键盘输入\n if (config.enableKeyboardTracking) {\n this.setupKeyboardTracking()\n }\n \n // 追踪页面停留时间\n this.setupTimeTracking()\n \n // 追踪访问来源\n this.trackReferrer()\n \n this.isInitialized = true\n }\n \n // 设置页面浏览追踪\n setupPageViewTracking() {\n // 初始页面浏览\n this.trackPageView()\n \n // 监听路由变化\n this.setupRouteChangeTracking()\n \n // 监听页面可见性变化\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n this.handlePageHidden()\n } else {\n this.handlePageVisible()\n }\n })\n }\n \n // 设置路由变化追踪\n setupRouteChangeTracking() {\n // 监听 popstate 事件\n window.addEventListener('popstate', () => {\n this.trackPageView()\n })\n \n // 监听 pushstate 和 replacestate\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n \n history.pushState = function(...args) {\n originalPushState.apply(history, args)\n setTimeout(() => {\n this.trackPageView()\n }, 0)\n }.bind(this)\n \n history.replaceState = function(...args) {\n originalReplaceState.apply(history, args)\n setTimeout(() => {\n this.trackPageView()\n }, 0)\n }.bind(this)\n }\n \n // 设置用户交互追踪\n setupUserInteractionTracking() {\n // 点击追踪\n document.addEventListener('click', (event) => {\n this.trackClick(event)\n }, true)\n \n // 双击追踪\n document.addEventListener('dblclick', (event) => {\n this.trackDoubleClick(event)\n }, true)\n \n // 右键点击追踪\n document.addEventListener('contextmenu', (event) => {\n this.trackRightClick(event)\n }, true)\n \n // 触摸事件追踪\n if ('ontouchstart' in window) {\n document.addEventListener('touchstart', (event) => {\n this.trackTouch(event)\n }, true)\n }\n }\n \n // 设置表单追踪\n setupFormTracking() {\n // 表单提交\n document.addEventListener('submit', (event) => {\n this.trackFormSubmission(event)\n }, true)\n \n // 表单字段变化\n document.addEventListener('change', (event) => {\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'SELECT' || event.target.tagName === 'TEXTAREA') {\n this.trackFormFieldChange(event)\n }\n }, true)\n \n // 表单字段聚焦\n document.addEventListener('focus', (event) => {\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'SELECT' || event.target.tagName === 'TEXTAREA') {\n this.trackFormFieldFocus(event)\n }\n }, true)\n \n // 表单字段失焦\n document.addEventListener('blur', (event) => {\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'SELECT' || event.target.tagName === 'TEXTAREA') {\n this.trackFormFieldBlur(event)\n }\n }, true)\n }\n \n // 设置滚动追踪\n setupScrollTracking() {\n let scrollTimeout\n let lastScrollTop = 0\n \n document.addEventListener('scroll', () => {\n clearTimeout(scrollTimeout)\n \n scrollTimeout = setTimeout(() => {\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n const scrollHeight = document.documentElement.scrollHeight\n const clientHeight = document.documentElement.clientHeight\n \n // 计算滚动深度百分比\n const scrollDepth = Math.round((scrollTop / (scrollHeight - clientHeight)) * 100)\n \n if (scrollDepth > this.scrollDepth) {\n this.scrollDepth = scrollDepth\n this.trackScroll(scrollDepth, scrollTop)\n }\n }, 100)\n }, { passive: true })\n }\n \n // 设置鼠标移动追踪\n setupMouseTracking() {\n let mouseTimeout\n let mouseMovements = []\n \n document.addEventListener('mousemove', (event) => {\n clearTimeout(mouseTimeout)\n \n mouseMovements.push({\n x: event.clientX,\n y: event.clientY,\n timestamp: Date.now()\n })\n \n // 限制鼠标移动记录数量\n if (mouseMovements.length > 100) {\n mouseMovements.shift()\n }\n \n mouseTimeout = setTimeout(() => {\n if (mouseMovements.length > 10) {\n this.trackMouseMovement(mouseMovements)\n mouseMovements = []\n }\n }, 1000)\n }, { passive: true })\n }\n \n // 设置键盘追踪\n setupKeyboardTracking() {\n document.addEventListener('keydown', (event) => {\n // 不追踪密码字段\n if (event.target.type === 'password') return\n \n this.trackKeyStroke(event)\n }, true)\n }\n \n // 设置时间追踪\n setupTimeTracking() {\n // 每秒更新页面停留时间\n setInterval(() => {\n this.behaviors.timeOnPage += 1\n }, 1000)\n \n // 页面卸载时上报停留时间\n window.addEventListener('beforeunload', () => {\n this.reportTimeOnPage()\n })\n }\n \n // 追踪访问来源\n trackReferrer() {\n const referrer = document.referrer\n if (referrer) {\n const referrerData = {\n type: 'referrer',\n url: referrer,\n domain: this.extractDomain(referrer),\n timestamp: Date.now()\n }\n \n this.behaviors.navigation.push(referrerData)\n this.reportBehavior('referrer', referrerData)\n }\n }\n \n // 追踪页面浏览\n trackPageView() {\n const pageViewData = {\n type: 'pageview',\n url: window.location.href,\n title: document.title,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n referrer: document.referrer\n }\n \n this.behaviors.pageViews.push(pageViewData)\n this.reportBehavior('pageview', pageViewData)\n \n // 重置页面相关数据\n this.pageStartTime = Date.now()\n this.scrollDepth = 0\n }\n \n // 追踪点击\n trackClick(event) {\n const clickData = {\n type: 'click',\n element: {\n tagName: event.target.tagName,\n className: event.target.className,\n id: event.target.id,\n text: event.target.textContent?.substring(0, 50),\n href: event.target.href\n },\n position: {\n x: event.clientX,\n y: event.clientY,\n pageX: event.pageX,\n pageY: event.pageY\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.behaviors.clicks.push(clickData)\n this.reportBehavior('click', clickData)\n }\n \n // 追踪双击\n trackDoubleClick(event) {\n const doubleClickData = {\n type: 'doubleclick',\n element: {\n tagName: event.target.tagName,\n className: event.target.className,\n id: event.target.id\n },\n position: {\n x: event.clientX,\n y: event.clientY\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('doubleclick', doubleClickData)\n }\n \n // 追踪右键点击\n trackRightClick(event) {\n const rightClickData = {\n type: 'rightclick',\n element: {\n tagName: event.target.tagName,\n className: event.target.className,\n id: event.target.id\n },\n position: {\n x: event.clientX,\n y: event.clientY\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('rightclick', rightClickData)\n }\n \n // 追踪触摸\n trackTouch(event) {\n const touchData = {\n type: 'touch',\n touches: Array.from(event.touches).map(touch => ({\n x: touch.clientX,\n y: touch.clientY,\n identifier: touch.identifier\n })),\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('touch', touchData)\n }\n \n // 追踪表单提交\n trackFormSubmission(event) {\n const formData = {\n type: 'form_submission',\n form: {\n action: event.target.action,\n method: event.target.method,\n id: event.target.id,\n className: event.target.className\n },\n fields: this.getFormFields(event.target),\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.behaviors.formSubmissions.push(formData)\n this.reportBehavior('form_submission', formData)\n }\n \n // 追踪表单字段变化\n trackFormFieldChange(event) {\n const fieldData = {\n type: 'form_field_change',\n field: {\n name: event.target.name,\n type: event.target.type,\n value: event.target.type === 'password' ? '***' : event.target.value,\n id: event.target.id\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('form_field_change', fieldData)\n }\n \n // 追踪表单字段聚焦\n trackFormFieldFocus(event) {\n const focusData = {\n type: 'form_field_focus',\n field: {\n name: event.target.name,\n type: event.target.type,\n id: event.target.id\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('form_field_focus', focusData)\n }\n \n // 追踪表单字段失焦\n trackFormFieldBlur(event) {\n const blurData = {\n type: 'form_field_blur',\n field: {\n name: event.target.name,\n type: event.target.type,\n id: event.target.id\n },\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('form_field_blur', blurData)\n }\n \n // 追踪滚动\n trackScroll(depth, scrollTop) {\n const scrollData = {\n type: 'scroll',\n depth: depth,\n scrollTop: scrollTop,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('scroll', scrollData)\n }\n \n // 追踪鼠标移动\n trackMouseMovement(movements) {\n const mouseData = {\n type: 'mouse_movement',\n movements: movements,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('mouse_movement', mouseData)\n }\n \n // 追踪键盘输入\n trackKeyStroke(event) {\n const keyData = {\n type: 'keystroke',\n key: event.key,\n code: event.code,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n metaKey: event.metaKey,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('keystroke', keyData)\n }\n \n // 处理页面隐藏\n handlePageHidden() {\n this.reportTimeOnPage()\n }\n \n // 处理页面显示\n handlePageVisible() {\n this.pageStartTime = Date.now()\n }\n \n // 上报页面停留时间\n reportTimeOnPage() {\n const timeData = {\n type: 'time_on_page',\n time: this.behaviors.timeOnPage,\n url: window.location.href,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('time_on_page', timeData)\n }\n \n // 上报行为数据\n reportBehavior(type, data) {\n const behaviorData = {\n type,\n data,\n user: this.config.getUser(),\n config: {\n appId: this.config.getConfig().appId,\n appVersion: this.config.getConfig().appVersion,\n environment: this.config.getConfig().environment\n }\n }\n \n // 添加到队列\n this.behaviorQueue.push(behaviorData)\n \n // 检查队列大小\n if (this.behaviorQueue.length >= this.config.getConfig().maxQueueSize) {\n this.flushBehaviorQueue()\n }\n \n // 立即上报或延迟上报\n if (this.config.getConfig().reportInterval === 0) {\n this.reporter.report('behavior', [behaviorData])\n }\n }\n \n // 手动上报行为\n reportCustomBehavior(eventName, data = {}) {\n const customData = {\n type: 'custom_behavior',\n eventName,\n ...data,\n timestamp: Date.now(),\n sessionId: this.sessionId\n }\n \n this.reportBehavior('custom_behavior', customData)\n }\n \n // 刷新行为队列\n flushBehaviorQueue() {\n if (this.behaviorQueue.length > 0) {\n this.reporter.report('behavior', [...this.behaviorQueue])\n this.behaviorQueue = []\n }\n }\n \n // 获取表单字段信息\n getFormFields(form) {\n const fields = []\n const formElements = form.elements\n \n for (let i = 0; i < formElements.length; i++) {\n const element = formElements[i]\n if (element.name) {\n fields.push({\n name: element.name,\n type: element.type,\n value: element.type === 'password' ? '***' : element.value\n })\n }\n }\n \n return fields\n }\n \n // 提取域名\n extractDomain(url) {\n try {\n return new URL(url).hostname\n } catch (e) {\n return url\n }\n }\n \n // 生成会话ID\n generateSessionId() {\n return 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)\n }\n \n // 获取当前行为数据\n getCurrentBehaviors() {\n return { ...this.behaviors }\n }\n \n // 获取会话ID\n getSessionId() {\n return this.sessionId\n }\n \n // 销毁\n destroy() {\n this.flushBehaviorQueue()\n this.reportTimeOnPage()\n this.isInitialized = false\n }\n} ","// 第三方SDK集成器\nexport class ThirdPartyIntegrator {\n constructor(config) {\n this.config = config\n this.integratedSDKs = {}\n this.isInitialized = false\n }\n \n init() {\n if (this.isInitialized) return\n \n const config = this.config.getThirdPartyConfig()\n \n // 初始化百度统计\n if (config.baidu && config.baidu.enabled) {\n this.initBaiduAnalytics(config.baidu)\n }\n \n // 初始化友盟统计\n if (config.umeng && config.umeng.enabled) {\n this.initUmengAnalytics(config.umeng)\n }\n \n // 初始化神策数据\n if (config.sensors && config.sensors.enabled) {\n this.initSensorsAnalytics(config.sensors)\n }\n \n // 初始化腾讯云分析\n if (config.tencent && config.tencent.enabled) {\n this.initTencentAnalytics(config.tencent)\n }\n \n // 初始化Google Analytics\n if (config.google && config.google.enabled) {\n this.initGoogleAnalytics(config.google)\n }\n \n // 初始化自定义第三方\n if (config.custom && config.custom.enabled) {\n this.initCustomAnalytics(config.custom)\n }\n \n this.isInitialized = true\n }\n \n // 初始化百度统计\n initBaiduAnalytics(config) {\n try {\n if (window._hmt) {\n this.integratedSDKs.baidu = {\n name: 'baidu',\n instance: window._hmt,\n config: config\n }\n \n // 设置百度统计配置\n if (config.siteId) {\n window._hmt.push(['_setAccount', config.siteId])\n }\n \n if (config.autoPageview !== false) {\n window._hmt.push(['_trackPageview'])\n }\n \n console.log('百度统计集成成功')\n } else {\n console.warn('百度统计未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('百度统计集成失败:', error)\n }\n }\n \n // 初始化友盟统计\n initUmengAnalytics(config) {\n try {\n if (window._um) {\n this.integratedSDKs.umeng = {\n name: 'umeng',\n instance: window._um,\n config: config\n }\n \n // 设置友盟统计配置\n if (config.siteId) {\n window._um.push(['setAccount', config.siteId])\n }\n \n if (config.autoPageview !== false) {\n window._um.push(['trackPageview'])\n }\n \n console.log('友盟统计集成成功')\n } else {\n console.warn('友盟统计未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('友盟统计集成失败:', error)\n }\n }\n \n // 初始化神策数据\n initSensorsAnalytics(config) {\n try {\n if (window.sensors) {\n this.integratedSDKs.sensors = {\n name: 'sensors',\n instance: window.sensors,\n config: config\n }\n \n // 设置神策数据配置\n if (config.serverUrl) {\n window.sensors.setServerUrl(config.serverUrl)\n }\n \n if (config.siteId) {\n window.sensors.setSiteId(config.siteId)\n }\n \n if (config.autoPageview !== false) {\n window.sensors.trackPageview()\n }\n \n console.log('神策数据集成成功')\n } else {\n console.warn('神策数据未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('神策数据集成失败:', error)\n }\n }\n \n // 初始化腾讯云分析\n initTencentAnalytics(config) {\n try {\n if (window.MTA) {\n this.integratedSDKs.tencent = {\n name: 'tencent',\n instance: window.MTA,\n config: config\n }\n \n // 设置腾讯云分析配置\n if (config.appId) {\n window.MTA.setAppId(config.appId)\n }\n \n if (config.autoPageview !== false) {\n window.MTA.trackPageview()\n }\n \n console.log('腾讯云分析集成成功')\n } else {\n console.warn('腾讯云分析未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('腾讯云分析集成失败:', error)\n }\n }\n \n // 初始化Google Analytics\n initGoogleAnalytics(config) {\n try {\n if (window.gtag) {\n this.integratedSDKs.google = {\n name: 'google',\n instance: window.gtag,\n config: config\n }\n \n // 设置Google Analytics配置\n if (config.measurementId) {\n window.gtag('config', config.measurementId, {\n page_title: document.title,\n page_location: window.location.href\n })\n }\n \n console.log('Google Analytics集成成功')\n } else {\n console.warn('Google Analytics未加载,请检查脚本是否正确引入')\n }\n } catch (error) {\n console.error('Google Analytics集成失败:', error)\n }\n }\n \n // 初始化自定义第三方\n initCustomAnalytics(config) {\n try {\n if (typeof config.init === 'function') {\n const instance = config.init(config)\n this.integratedSDKs.custom = {\n name: 'custom',\n instance: instance,\n config: config\n }\n \n console.log('自定义第三方集成成功')\n } else {\n console.warn('自定义第三方配置缺少init函数')\n }\n } catch (error) {\n console.error('自定义第三方集成失败:', error)\n }\n }\n \n // 上报事件到所有集成的第三方SDK\n reportEvent(eventName, eventData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportToSDK(sdk, eventName, eventData)\n } catch (error) {\n console.error(`上报事件到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报页面浏览到所有集成的第三方SDK\n reportPageView(pageData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportPageViewToSDK(sdk, pageData)\n } catch (error) {\n console.error(`上报页面浏览到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报用户信息到所有集成的第三方SDK\n reportUser(userData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportUserToSDK(sdk, userData)\n } catch (error) {\n console.error(`上报用户信息到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报性能指标到所有集成的第三方SDK\n reportPerformance(performanceData = {}) {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n this.reportPerformanceToSDK(sdk, performanceData)\n } catch (error) {\n console.error(`上报性能指标到${sdk.name}失败:`, error)\n }\n })\n }\n \n // 上报事件到特定SDK\n reportToSDK(sdk, eventName, eventData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_trackEvent', eventName, JSON.stringify(eventData)])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['track', eventName, eventData])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.track) {\n sdk.instance.track(eventName, eventData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.Event && sdk.instance.Event.stat) {\n sdk.instance.Event.stat(eventName, eventData)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('event', eventName, eventData)\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.track === 'function') {\n sdk.instance.track(eventName, eventData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 上报页面浏览到特定SDK\n reportPageViewToSDK(sdk, pageData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_trackPageview', pageData.url || window.location.href])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['trackPageview', pageData.url || window.location.href])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.trackPageview) {\n sdk.instance.trackPageview(pageData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.trackPageview) {\n sdk.instance.trackPageview(pageData.url || window.location.href)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('config', sdk.config.measurementId, {\n page_title: pageData.title || document.title,\n page_location: pageData.url || window.location.href\n })\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.trackPageview === 'function') {\n sdk.instance.trackPageview(pageData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 上报用户信息到特定SDK\n reportUserToSDK(sdk, userData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_setUserTag', 'userId', userData.userId])\n sdk.instance.push(['_setUserTag', 'userType', userData.userType])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['setUserTag', 'userId', userData.userId])\n sdk.instance.push(['setUserTag', 'userType', userData.userType])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.setProfile) {\n sdk.instance.setProfile(userData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.setUserInfo) {\n sdk.instance.setUserInfo(userData)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('set', 'user_id', userData.userId)\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.setUser === 'function') {\n sdk.instance.setUser(userData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 上报性能指标到特定SDK\n reportPerformanceToSDK(sdk, performanceData) {\n switch (sdk.name) {\n case 'baidu':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['_trackEvent', 'performance', JSON.stringify(performanceData)])\n }\n break\n \n case 'umeng':\n if (sdk.instance && sdk.instance.push) {\n sdk.instance.push(['track', 'performance', performanceData])\n }\n break\n \n case 'sensors':\n if (sdk.instance && sdk.instance.track) {\n sdk.instance.track('performance', performanceData)\n }\n break\n \n case 'tencent':\n if (sdk.instance && sdk.instance.Event && sdk.instance.Event.stat) {\n sdk.instance.Event.stat('performance', performanceData)\n }\n break\n \n case 'google':\n if (sdk.instance && typeof sdk.instance === 'function') {\n sdk.instance('event', 'performance', performanceData)\n }\n break\n \n case 'custom':\n if (sdk.instance && typeof sdk.instance.trackPerformance === 'function') {\n sdk.instance.trackPerformance(performanceData)\n }\n break\n \n default:\n console.warn(`未知的SDK类型: ${sdk.name}`)\n }\n }\n \n // 检查SDK是否已集成\n isSDKIntegrated(sdkName) {\n return !!this.integratedSDKs[sdkName]\n }\n \n // 获取已集成的SDK列表\n getIntegratedSDKs() {\n return Object.keys(this.integratedSDKs)\n }\n \n // 获取特定SDK的实例\n getSDKInstance(sdkName) {\n return this.integratedSDKs[sdkName]?.instance || null\n }\n \n // 销毁所有集成的SDK\n destroy() {\n Object.values(this.integratedSDKs).forEach(sdk => {\n try {\n if (sdk.instance && typeof sdk.instance.destroy === 'function') {\n sdk.instance.destroy()\n }\n } catch (error) {\n console.error(`销毁${sdk.name}失败:`, error)\n }\n })\n \n this.integratedSDKs = {}\n this.isInitialized = false\n }\n} ","// 配置管理器\nexport class ConfigManager {\n constructor(options = {}) {\n this.config = {\n // 基础配置\n appId: options.appId || '',\n appVersion: options.appVersion || '1.0.0',\n environment: options.environment || 'production',\n \n // 上报配置\n reportUrl: options.reportUrl || '',\n reportInterval: options.reportInterval || 5000, // 批量上报间隔\n maxQueueSize: options.maxQueueSize || 100, // 最大队列大小\n \n // 错误追踪配置\n enableErrorTracking: options.enableErrorTracking !== false,\n enableUnhandledRejection: options.enableUnhandledRejection !== false,\n enableResourceError: options.enableResourceError !== false,\n \n // 事件追踪配置\n enableEventTracking: options.enableEventTracking !== false,\n enableClickTracking: options.enableClickTracking !== false,\n enablePageViewTracking: options.enablePageViewTracking !== false,\n \n // 性能监控配置\n enablePerformanceTracking: options.enablePerformanceTracking !== false,\n enableResourceTracking: options.enableResourceTracking !== false,\n enableApiTracking: options.enableApiTracking !== false,\n enableInteractionTracking: options.enableInteractionTracking !== false,\n \n // 用户行为追踪配置\n enableUserInteractionTracking: options.enableUserInteractionTracking !== false,\n enableFormTracking: options.enableFormTracking !== false,\n enableScrollTracking: options.enableScrollTracking !== false,\n enableMouseTracking: options.enableMouseTracking !== false,\n enableKeyboardTracking: options.enableKeyboardTracking !== false,\n \n // 第三方埋点配置\n thirdPartyConfig: options.thirdPartyConfig || {},\n \n // 用户信息\n user: options.user || null,\n \n // 自定义上报函数\n customReport: options.customReport || null\n }\n \n this.user = null\n }\n \n // 更新配置\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig }\n }\n \n // 设置用户信息\n setUser(userInfo) {\n this.user = userInfo\n }\n \n // 获取配置\n getConfig() {\n return this.config\n }\n \n // 获取用户信息\n getUser() {\n return this.user\n }\n \n // 获取上报URL\n getReportUrl() {\n return this.config.reportUrl\n }\n \n // 获取第三方配置\n getThirdPartyConfig() {\n return this.config.thirdPartyConfig\n }\n \n // 检查是否启用错误追踪\n isErrorTrackingEnabled() {\n return this.config.enableErrorTracking\n }\n \n // 检查是否启用事件追踪\n isEventTrackingEnabled() {\n return this.config.enableEventTracking\n }\n} ","// 前端 SDK 主入口\nimport { ErrorTracker } from './errorTracker'\nimport { EventTracker } from './eventTracker'\nimport { PerformanceTracker } from './performanceTracker'\nimport { UserBehaviorTracker } from './userBehaviorTracker'\nimport { ThirdPartyIntegrator } from './thirdPartyIntegrator'\nimport { ConfigManager } from './configManager'\n\nclass FrontendSDK {\n constructor(options = {}) {\n this.config = new ConfigManager(options)\n this.errorTracker = new ErrorTracker(this.config)\n this.eventTracker = new EventTracker(this.config)\n this.performanceTracker = new PerformanceTracker(this.config)\n this.userBehaviorTracker = new UserBehaviorTracker(this.config)\n this.thirdPartyIntegrator = new ThirdPartyIntegrator(this.config)\n \n this.init()\n }\n \n init() {\n // 初始化错误追踪\n this.errorTracker.init()\n \n // 初始化事件追踪\n this.eventTracker.init()\n \n // 初始化性能监控\n this.performanceTracker.init()\n \n // 初始化用户行为追踪\n this.userBehaviorTracker.init()\n \n // 初始化第三方SDK集成\n this.thirdPartyIntegrator.init()\n \n console.log('Frontend SDK 初始化完成')\n }\n \n // 手动上报错误\n reportError(error, context = {}) {\n this.errorTracker.reportError(error, context)\n }\n \n // 手动上报事件\n reportEvent(eventName, data = {}) {\n this.eventTracker.reportEvent(eventName, data)\n }\n \n // 手动上报性能指标\n reportPerformance(metrics = {}) {\n this.performanceTracker.reportPerformance(metrics)\n }\n \n // 手动上报用户行为\n reportBehavior(eventName, data = {}) {\n this.userBehaviorTracker.reportCustomBehavior(eventName, data)\n }\n \n // 设置用户信息\n setUser(userInfo) {\n this.config.setUser(userInfo)\n // 同步到第三方SDK\n this.thirdPartyIntegrator.reportUser(userInfo)\n }\n \n // 设置自定义配置\n setConfig(config) {\n this.config.updateConfig(config)\n }\n \n // 获取性能指标\n getPerformanceMetrics() {\n return this.performanceTracker.getCurrentMetrics()\n }\n \n // 获取用户行为数据\n getBehaviorData() {\n return this.userBehaviorTracker.getCurrentBehaviors()\n }\n \n // 获取会话ID\n getSessionId() {\n return this.userBehaviorTracker.getSessionId()\n }\n \n // 检查第三方SDK是否已集成\n isThirdPartySDKIntegrated(sdkName) {\n return this.thirdPartyIntegrator.isSDKIntegrated(sdkName)\n }\n \n // 获取已集成的第三方SDK列表\n getIntegratedThirdPartySDKs() {\n return this.thirdPartyIntegrator.getIntegratedSDKs()\n }\n \n // 销毁 SDK\n destroy() {\n this.errorTracker.destroy()\n this.eventTracker.destroy()\n this.performanceTracker.destroy()\n this.userBehaviorTracker.destroy()\n this.thirdPartyIntegrator.destroy()\n console.log('Frontend SDK 已销毁')\n }\n}\n\nexport default FrontendSDK "],"names":["Reporter","constructor","config","this","isReporting","report","type","data","reportData","formatReportData","getConfig","customReport","defaultReport","error","console","timestamp","Date","now","url","window","location","href","userAgent","navigator","user","getUser","appId","appVersion","environment","Array","isArray","reportUrl","getReportUrl","thirdPartyConfig","getThirdPartyConfig","reportToBackend","Object","keys","length","reportToThirdParty","response","fetch","method","headers","body","JSON","stringify","ok","Error","status","statusText","json","promises","baidu","_hmt","push","reportToBaidu","umeng","_um","reportToUmeng","sensors","reportToSensors","tencent","MTA","reportToTencent","custom","reportToCustom","Promise","allSettled","track","Event","stat","ErrorTracker","reporter","errorQueue","isInitialized","init","enableErrorTracking","setupErrorListener","enableUnhandledRejection","setupUnhandledRejectionListener","enableResourceError","setupResourceErrorListener","addEventListener","event","handleError","message","filename","lineno","colno","stack","reason","target","src","tagName","context","errorInfo","toString","maxQueueSize","flushErrorQueue","reportInterval","reportError","destroy","EventTracker","eventQueue","clickListener","pageViewListener","enableClickTracking","setupClickTracking","enablePageViewTracking","setupPageViewTracking","setupPeriodicReport","clickData","element","className","id","text","textContent","substring","position","x","clientX","y","clientY","handleEvent","document","title","referrer","originalPushState","history","pushState","originalReplaceState","replaceState","args","apply","setTimeout","bind","interval","setInterval","flushEventQueue","eventName","eventInfo","reportEvent","removeEventListener","PerformanceTracker","pageStartTime","performanceQueue","thirdPartySDKs","metrics","fcp","lcp","fid","cls","ttfb","domLoad","windowLoad","resourceLoad","apiRequests","enablePerformanceTracking","setupPerformanceMonitoring","enableResourceTracking","setupResourceMonitoring","enableApiTracking","setupApiMonitoring","enableInteractionTracking","setupInteractionMonitoring","initThirdPartySDKs","readyState","captureDOMLoadTime","captureWindowLoadTime","captureWebVitals","reportPerformanceMetrics","hidden","handlePageHidden","handlePageVisible","observer","PerformanceObserver","list","entry","getEntries","entryType","handleResourceLoad","observe","entryTypes","e","setupResourceFallback","originalFetch","async","startTime","performance","endTime","handleApiRequest","originalXHROpen","XMLHttpRequest","prototype","open","originalXHRSend","send","_startTime","_url","_method","xhr","originalOnReadyStateChange","onreadystatechange","duration","arguments","firstInputTime","firstInputDelay","handleFirstInput","name","warn","clsValue","hadRecentInput","value","resourceInfo","initiatorType","size","transferSize","reportSlowResource","apiInfo","reportSlowApi","calculatePageStayTime","stayTime","reportPageStayTime","performanceData","device","getDeviceInfo","flushPerformanceQueue","stayData","screen","width","height","availWidth","availHeight","colorDepth","pixelDepth","viewport","innerWidth","innerHeight","connection","effectiveType","downlink","rtt","memory","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","reportPerformance","getCurrentMetrics","UserBehaviorTracker","behaviorQueue","sessionId","generateSessionId","scrollDepth","mouseMovements","keyStrokes","formInteractions","behaviors","pageViews","clicks","scrolls","formSubmissions","navigation","timeOnPage","enableUserInteractionTracking","setupUserInteractionTracking","enableFormTracking","setupFormTracking","enableScrollTracking","setupScrollTracking","enableMouseTracking","setupMouseTracking","enableKeyboardTracking","setupKeyboardTracking","setupTimeTracking","trackReferrer","trackPageView","setupRouteChangeTracking","trackClick","trackDoubleClick","trackRightClick","trackTouch","trackFormSubmission","trackFormFieldChange","trackFormFieldFocus","trackFormFieldBlur","scrollTimeout","clearTimeout","scrollTop","pageYOffset","documentElement","scrollHeight","clientHeight","Math","round","trackScroll","passive","mouseTimeout","shift","trackMouseMovement","trackKeyStroke","reportTimeOnPage","referrerData","domain","extractDomain","reportBehavior","pageViewData","pageX","pageY","doubleClickData","rightClickData","touchData","touches","from","map","touch","identifier","formData","form","action","fields","getFormFields","fieldData","field","focusData","blurData","depth","scrollData","movements","mouseData","keyData","key","code","ctrlKey","shiftKey","altKey","metaKey","timeData","time","behaviorData","flushBehaviorQueue","reportCustomBehavior","customData","formElements","elements","i","URL","hostname","random","substr","getCurrentBehaviors","getSessionId","ThirdPartyIntegrator","integratedSDKs","enabled","initBaiduAnalytics","initUmengAnalytics","initSensorsAnalytics","initTencentAnalytics","google","initGoogleAnalytics","initCustomAnalytics","instance","siteId","autoPageview","log","serverUrl","setServerUrl","setSiteId","trackPageview","setAppId","gtag","measurementId","page_title","page_location","eventData","values","forEach","sdk","reportToSDK","reportPageView","pageData","reportPageViewToSDK","reportUser","userData","reportUserToSDK","reportPerformanceToSDK","userId","userType","setProfile","setUserInfo","setUser","trackPerformance","isSDKIntegrated","sdkName","getIntegratedSDKs","getSDKInstance","ConfigManager","options","enableEventTracking","updateConfig","newConfig","userInfo","isErrorTrackingEnabled","isEventTrackingEnabled","errorTracker","eventTracker","performanceTracker","userBehaviorTracker","thirdPartyIntegrator","setConfig","getPerformanceMetrics","getBehaviorData","isThirdPartySDKIntegrated","getIntegratedThirdPartySDKs"],"mappings":"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"}
|