亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

JS實現監控微信小程序的原理

2020-03-21 16:16:30
字體:
來源:轉載
供稿:網友

原理

之前也做過瀏覽器web端的SDK數據埋點上報,其實原理大同小異:通過劫持原始方法,獲取需要上報的數據,最后再執行原始方法,這樣就能實現無痕埋點。

舉個例子:我希望監控所有web頁面的ajax請求,每次發送ajax,都需要在控制臺打印出發送的url

平時我們開發,發送ajax一般用的都是封裝好的庫,例如jQuery,Axios等,然而這些庫,底層仍然用的是瀏覽器原生的XMLHttpRequest對象,因此,我們只需要修改XMLHttpRequest對象即可

注意:由于JS的靈活性,修改原生方法是一件很容易的事,然而并不鼓勵這樣做!

// 把這段代碼放在所有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

wx.request = function() { console.log('66666');}

這時控制臺會報錯 TypeError: Cannot set property request of #<Object> which has only a getter

這是因為, wx.request 這個屬性,只有 get 方法而沒有 set 方法,我們可以通過 Object.getOwnPropertyDescriptor 驗證:

const des = Object.getOwnPropertyDescriptor(wx, 'request');// des {// configurable: true,// enumerable: true,// get: f(),// set: undefined// }

我們可以換種方式修改:

const originRequest = wx.request;Object.defineProperty(wx, 'request', { configurable: true, enumerable: true, writable: true, value: function() {  const config = arguments[0] || {};  const url = config.url;  console.log('發送了ajax,url是: ', url);  return originRequest.apply(this, arguments); }});

這次就實現攔截功能了!

監控異常

小程序的注冊函數 App 有個全局的 onError 方法,我們可以在小程序的入口文件 app.js 先注冊一個該方法:

