共 1812 字,读完需 3 分钟。工欲善其事必先利其器,前端周刊本周起每周会加餐 1 篇工具技巧,里面辅以动图,让大家看完就能学会,并上手使用。本文会介绍 Chrome Canary 新增的代码覆盖率功能、如何收集数据、如何基于它收集的数据来改进 WEB 应用的性能。

Chrome Canary 开发者工具中本周新增了 Coverage 功能,该功能同时适用于 JS 和 CSS,并有望很快登陆 Chrome 正式版。

Coverage 顾名思义就是代码覆盖率的意思,本文会跟大家介绍 Coverage 功能是什么、如何收集数据、及如何基于它收集的数据来改进 WEB 应用的性能。

Coverage 功能使用动态分析(Dynamic Analysis)法来收集代码运行时的覆盖率,让开发者能够窥探他的代码到底有多大比例在发光发热。动态分析是指在应用运行状态下收集代码执行数据的过程,换句话说,覆盖率数据就是在代码执行过程中通过标记收集到的。

Coverage 工具怎么用?

在探讨 Coverage 工具带来的好处之前,先快速看下如何使用它来收集覆盖率数据:

1. 调起 Coverage 面板

2. 录制 Coverage 数据

与 Performance 面板类似,Coverage 面板左上角有 3 个按钮,点击录制的时候会开始录制,同时录制按钮变红,再次点击录制按钮会停止录制并把录制到的覆盖率数据展示出来。此外,可以点击中间的快捷按钮,“刷新并开始录制”,待页面加载完之后停止录制。

Coverage 工具要求我们手动录制的原因是:动态分析过程需要监控每行代码的执行情况,也就意味着录制过程中执行的代码要比原始的应用的代码要多,因为动态分析过程需要对你的代码进行某种变换才知道哪些行被执行了。

3. 查看 Coverage 数据

如上图所示,Coverage 录制结果表格展示了录制过程中加载的所有 JS 和 CSS 文件,以及每个文件的大小、运行时覆盖率,汇总数据展示在页面底部的状态栏中(上面的截图没有展示)。单击单个静态资源能将其在 Sources 面板中打开,代码行号的左边用红绿色的条来标识代码是否在录制过程中被执行到。

Coverage 数据有啥用?

上面录制的数据中,最大的文件是 vendor.js,其中 55% 的代码都没有执行过,约 80 KB,这已经相当于一张典型图片的文件大小了。

如果某个文件覆盖率低(即未使用代码比例很高),通常意味着用户加载了太多不必要的代码(要么真的是无用代码,要么是当前时点还没执行到的代码),有性能常识的同学不难推断出,这会导致页面的完全加载时间、或单页应用的启动时间变慢,在慢速网络下的性能损耗会尤其明显;此外,更多代码的解析、编译也就意味着更多的硬件资源消耗,在低端设备上也会存在明显的性能问题。

在笔者看来,Coverage 数据至少能从下面 2 个方面指导我们进行 WEB 应用的优化:

除移死代码

以 Coverage 数据为参考,我们能了解页面重无用代码的比例到底有多大。现实世界中,很多工程师可能是在遗留代码库上工作,并且遗留代码库存在的时间还很长,那么很可能这个代码库中存在大量的无用代码,但是谁也不敢删除他们,因为 JS 这门语言的动态性,你不能粗暴的把哪些看起来“没有被使用”的代码直接删掉,除非你很清楚所有的代码执行路径,很显然这对于大型应用或者遗留代码库来说是不现实的。

怎么移除死代码呢?我们可以依赖打包工具,比如 UglifyJS 在压缩代码时支持直接删除死代码的配置项。而 Webpack 2 中引入了 Tree Shaking 的特性,能够自动把项目中没有用到的代码从打包中去掉,但是这种优化仅限于被 export 的代码。总而言之,死代码要尽可能想办法去掉,Coverage 工具能提供一个判断基准。

懒加载代码

