摘要:第四行是為了保存當前語境下的,事實上在瀏覽器的調試工具中直接運行這些代碼的時候,這個指向的就是全局對象,所以去掉這一行,將下面的改成,程序的運行結果是一模一樣的。
在騰訊的AlloyTeam的Blog上發現了這樣的一款工具:AlloyLever(原blog地址:http://www.alloyteam.com/2016...),覺得非常有趣且實用。尤其是其實現的原理也并不復雜,卻可以給平常的調試工作帶來巨大的便利,不得不讓人感嘆凡事就怕認真啊。
這個就是這款工具的樣子,它整合了web調試中幾個非常頻繁的剛需:看log、看error、看AJAX發包與回包。同時還附有查看timeline、cookie和localStorage的這些功能。雖然這些信息在chrome的調試工具里面也是觸手可及,可是由于涉及的原因,他們被放在跟原web頁面不相關的一個窗口里,還分了很多的標簽頁,在實際工作中,一個web頁面+F12的調試窗口經常就占滿了整個屏幕,著實是有些不太方便。這也是這個工具最初被制造出來,想要解決的問題吧。
這個工具的實現原理,是很簡單的函數劫持。有關于函數劫持的相關知識,可參見這篇文章(https://segmentfault.com/a/11...),其大概原理是創建一個和現有函數同名的函數(當然首先要把原來的函數給保存下來),以覆蓋掉他原本的引用,然后在函數體內先針對參數做一些自己想要實現的功能,最后再調用之前保存的原函數,實現原本的功能。
這個思路也很像redux里面有關于middleware的設計,只不過redux運用的思想更為先進,通過一系列結構將各個中間件解耦,互不干擾。而本文的目的不是為了靈活的使用各種中間件,只是為了想做一個調試信息的自主整合頁面,所以使用這種強聯系的耦合方式也沒有什么大問題。
原文中的關鍵源碼如下:
window.console = { wc: window.console }; //將原本console的引用指向console的一個成員變量wc,以便在后面擴充的函數中使用。 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); } });
代碼選自原網頁,注釋是我加的。
在JavaScript中,函數也是對象的一種,也能像對象一樣擁有自己的變量。所以程序的前三行就是講console這個對象換了一個別名wc保存在console本身內。
第四行是為了保存當前語境下的this,事實上在瀏覽器的調試工具中直接運行這些代碼的時候,這個this指向的就是全局對象window,所以去掉這一行,將下面的self.log改成window.log,程序的運行結果是一模一樣的。
保存完了所有需要的變量后,下面的事情就簡單了,遍歷console下的log, error, warn, debug和info這五個方法,把他們都修改成先執行本身,然后再執行我們自定義的log方法,在這個自定義的log方法內,我們能訪問到傳入的參數msg和訪問的原生函數名item,然后就可以通過這個鉤子,去獲取數據,并做一些處理,顯示到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, " ")}) }else if(xhr.status>=400) { console.error(xhr.responseURL +" "+xhr.status+" ("+xhr.statusText+")") } else{ window.setTimeout(function () { checkSuccess(xhr); }, 0); } }
區別就是因為ajax是異步請求,所以在函數內部內置了一個setTimeout循環,如果請求未完成則一直循環,直到請求完成,內容被捕獲為止。
這個工具還有個移動端的版本:https://github.com/WechatFE/v...
對于做微信開發的小伙伴們,以后的測試就方便多啦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91248.html
摘要:頁面調試騰訊開發維護的代碼調試發布,錯誤監控上報,用戶問題定位。同樣是由騰訊開發維護的代碼調試工具,是針對移動端的調試工具。前端業務代碼工具庫。動畫庫動畫庫,也是目前通用的動畫庫。 本人微信公眾號:前端修煉之路,歡迎關注 本篇文章整理自己使用過的和看到過的一些插件和工具,方便日后自己查找和使用。 另外,感謝白小明,文中很多的工具來源于此。 彈出框 layer:http://layer....
摘要:在他的重學前端課程中提到到現在為止,前端工程師已經成為研發體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發是一個非常特殊的行業,它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現在為止,前端工程師已經成為研...
摘要:在他的重學前端課程中提到到現在為止,前端工程師已經成為研發體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發是一個非常特殊的行業,它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現在為止,前端工程師已經成為研發體系...
閱讀 3617·2023-04-25 23:32
閱讀 2039·2019-08-30 15:55
閱讀 2651·2019-08-30 15:52
閱讀 3110·2019-08-30 10:54
閱讀 839·2019-08-29 16:16
閱讀 646·2019-08-29 15:09
閱讀 3647·2019-08-26 14:05
閱讀 1632·2019-08-26 13:22