App({ onError: function(err) {  console.log('上報錯誤啦!');  wx.request({   url: 'http://monitor.com/monitor/error',   data: err  }) }})App({ // 其他邏輯})

不過需要注意的是:如果后續的程序重寫了onError的話,將會導致之前注冊的onError失效。

解決方法可以是:我們監控SDK可以暴露一個接口,讓接入方自己在onError中調用我們的接口。

App({ onError: function (err) { monitor.notifyError(err) }})

上報數據

收集好需要的數據后,當然就要上報后臺。怎么上報?當然還是用的 wx.request 發送請求。

這里就容易出現一個 死循環 : 如果用之前被我們包裝過的 wx.request 上報數據,那么上報數據這個ajax請求,也會被我們認為是普通的ajax請求,然后又會觸發上報,這樣來來回回,無窮無盡的發送上報數據。

解決方法有多種,比如:

方案1

可以在包裝 wx.request 的時候,判斷發送的url如果是上報接口,那么就不再上報了。

const originRequest = wx.request;Object.defineProperty(wx, 'request', { configurable: true, enumerable: true, writable: true, value: function() {  const config = arguments[0] || {};  const url = config.url;  if (url.indexOf('http://monitor.com') > -1) {   // 直接發送請求,不上報   return originRequest.apply(this, arguments);  }  console.log('上報ajax數據啦!');  wx.request({   url: 'http://monitor.com/monitor/ajax',   data: config.data  })  return originRequest.apply(this, arguments); }});

方案2

在包裝 wx.request 之前,保留一份最原始的 wx.request 方法,所有的上報請求,就不走被包裝過的方法,而走最原始的方法。

const myRequest = wx.request;const wrapRequest = function () { const originRequest = wx.request; Object.defineProperty(wx, 'request', {  configurable: true,  enumerable: true,  writable: true,  value: function() {   const config = arguments[0] || {};   const url = config.url;   console.log('上報數據啦!');   // 使用最原始的request方法   myRequest({    url: 'http://monitor.com/monitor/ajax',    data: config.data   })   return originRequest.apply(this, arguments);  } });}wrapRequest();

其他事項

實際開發中當然還有更多的細節,比如監控項目的鑒權,SDK的代碼結構,上報前的數據收集和聚合等等,本文就不詳細展開了。

總結

以上所述是小編給大家介紹的JS實現監控微信小程序的原理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91九色视频在线| 成人免费在线网址| 国产精品永久免费观看| 欧美专区中文字幕| 日韩av三级在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品自产拍在线观看中文| 欧美性色视频在线| 日韩久久免费电影| 欧美在线免费观看| 国产亚洲欧美另类中文| 欧美精品videosex极品1| 尤物99国产成人精品视频| 亚洲成人黄色在线| 日韩精品极品视频免费观看| 久久久在线视频| 久久久久久亚洲精品不卡| 国产精品亚洲一区二区三区| 日韩av在线网址| 国产精品18久久久久久麻辣| 欧美激情一区二区三区成人| 欧美精品18videos性欧美| 日韩大片在线观看视频| 成人午夜在线视频一区| 亚洲国产天堂久久综合网| 亚洲男人天天操| 久久夜色精品亚洲噜噜国产mv| 国产精品日本精品| 亚洲缚视频在线观看| 亚洲在线免费视频| 国语自产精品视频在线看一大j8| yellow中文字幕久久| 亚洲国产精品一区二区三区| 日韩精品免费电影| 日韩男女性生活视频| 色999日韩欧美国产| 日韩欧美一区视频| 久久91亚洲人成电影网站| 91免费国产网站| 国产日韩欧美另类| 日韩精品免费电影| 欧美wwwxxxx| 精品国内自产拍在线观看| 成人日韩av在线| 国产成人精品午夜| 亚洲电影免费观看高清| 九九热这里只有在线精品视| 国产精品视频不卡| 91精品综合视频| 欧美中文在线视频| 亚洲美女中文字幕| 日韩精品电影网| 日韩av最新在线观看| 国产美女精品视频免费观看| 国产成人精品在线播放| 日韩欧美在线一区| 欧美性猛交xxxx免费看漫画| 久久影视电视剧免费网站清宫辞电视| 成人av在线亚洲| 韩国视频理论视频久久| 国产精品免费久久久| 精品久久久久久亚洲精品| 高清欧美电影在线| 一区二区三区 在线观看视| 国产视频亚洲精品| 免费91麻豆精品国产自产在线观看| 亚洲欧洲日产国码av系列天堂| 一区二区三区四区视频| 国产香蕉97碰碰久久人人| 久久亚洲综合国产精品99麻豆精品福利| 亚洲欧美日韩久久久久久| 亚洲精品中文字| 欧美日韩免费观看中文| 亚洲黄页视频免费观看| 欧美日韩精品在线| 精品视频在线导航| 日韩成人激情影院| 国产精品福利片| 亚洲第一区中文99精品| 国产成人a亚洲精品| 最好看的2019年中文视频| 中文字幕一区日韩电影| 久久激情五月丁香伊人| 亚洲伊人成综合成人网| 欧美日韩国产综合视频在线观看中文| 91国产美女在线观看| 国产欧亚日韩视频| 欧美多人乱p欧美4p久久| 北条麻妃一区二区三区中文字幕| 正在播放欧美视频| 久久99久久久久久久噜噜| 欧美在线视频一区| 亚洲色图17p| 亚洲国产精品小视频| 在线日韩日本国产亚洲| 日本中文字幕久久看| 国产成人精品免费视频| 久久精品国产欧美激情| 国产中文字幕日韩| 亚洲日韩欧美视频一区| 欧美性xxxxhd| 亚洲精品第一页| 北条麻妃久久精品| 久久久久久久久久久久久久久久久久av| 一区二区三区视频免费| 久久久电影免费观看完整版| 国产性猛交xxxx免费看久久| 欧美电影电视剧在线观看| 亚洲石原莉奈一区二区在线观看| 日日摸夜夜添一区| 国产精品福利在线观看| 亚洲黄页网在线观看| 亚洲午夜精品久久久久久久久久久久| 91中文精品字幕在线视频| 日本中文字幕成人| 亚洲国产天堂久久综合网| 精品久久久免费| 欧美日韩亚洲国产一区| 久色乳综合思思在线视频| 精品伊人久久97| 精品国产成人在线| 亚洲v日韩v综合v精品v| 久久久噜噜噜久噜久久| 成人国产精品久久久久久亚洲| 成人在线激情视频| 97精品免费视频| 精品久久久久久久久久久久久| 91久久国产精品91久久性色| 欧美日韩一区二区三区在线免费观看| 成人黄色av播放免费| 欧美午夜电影在线| 欧美成年人在线观看| 亚洲精品久久在线| 日韩av中文字幕在线| 九九久久久久99精品| 国产欧美韩国高清| 精品亚洲国产成av人片传媒| www.久久久久| 欧美韩日一区二区| 久久免费在线观看| 91视频-88av| 色妞在线综合亚洲欧美| 国产精选久久久久久| 三级精品视频久久久久| 992tv成人免费视频| 欧美成人午夜免费视在线看片| 亚洲女人天堂av| 久操成人在线视频| 色婷婷综合久久久久| 91精品国产91久久久久久不卡| 欧美一乱一性一交一视频| 最近2019中文字幕在线高清| 欧美日韩亚洲91| 97在线看免费观看视频在线观看| 国产不卡精品视男人的天堂| 岛国av一区二区三区| 欧美高跟鞋交xxxxhd| 国产精品久久久久av免费| 国产精品一区二区3区| 国产成人综合精品| 日韩精品亚洲元码| 日本aⅴ大伊香蕉精品视频| 精品中文字幕在线| 情事1991在线|