web前端开发调试技巧
- chrome作为前端开发最重要的工具之一,调试的技巧很多,这里将自己常用的技巧整理出来,持续更新中;(这些技巧来源于同事的分享、网上部分博客和自己的经验🎉)
- 参考资料: https://developer.chrome.com/docs/devtools/ (这个是最权威官方资料,需要持续学习);
console面板及console.log
- 前端代码中关键地方的执行、接口的调用、正在开发某个组件时的参数等地方,使用console.log,配合上console面板过滤,比较直观明显的发现某个问题;

- 很多开发问题都可以通过console面板及console.log来发现并解决,但是当然需配合其他技巧来提高效率,当这个方法解决不了问题时,一般也说明问题不是很简单;
- 注意生产项目中的console需要及时清理,可以自己封装一个console的方法,或者配合webpack的uglifyjs插件进行清理(参考:清理console.log);
network面板
巧用network面板的过滤操作: 通过过滤操作筛选请求链接;通过特定请求内容,来快速筛选是那个请求;

chrome开发时禁止缓存,勾选
disable cache即可;
disable cache的作用就是修改了http请求的cache-control的字段,从而实现了禁止缓存(参考:disable cache),这个也是前端面试中常问的http缓存的非常常见的例子,(被这个坑了几次了,换了个电脑忘记勾选了🤦♂️);

React项目配套chrome插件
- 前提是:在开发React项目时开发阶段使用;
React Developer Tools插件
- chrome控制面板中会多出来一个Components面板,这个面板中会显示React项目中的组件,可以点击进入组件的详情页,查看组件的生命周期,可以查看组件的props和state,可以查看组件的渲染结果;

- 应用场景: 对于一个特别大的项目,可以通过这个方法,快速发现页面中对应元素的组件信息,从而找到组件代码,进行开发;(当然啦,为了快速定位某个组件的逻辑代码,还有一些其它的方法,比如: 通过观察dom的element的结构,寻找附近典型的文案等信息,直接在代码中快速搜索;寻找一些标志性的信息,比如,某些button组件会附带上一些data-hottag,来做全局性的埋点监听,在element的看板中,看到这个标志性的信息后,可以在代码中快速搜索,从而定位到相关代码);
- 对于该组件的Profile面板,可以用来组件的性能分析,尤其时,当组件状态特别复杂,不小心写成无限re-render的时候,可以勾选
Highlight updates,查看组件的更新情况(这个特别好用);
- 对于巨型项目,通过会面对触发了大量的action事件但是并不知道代码中是从哪里开始的,这个问题其实是很重要的,笔者亲身经历过这种类似的场景,比如通过redux的action面板,看到数据有些问题,但是action不知道是哪里触发的,借助redux的trace功能可以很好的解决这个问题,redux需要特殊配置下参数,webpack编译时要配置下devtool的格式,具体配置参考:
前端项目断点调试
添加断点
- 通过断点,查找错误,调试错误;
- 使用方法: 开发项目阶段,可以在对应代码的位置插入
debugger(这种方法不推荐),也可以直接通过chrome工具扩展按钮来search对应的关键代码,点击即可找到对应的文件,在需要调试的地方加上断点,当执行到对应的地方即可触发调试!



添加logpoint
- 在代码中添加console.log可能比较直观,但是会有一些弊端,比如:1.需要手动添加console.log的代码,比较繁琐;2.本人亲自在大型前端项目中遇到过因为console.log调试来导致的crash,类似的原因参考:https://juejin.cn/post/7185128318235541563;https://juejin.cn/post/7185501830040944698; (回忆我之前有次chrome报“DevTools was disconnected from the page”然后crash掉原因是,调试某个组件,大量交互事件导致组件频繁rerender,打断点不太方便比较数据前后变化,所以用console.log。因为控制台保留了打印对象的引用,导致内存无法正常gc,而落地页打印的对象通常比较大,比如巨型结构数据,内存溢出就很容易溢出了,然后chrome就crash掉了。) 所以结论是尽量避免使用console.log, 最好使用logpoint.
- logpoint使用文档: https://developer.chrome.com/docs/devtools/javascript/breakpoints/; https://www.wisdomgeek.com/development/web-development/javascript/chrome-devtools-using-logpoints-for-logging-messages-directly/;

performance面板监控
chrome配置代理
- 通常指的代理就是想拦截请求,然后转发到另一个服务器;而对应我们项目开发中,遇到想让我们浏览器中的特定的请求转发到另一个服务器,通常有2个做法:(开发中推荐第二种方法)
mac全局代理
- 不使用chrome的插件,直接在mac中配置系统代理,所有的请求都会系统中的网络配置转发到我们的代理服务器,参考下图,(这个其实也是我们使用一些vpn软件的一个类似的原理);开发项目中,我们可以转发到whistle代理中,通过whistle的rule配置进而转发到我们的真实的服务器上;(开发项目中,其实不推荐用这种系统代理的)

SwitchyOmega + whistle
- 使用chrome的插件:SwitchyOmega(进行浏览器所有请求的转发),参考下图,一般可以将想要的域名对应的接口先转到本地的whistle代理上,然后通过whistle的rule配置再转发到我们想要的服务器上;(注意,SwitchyOmega配置转发的host需要和whistle的host要一致,不一致的部分最终不能代理成功,这个地方也被坑了几次😭)

- whistle配置代理的常用技巧:(主要结合正则使用) 配置跨域:
sh
* resCors://*结合正则配置匹配路径:
sh
(本地的js可以利用npm包http-server来转发; 巧妙利用正则可以灵活的去代理)
/^https://puafafafafblic.gdtimg.com/static/onex/delivery/([\s\S]*)$/ http://127.0.0.1:8080/js/$1
/https://adad.qq.com/atlas/[\s\S]*/ad/create/ http://127.0.0.1:8080/html/atlas/ad/create.shtml
/^https?:\/\/mp.weixafafafain.qafafq.com\/promotion\/readtemplate?((.+)t=(.+)\/([^&]+).*)$/ http://127.0.0.1:31001/html/$3/$4.html利用whistle的value来mock接口:
sh
https://abc.com/bff/proxy/gdt-api/ad_manage/v1/dpbm/get_business_permission_result tpl://{get_business_permission_result.json}