如果能删的死代码都删了,但是 Coverage 数据还是居高不下,那么你应该换个角度思考。就像前文所说,JS 是动态语言,可能部分代码在页面加载时并没有用到,但是用户后来的操作会触发这些代码的执行,为什么不让这些代码在需要的时候再加载呢?聪明的你可能已经想到了,这就是懒加载的技术。

使用 Webpack 打包且没有对配置做特别调优的话,它默认会把所有依赖打包成一个巨大的文件,很容易出现首次加载覆盖率很低的情况,在 Webpack 中实现懒加载可以参考 Code Splitting 和 bundle-loader,具体的配置细节这里不展开讲。使用懒加载之后可以极大的减少页面初次下载的代码,从而提高性能。需要注意的是,懒加载优化需要在模块数量和模块大小之间把握一个平衡,否则过多的模块懒加载反而对性能不利,因为每个 HTTP 请求也是有额外开销的。

One More Thing

本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅知乎专栏:《前端周刊:让你在前端领域跟上时代的脚步》

Chrome DevTools 代码覆盖率功能详解的更多相关文章

  1. Fiddler抓取https请求 & Fiddler抓包工具常用功能详解

    Fiddler抓取https请求 & Fiddler抓包工具常用功能详解   先来看一个小故事: 小T在测试APP时,打开某个页面展示异常,于是就跑到客户端开发小A那里说:“你这个页面做的有问 ...

  2. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现   2.纯代 ...

  3. SVN功能详解

    SVN功能详解   TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...

  4. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  5. UIViewController中各方法调用顺序及功能详解

    UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...

  6. MySQL的用户密码过期功能详解

    MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...

  7. 【转】 /etc/fstab功能详解

    [转] /etc/fstab功能详解 最近去客户现场时,遇到 了一个关于挂载文件/etc/fstab文件的问题,就写了一下/etc/fstab文件的作用一个文件中各个参数的含义.供大家参考有不正确的地 ...

  8. 在ASP.NET 5应用程序中的跨域请求功能详解

    在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...

  9. .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】

    SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...

随机推荐

  1. mavne问题解决---Dynamic Web Module 2.3 or newer

    一:前沿 maven问题的bug,其实是很烦人的,因为每次都是很纠结的去改这个bug,特别的烦人,这个bug也是使得我纠结了好久的,那个星期五自己搞了几个小时都没有解决下,之后星期一来百度Google ...

  2. Spring - IoC(7): 延迟实例化

    默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...

  3. bzoj 1002 找规律(基尔霍夫矩阵)

    网上说的是什么基尔霍夫矩阵,没学过这个,打个表找下规律,发现 w[i]=3*w[i-1]-w[i-2]+2; 然后写个高精直接递推就行了 //By BLADEVIL var n :longint; a ...

  4. Red-Black Tree

    A red-black tree is a Binary Search Tree that satisfy the red-black tree properties: 1. Every node i ...

  5. 【mysql】索引与排序、重复索引、冗余索引

    索引与排序 排序可能发生2种情况: 1: 对于覆盖索引,直接在索引上查询时,就是有顺序的, using index 2: 先取出数据,形成临时表做filesort(文件排序,但文件可能在磁盘上,也可能 ...

  6. Django【进阶】序列化

    关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 方案一:serializers 1 2 3 4 5 fromdjango.cor ...

  7. 程序异常退出 却没有产生core文件

    程序异常退出  却没有产生core文件 http://www.cnblogs.com/my_life/articles/4107333.html

  8. servlet+forward和direct区别

    Servlet:是用于 java 编写的服务器端程序,其使用 java servlet API,当客户机发送请求到服务器时,服务器可以将请求信息发送给 servlet,并让 servlet 建立起服务 ...

  9. nginx部署vue工程和反向代理nodejs工程

    前端是vue,后端是nodejs 前端打包成dist目录,后端接口是localhost:4000/api server { listen 80; #listen [::]:80; server_nam ...

  10. cmake 同时编译多个cpp文件

    cmake_minimum_required(VERSION 2.8) project(coding) file(GLOB_RECURSE EXTRA_FILES */*) add_custom_ta ...