⭐️ 本文首发自 前端修罗场(点击加入),是一个由 资深开发者 独立运行 的专业技术社区,我专注 Web 技术、Web3、区块链、答疑解惑、面试辅导以及职业发展博主创作的 《前端面试复习笔记》(点击订阅),广受好评,已帮助多人提升实力、拿到 offer。现在订阅,私聊我即可获取一次免费的模拟面试机会,帮你评估知识点的掌握程度,获得更全面的学习指导意见!

前端开发之高级调式

春困秋乏,想正经写篇blog都难,可有良方奉上?

首先我们对本篇进行概括,将分以下几点讲解:

1、断电以及捕捉事件绑定

2、Audits和Chrome性能插件

3、Timeline掌控帧渲染模式

4、Profiles分析NodeJS内存泄露问题

一、断点以及捕捉事件绑定

概要:

(1)断点

(2)寻找事件监听

(3)DOM元素断点

说道打断点,js编辑器中似乎听说的只有MS 的 Visual Studio,这傻X,MS从来没抛弃它~

1、断点

(1)基本断点
新建一个debug.html文件:

<html>
<head><meta charset="utf-8" /><title></title>
</head>
<body><label for="email">Email:</label><input type="email"  id="email"/><button type="button" id="btn-test" class="btn btn-success">测试</button><div id="test-div">一段文字</div><script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type="text/javascript">$("#btn-test").click(function(){var val=$("#email").val();alert(val);});</script></body>
</html>

然后我们进行调式,审查元素:


在这里我们定位需要调式的DOM元素,然后查看该元素绑定的事件监听Event Listeners.

我们在这里可以找到对应的事件监听,由此我们定位到具体的执行函数。

(2)DOM断点调式
接着,我们再来看一个案例:

代码如下:

 <html>
