在腾讯的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, "\t")})}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...
对于做微信开发的小伙伴们,以后的测试就方便多啦!

从函数劫持角度看开发调试工具AlloyLever相关推荐

  1. 一个函数的自白:从函数的角度看编程的方式

    以下内容转载自 https://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651002566&idx=1&sn=76b652 ...

  2. 从SEO角度看开发人员需要做的代码技术

    SEO是网站建站必须做的了,网站将用户需求和搜索引擎抓取需求.关键词排名需求等等,,所以建站必须要站在用户和搜索规则角度出发,当然如果你不是一个营销型网站则可以只站在用户角度思考. 建站建议一:页面设 ...

  3. 移动web开发调试工具AlloyLever介绍

    简介 web调试有几个非常频繁的刚需:看log.看error.看AJAX发包与回包.其他的如timeline和cookie以及localstorage就不是那么频繁,但是AlloyLever都支持.如 ...

  4. matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数

    帮助你理解线性代数与机器学习紧密结合的核心内容 下文节选自北大出版社<机器学习线性代数基础>, [遇见]已获授权许可. 这本书不同于传统教材, 从新的角度来介绍线性代数的核心知识, 讲解也 ...

  5. 从用户的角度看 c语言中函数有两种,【南开大学】20秋学期(1709、1803、1809、1903、1909、2003、2009 )《C语言程序设计》在线作业答卷...

    20秋学期(1709.1803.1809.1903.1909.2003.2009 )<C语言程序设计>在线作业 试卷总分:100  得分:100 一.单选题 (共 40 道试题,共 80 ...

  6. 从android研发角度看鸿蒙应用开发

    最近公司开发任务,要求做一款现有应用配套的鸿蒙FA,于是开始了我的鸿蒙开发之路.在这里记录并分享我从一个android开发工程师的角度,对鸿蒙和android在开发编码阶段的同与异. android转 ...

  7. 一般向量空间的基变换_从希尔伯特空间的角度看线性变换的一般思想和问题

    一般线性变换以及傅里叶变换,欧氏变换,仿射变换,余弦变换,小波变换,拉普拉斯变换,Z变换,希尔伯特变换等等这些所谓的变换太多了,这些到底搞得是什么?怎么像云像雾又像风呢?怎么才能彻底理解它们?它们究竟 ...

  8. 运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

    运行时区域 1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机概念模型里(概念模型,各种虚拟机 ...

  9. 公司技术管理角度看C++游戏程序员发展

    公司技术管理角度看C++游戏程序员发展 H3D 这是我多年来招聘培训游戏程序员的一点想法.一直想汇总一下.主要目的是为了更好的对公司新进C++程序员进行培训,并且建立起游戏程序员培训,发展,成才,成为 ...

最新文章

  1. EST:西湖大学鞠峰组-污水厂病原菌与土著反硝化细菌是多重抗生素耐药基因的活跃表达者...
  2. 鼠标悬停事件_Red语言-GUI-事件和参与者
  3. 【常用】鼠标拖动物体移动
  4. Docker日志日期时间精确查询
  5. 计算机基础- -计算机为什么要使用二进制
  6. 异常处理机制——panic 和 recover
  7. 深入理解Java中的位操作
  8. java random.nextbytes_Java Random类
  9. php system startup,opencart Warning: require_once(/system/startup.php) failed to open stream
  10. leetcode刷题:1.无重复字符的最长字串
  11. 二年级机器人伙伴看图写话_期末考试一二年级看图写话22篇,附范文!
  12. 拉格朗日乘子法 那些年学过的高数
  13. MTK平台TP驱动框架分析
  14. 诚意满满的奉上2000套Axure原型图设计源文件UI UX交互设计案例
  15. 数据结构与算法的个人学习经验小结(总)
  16. 戴尔服务器r620引导盘,戴尔R620服务器WINDOWS的操作系统无引导盘安装方法.ppt
  17. PDF编辑方法,怎么删除PDF中的一页
  18. Xtrabackup使用指南 InnoDB数据备份工具
  19. html表格制作旅游网页,简单实用的网页表格特效_html
  20. app屏幕随手势放大缩小

热门文章

  1. 纯css用图片代替checkbox和radio,无js实现方法
  2. Java开发小技巧(六):使用Apache POI读取Excel
  3. bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】
  4. 在windows下安装flex和bison、GCC
  5. SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解
  6. wampserver2.5安装 redis缓存,igbinary, phalcon框架
  7. MySQL 绿色版安装方法图文教程
  8. [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现
  9. 对软件体系结构的认识
  10. 基于visual Studio2013解决C语言竞赛题之1081shell排序