日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从函数劫持角度看开发调试工具AlloyLever

發(fā)布時間:2025/3/20 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从函数劫持角度看开发调试工具AlloyLever 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在騰訊的AlloyTeam的Blog上發(fā)現(xiàn)了這樣的一款工具:AlloyLever(原blog地址:http://www.alloyteam.com/2016...),覺得非常有趣且實用。尤其是其實現(xiàn)的原理也并不復雜,卻可以給平常的調(diào)試工作帶來巨大的便利,不得不讓人感嘆凡事就怕認真啊。

這個就是這款工具的樣子,它整合了web調(diào)試中幾個非常頻繁的剛需:看log、看error、看AJAX發(fā)包與回包。同時還附有查看timeline、cookie和localStorage的這些功能。雖然這些信息在chrome的調(diào)試工具里面也是觸手可及,可是由于涉及的原因,他們被放在跟原web頁面不相關的一個窗口里,還分了很多的標簽頁,在實際工作中,一個web頁面+F12的調(diào)試窗口經(jīng)常就占滿了整個屏幕,著實是有些不太方便。這也是這個工具最初被制造出來,想要解決的問題吧。

這個工具的實現(xiàn)原理,是很簡單的函數(shù)劫持。有關于函數(shù)劫持的相關知識,可參見這篇文章(https://segmentfault.com/a/11...),其大概原理是創(chuàng)建一個和現(xiàn)有函數(shù)同名的函數(shù)(當然首先要把原來的函數(shù)給保存下來),以覆蓋掉他原本的引用,然后在函數(shù)體內(nèi)先針對參數(shù)做一些自己想要實現(xiàn)的功能,最后再調(diào)用之前保存的原函數(shù),實現(xiàn)原本的功能。
這個思路也很像redux里面有關于middleware的設計,只不過redux運用的思想更為先進,通過一系列結(jié)構(gòu)將各個中間件解耦,互不干擾。而本文的目的不是為了靈活的使用各種中間件,只是為了想做一個調(diào)試信息的自主整合頁面,所以使用這種強聯(lián)系的耦合方式也沒有什么大問題。

原文中的關鍵源碼如下:

window.console = {wc: window.console }; //將原本console的引用指向console的一個成員變量wc,以便在后面擴充的函數(shù)中使用。 var self = this; //保存當前語境中的this ['log', 'error', 'warn', 'debug', 'info'].forEach(function (item) { //針對console的五種方法console[item] = function (msg) {this.wc[item](msg);self.log(msg, item);} });

代碼選自原網(wǎng)頁,注釋是我加的。

在JavaScript中,函數(shù)也是對象的一種,也能像對象一樣擁有自己的變量。所以程序的前三行就是講console這個對象換了一個別名wc保存在console本身內(nèi)。
第四行是為了保存當前語境下的this,事實上在瀏覽器的調(diào)試工具中直接運行這些代碼的時候,這個this指向的就是全局對象window,所以去掉這一行,將下面的self.log改成window.log,程序的運行結(jié)果是一模一樣的。
保存完了所有需要的變量后,下面的事情就簡單了,遍歷console下的log, error, warn, debug和info這五個方法,把他們都修改成先執(zhí)行本身,然后再執(zhí)行我們自定義的log方法,在這個自定義的log方法內(nèi),我們能訪問到傳入的參數(shù)msg和訪問的原生函數(shù)名item,然后就可以通過這個鉤子,去獲取數(shù)據(jù),并做一些處理,顯示到AlloyLever的控制臺上啦。

而ajax的截獲跟這個原理也差不多,代碼如下:

var XHR = window.XMLHttpRequest;window.XMLHttpRequest=function(){var xhr = new XHR();checkSuccess(xhr);return xhr; };window.XMLHttpRequest.realXHR = XHR;var self=this;function checkSuccess(xhr) {if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {self.option.xhrs.push({url:xhr.responseURL, json:JSON.stringify(JSON.parse( xhr.responseText), null, "\t")})}else if(xhr.status>=400) {console.error(xhr.responseURL +' '+xhr.status+' ('+xhr.statusText+')')}else{window.setTimeout(function () {checkSuccess(xhr);}, 0);} }

區(qū)別就是因為ajax是異步請求,所以在函數(shù)內(nèi)部內(nèi)置了一個setTimeout循環(huán),如果請求未完成則一直循環(huán),直到請求完成,內(nèi)容被捕獲為止。

這個工具還有個移動端的版本:https://github.com/WechatFE/v...
對于做微信開發(fā)的小伙伴們,以后的測試就方便多啦!

總結(jié)

以上是生活随笔為你收集整理的从函数劫持角度看开发调试工具AlloyLever的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。