<head><meta charset="utf-8" /><title></title>
</head>
<body><label for="email">Email:</label><input type="email"  id="email"/><button type="button" id="btn-test" class="btn btn-success">测试</button><div id="test-div">一段文字</div><script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type="text/javascript">$("#btn-test").click(function(){var val=$("#email").val();alert(val);$("test-div").remove();//添加一个remove事件});</script></body>
</html>

如图:

我们在相应的DOM节点上打上事件断点,右击DOM,选择Break On.有三种选项:

(1)Subtree Modifications:表示监听所选择的DOM的子节点的事件,当该节点的子节点发生变化,就会打上相应的断点进行调式;

(2)Attributes Modifications:表示监听所选择的DOM的属性,当该DOM的属性发生变化的时候,就去打断点监听调式;

(3)Node Removal:表示监听该DOM的remove()事件,当该DOM被移除的时候,就会触发;

如下图所示:

由于我们对id="test-div"执行的是remove()事件,所以,在该div打上一个Node Removeal断点的时候,当执行到这里,就会跳入断点调式,找到调用的remove事件的具体方法。这就是基于DOM的断点调式。

二、Audits和Chrome性能插件

说道性能分析工具,可谓层出不穷。但是Chrome自带的插件也很强大了,特别是Chrome看不惯Firefox,在小小的DevTool中内插了巨多功能。这是要上天了~

Audits就是性能分析插件,类似雅虎军规。能够根据性能优化规则对你的网站提出优化意见。

Chrome性能插件有:

(1)Page Speed

(2)performance.timing(API):能够捕捉网页从输入到输出的一个过程,例如DNS、TCP、Request、Response(在做性能优化时,常常关注这几个点)时间。

如图:该图完整阐述了网页从输入到输出的一个过程。

来看一个例子:

<html>
<head><meta charset="utf-8" /><title></title><link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"><script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type="text/javascript" scr="test.js"></script>
</head>
<body><label for="email">Email:</label><input type="email"  id="email"/><button type="button" id="btn-test" class="btn btn-success">测试</button><div id="test-div">一段文字</div><script type="text/javascript">$("#btn-test").click(function(){var val=$("#email").val();alert(val);$("#test-div").remove();});</script></body>
</html>

这段代码中,我们引用了两个cdn文件和一个外部test.js文件,这3个文件都会对页面的加载产生阻塞。

然后我们使用Audits来调式一下:

如图:

点击Run。于是,我们会看到如下图结果:

Audits就会根据相应规则做出意见.

但是,Audits在视觉上得表现并不是那么好。所以,我们再来看看另一个插件:pageSpeed。(注意:运行pageSpeed需要在服务器环境下)如图:


pageSpeed能够很直观的表现我们需要优化的东西。

但是,pageSpeed还是不能满足专业的性能优化,这时候performance.timing就出现了,performance.timing 是一个API,接口中包含了当前页面中与时间相关的信息。
操作:
在你要测试的页面,打开控制台输入window.performance,即可看到timing信息:
如图:

具体你可以参考:

https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceTiming

需要注意的是

在性能优化的时候,你需要理解这张图,这里也是对window.performance每个属性的具体定义。我们再次来回顾下前面提到过的这张图:

你需要理解DNS、TCP三次握手、请求与响应时间等等,如果要做到极致的话,你还可以去了解负载均衡等服务器端的知识。

小结:

上面我们介绍了Audits和Page SPeed以及performance.timing API。在实际的优化的过程中,通常我们会将以上几个工具进行配合使用。例如:可以先用Audits进行一个初步的判断,然后用Page Speed对问题进行具体的查看。

三、Timeline掌控帧渲染模式

看了辣么久,是不是不赖烦了,真的很烦啦。我们来看看内涵图:

网页动画能够做到每秒60帧,就会跟显示器同步进行刷新,一秒之内进行60次重新渲染,每次重新渲染的时间不能超过16.66毫秒(1s/1000=16.66毫秒)。

如果让浏览器的刷新与显示器的刷新同步,那么就会变得很流畅。

在Timeline帧渲染的过程中,会产生以下几种颜色:
(1)蓝色:网络通信和HTML解析
(2)黄色:javascript执行
(3)紫色:样式计算和布局,即重排
(4)绿色:重绘
(5)两个函数:

window.requestAnimationFrame()下一次重新渲染时,
以及window.requestIdleCallback()下几次重新渲染时。

这两个函数能够加快帧的渲染。我们可以对卡顿的帧执行这样的操作。

window.requestAnimationFrame:表意为请求动画帧。

写法:

  $(window).on('scroll',function(){window.requestAnimationFrame(scrollHandler);})

参考:CSS3动画那么强,requestAnimationFrame还有毛线用?

window.requestIdleCallback():哪几帧空了,就加速那几帧的渲染。

####网页是如何渲染的?

(1)获取DOM并将其分割为多个层(联想到:photoshop中的分层);

(2)将每个层独立的绘制进位图中;

(3)将层作为纹理上传至GPU;(层在GPU中如果不变,也会缓存)

(4)复合多个层来生成最终的屏幕图像。

具体过程:

(1)DOM子树渲染层(RenderLayer)–(对应)->RenderObject–(对应)->GraphicsContext(根元素、position、transform、半透明、CSS滤镜、Canvas2D、video、溢出,这些都会产生层,这些发生在CPU中)

如果需要GPU参与,则需要如下合成:

(2)(正常渲染,写一遍画一遍)Compositor->渲染层子树的图形层(GraphicsLayer)–>RenderLayer–>RenderObject

Compositor将所有的拥有compositing layer进行合成,合成过程GPU进行参与。合成完毕就能够将纹理映射到一个网格几何结构之上——在视频游戏或者CAD程序中,这种技术用来给框架式的3D模型添加“皮肤”。Chrome采用纹理把页面中的内容分块发送给GPU。纹理能够以很低的代价映射到不同的位置,而且还能够以很低的代价通过把它们应用到一个非常简单的矩形网格中进行变形。这就是3D CSS的实现原理啦。

(能够触发合层的:CSS 3D透视变换、video、webGL、transform动画、加速CSS滤镜、叠加在已经触发合成层,这些发生在GPU中)

重排与重绘

网页生成的时候,至少会渲染一次。用户访问的过程总还会不断重新渲染。以下三种情况,会导致网页重新渲染:

(1)修改DOM

(2)修改样式表

(3)用户事件

注释:

重新渲染,就需要重新生成布局(俗称“重排”reflow)和重新绘制(俗称“重绘”repaint)。

需要注意的是:

“重绘”不一定需要“重排”,比如改变某个网页元素的颜色,就只会触发“重绘”。因为布局没有改变,所以没有触发“重排”。

但是,“重排”必然导致“重绘”,比如改变一个网页元素的位置,就会同时触发“重绘”和“重排”,因为布局改变了。

####如何开发不会导致重排?

(1)样式表越简单,重排和重绘越快;(OOCSS)

(2)重排和重绘的DOM元素层级越高,成本越高;

(3)table元素的重排和重绘成本,要高于div元素;

(4)尽量不要把读操作和写操作放在一个语句里面;

(5)统一改变样式;

(6)缓存重排结果;

(7)离线DOM Fragment/clone

(8)虚拟DOM React

(9)必要的时候display:none不可见元素不影响重排重绘。visibility对重排影响不影响重绘。

达到高效的原则

影响重绘,但不影响重排,而且能让GPU参与。

同时,需要深刻理解“层”的概念

##四、使用Profiles分析NodeJS内存泄露问题

书籍推荐:WebKit技术内幕

Nodejs内存泄露问题——严重可导致CPU、服务器爆表;

Nodejs引起的内存泄露问题来源以及解决方法:

(1)全局变量需要进程退出才能释放;

(2)闭包引用中间函数,中间函数也不会释放。
所以,使用过后重置为NuLL等待垃圾回收。

(3)谨慎使用内存当做缓存,建议采用Redis或者Memcached.
好处:外部缓存软件有着良好的缓存过期淘汰策略以及自有的内存管理,不影响Node主进程的性能。减少内部常驻内存的对象数量垃圾回收更高效率,进程间共享缓存。

OK,就到这里啦~

参考文章

http://www.biaodianfu.com/html5-performance.html

http://www.jb51.net/css/125615.html 浏览器实现移动端高性能css3动画(开启gpu加速)

【调试】ChromeDevTool高级调式相关推荐

  1. 计算机调试员高级理论知识试卷,电子计算机设备调试员(高级)考核复习题—理论试题.doc...

    电子计算机设备调试员(高级)考核复习题-理论试题 电子计算机调试员高级考核复习题理论知识一.判断题(判断表述的内容正确与否).1.信息高速公路的缩写是NII.( √ ) -National Infar ...

  2. as的断点调试与高级断点调试

    <div class="markdown_views"><blockquote> 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说A ...

  3. VC调试器高级应用(转)

    VC调试器高级应用----高级断点篇 一.位置断点修饰符  1.跳跃计数.        功能是执行断点但不在断点处停止,直到执行完了一个特定的次数为止.   使用中首先设置一个标准的位置断点,打开B ...

  4. 电网调度计算机系统目前有三种,电网调度厂站端调试员高级工技能鉴定试题整理(包括图).doc...

    电网调度厂站端调试员高级工技能鉴定试题整理(包括图).doc 技能鉴定试题库(高级) 一.选择题: 1.8251有(C)8位I/O口 A.2个: B.16个; C.4个: D.5个. 2.在WIN98 ...

  5. VC调试器高级应用----系统函数,DLL段点

    一.高级断点语法 高级断点语法由两部分组成:1.上下文部分.2.位置,表达式,变量或Windows消息条件.   用函数,源文件和二进制模块来指定上下文,上下文的表示方法:   {[函数],[源文件] ...

  6. 计算机网络设备装配调试员高级,计算机及外部设备装配调试员

    1,电子技术基础 了解半导体器件的基本知识 熟悉晶体二极管,三极管的基本工作原理 熟悉放大器的组成及工作原理,放大,饱和,截止的条件及静态工作点的选择 反馈的概念,负反馈的原理,作用,类别 射极输出器 ...

  7. [免费专栏] Android安全之动态调试APP的一些技巧「Android Studio调试」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  8. Windows内核编程(三)-内核驱动运行与调试

    内核驱动运行与调试 驱动的运行 驱动的运行通过服务来实现. 微软规定,驱动文件必须经过微软的数字签名后,才可以运行在64位系统上,如果把没有经过签名的驱动直接放在64位操作系统中运行,结果是驱动加载失 ...

  9. C++高级编程(第3版)_学习记录

    <C++高级编程(第3版)> Professional C++, Third Edition [美]Narc Gregoire 著,张永强 译,清华大学出版社,2015.5第1版 文章目录 ...

最新文章

  1. 复旦陈静静 | 把握当下,坚持热爱,与食物图像识别结缘的科研之路
  2. 553 mail from must equal authorized user解决方法
  3. Python 搜狗站长平台批量添加域名+批量提交链接 过验证码 IP限制
  4. dom定义了访问html文档对象的,HTML DOM (文档对象模型)
  5. eth0,eth1,eth2,lo是什么
  6. java调用kettle例子_Kettle API - Java调用示例
  7. Python网络爬虫系列(一)
  8. 【Vegas原创】CPIO操作
  9. Git——版本管理工具(一)
  10. Java从入门到精通 第13章 抽象类与接口
  11. ad敷铜后还有部分飞线_眼花缭乱!超级无敌的飞线大法,打造一把超低功耗无线机械键盘...
  12. Java Web 2.1.4 HTML 表单标签与表单设计 (实例)
  13. Centos6普通用户获取最高权限方法
  14. C# 添加水印图片、文字、缩略图处理
  15. Reflector反编译.NET文件后修复
  16. 推荐一个视频播放器potplayer
  17. 中间服务器代理解决跨域
  18. VR全景拍摄如何正确的拍摄?全景摄影大赛等你来
  19. java版阿里云,百度ai,讯飞语音识别效果简单对比及demo
  20. 笔记本电脑搜索不到wifi,只有飞行模式

热门文章

  1. matlab中的numel函数
  2. oracle srvctl命令,Oracle SRVCTL使用说明
  3. 织梦cms--dedecms学习重要资料
  4. VL-BERT: Pre-training of Generic Visual-Linguistic Representations
  5. 计算机图形常用数学之向量运算 向量的模 向量的点乘内积 向量的叉乘外积 向量的模向量的加减法 向量归一化
  6. visu studio编程中L、TEXT、_TEXT、_T 用法说明
  7. linux操作系统下部署thinkphp5项目
  8. OpenGL 学习笔记III: 图形管线、三角形、shader 流水线
  9. 荧光染料CY3标记聚乳酸-羟基乙酸PLGA,聚已内酯PCL,聚乳酸PLA,聚丙烯酸PAA载药纳米粒
  10. 旋转卡壳(rotate吧)