前端小技巧: 设计一个简版前端统计 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等,可替换成内部的捕获错误方法
相关推荐
Csvn几秒前
🛋️ requestIdleCallback:把非关键任务塞进浏览器的"空闲时间",告别卡顿
前端
江华森2 分钟前
从 fork 到协程:一次完整的操作系统并发编程实操
前端·程序员
四千岁4 分钟前
稀疏向量BM25Retriever不支持中文怎么办?jieba来帮忙
前端·javascript·后端
这是个栗子7 分钟前
【JS代码分析】前端鉴权基础:Token 的本地存储与状态重置实践
开发语言·前端·javascript
颜进强8 分钟前
14 - OpenSpec 老页面改造骨架:定位 + 增量 + 回归三件套
前端·后端·ai编程
做前端的娜娜子9 分钟前
async/await 错误处理:try...catch vs .catch() 完全指南
前端·面试·掘金·金石计划
半个落月12 分钟前
React 性能优化入门:用 memo 避免无关的子组件重复渲染
前端·react.js
北城笑笑20 分钟前
Server 18 ,Nginx + Vite 前端部署排错实战:从 `/api/gpt/chat` 404 到 9012 后端服务的完整定位过程
linux·运维·前端·nginx·ubuntu·vue
江华森24 分钟前
从抓包到嗅探:用 C 语言把《计算机网络》第 9-13 章全部跑一遍
前端
IT_陈寒41 分钟前
Vite打包给我挖的这个坑,差点搞崩我的项目
前端·人工智能·后端