前端小技巧: 设计一个简版前端统计 SDK

统计 sdk 如何设计

1 ) 概述

  • 客户端一个sdk ,把数据发送给服务端(第三方统计平台)
  • 服务端产生一个统计的报表

2 )需求点

  • 访问量:pv
  • 自定义事件:用户的一切行为我们都可以自定义采集
  • 性能,错误

3 ) 代码实现

ts 复制代码
const PV_URL_SET = new Set()

class MyStatistic {
  constructor(productId) {
    this.productId = productId
    this.initPerformance() // 性能统计
    this.initError() // 初始化错误监控
  },
  // 发送统计数据
  send(url, params = {}) {
    // 加上必要参数
    params.productId = this.productId
    const paraArr = []
    for(let key in params) {
      const val = params[key]
      paramsArr.push(`${key}=${value}`)
    }
    const newUrl = `${url}?${paramsArr.join('&')}`
    const img = document.createElemnt('img')
    img.src = newUrl // get
  },
  // 初始化性能统计
  initPerformance() {
    // console.table(performance.timing) // 这个api
    const url = 'yyy'
    this.send(url, performance.timing) // 给最原始、最完整的结果,原始数据
    // 注意,至少要在 DOMContentLoaded 调用它
  },
  initError() {
    window.addEventListener('error', event => {
      const { error, lineno, colno} = event
      this.error(error, { lineno, colno })
    })
    // Promise未catch住的报错
    window.addEventListener('unhandledrejection', event => {
      this.error(new Error(event.reason), {type: "unhandledrejection"})
    })
  },
  pv() {
    // send
    const href = location.href
    if (PV_URL_SET.get(href)) return // 不重复发送
    this.event('pv')
    PV_URL_SET.add(href) 、、 
  },
  event(key, val) {
    // 自定义事件
    // send
    const url = 'xxx' // 自定义事件,统计server
    this.send(url, {key, val})

  }
  // 统计用户 try catch 里的error
  error(err, info={}) {
    // send
    const url = 'zzz'
    const {message, stack} = err
    this.send(url, {
      message, stack, ...info
    })
  }
}

const s = new MyStatistic('a1') // 至少要在 DOMContentLoaded 调用它

s.pv() // pv只能调用,在 spa路由中切换需要调用
s.event('vip', 'ok')
s.event('vip', 'cancel')
s.event('vip', 'close')

try {} catch(e) {
  s.error(ex, {})
}

4 )总结

  • 以上是一个简版的原生js的实现方式
  • 所有细节处理都在代码中
  • 如果使用框架,如React和Vue等,可替换成内部的捕获错误方法
相关推荐
ZC跨境爬虫4 小时前
跟着 MDN 学CSS day_16:(深入掌握背景与边框的艺术)
前端·css·ui·html·tensorflow
道里7 小时前
花了 5 万刀用 AI 写代码之后,这是我的全部经验
前端·人工智能
Royzst7 小时前
xml知识点
java·服务器·前端
IT_陈寒8 小时前
React useEffect闭包陷阱差点把我整失业了
前端·人工智能·后端
kyriewen8 小时前
推行AI写代码一年后,Code Review变成了新的加班理由
前端·ai编程·cursor
前端环境观察室9 小时前
给 Agent Browser Workflow 加一层可观测性:Trace、Snapshot 和 Review Queue
前端
柒瑞9 小时前
Superpowers结合Claude code浅实战
前端
Nian.Baikal9 小时前
从零搭建离线地图服务:Nginx + Cesium/Leaflet 实战指南
运维·前端·nginx
前端毕业班9 小时前
uniapp web 灵活控制 style scoped
前端·javascript·vue.js
lichenyang4539 小时前
鸿蒙业务需求实战:AI 问题走马灯卡片实现复盘
前端