前端之家收集整理的这篇文章主要介绍了
JS实现监控微信小程序的原理,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
原理
之前也做过浏览器web端的SDK数据埋点上报,其实原理大同小异:通过劫持原始方法,获取需要上报的数据,最后再执行原始方法,这样就能实现无痕埋点。
举个例子:我希望监控所有web页面的ajax请求,每次发送ajax,都需要在控制台打印出发送的url
平时我们开发,发送ajax一般用的都是封装好的库,例如jQuery,Axios等,然而这些库,底层仍然用的是浏览器原生的XMLHttpRequest对象,因此,我们只需要修改XMLHttpRequest对象即可
修改原生方法是一件很容易的事,然而并不鼓励这样做!
代码放在所有JS
代码之前,我们就实现了
拦截ajax的需求
window.XMLHttpRequest.prototype.open = (function(originOpen) {
return function(method,url,async) {
console.log('发送了ajax,url是: ',url);
return originOpen.apply(this,arguments);
};
})(window.XMLHttpRequest.prototype.open);
在这个立即执行函数中,我们把原生的 open 方法通过 originOpen 暂时存储起来,然后在外面包裹一层函数,实现了打印输出url的功能,最后通过 originOpen.apply 让原生方法运行,这样就实现了无痕拦截。
拦截wx.request
小程序的运行环境并没有 window 和 document 对象,它只暴露了一个 wx 全局对象,发送网络请求则是通过wx.request这个api,因此,这次我们需要拦截的就是 wx.request 方法
我们试着更改一下 wx.request
这时控制台会报错 TypeError: Cannot set property request of #