思路
通过静态扫描+动态测试+深入函数级别的性能探测,三合一构建最佳实践一条龙服务。
lighthouse测试
可以下载Chrome插件,也可以直接程序中引入js使用:
https://www.cnblogs.com/fnng/p/15488030.html
网易云音乐的实践:
https://zhuanlan.zhihu.com/p/91365316
依赖包分析
这个在线工具可以分析你的package.json,列出每个包的大小以及在不同网速下的加载耗时,很赞!
https://bundlephobia.com/
比如我扫描d3-charts,得到的结果如下:

静态扫描
https://github.com/es-analysis/plato
动态测试
npm install -g lighthouse
lighthouse –view url
深入函数级别的性能探测
类似PHP中的XHProf,可以通过切面(AOP)的概念来做:
https://polande.com/js-aop-function-time/
内存
可以编写函数获取每个变量的内存大小:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| function memorySizeOf(obj) { var bytes = 0;
function sizeOf(obj) { if(obj !== null && obj !== undefined) { switch(typeof obj) { case 'number': bytes += 8; break; case 'string': bytes += obj.length * 2; break; case 'boolean': bytes += 4; break; case 'object': var objClass = Object.prototype.toString.call(obj).slice(8, -1); if(objClass === 'Object' || objClass === 'Array') { for(var key in obj) { if(!obj.hasOwnProperty(key)) continue; sizeOf(obj[key]); } } else bytes += obj.toString().length * 2; break; } } return bytes; };
function formatByteSize(bytes) { if(bytes < 1024) return bytes + " bytes"; else if(bytes < 1048576) return(bytes / 1024).toFixed(3) + " KiB"; else if(bytes < 1073741824) return(bytes / 1048576).toFixed(3) + " MiB"; else return(bytes / 1073741824).toFixed(3) + " GiB"; };
return formatByteSize(sizeOf(obj)); };
|
参考文章:JS内存管理
流程
引入stat.js
https://mrdoob.github.io/stats.js/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <script src="https://mrdoob.github.io/stats.js/build/stats.min.js"></script> <script> var stats = new Stats(); stats.showPanel(0); document.body.appendChild(stats.dom);
function animate() { stats.begin(); stats.end(); requestAnimationFrame(animate); }
requestAnimationFrame(animate); </script>
|
开启Chrome性能分析
定位到具体影响性能的代码
参考资料
(精)使用 Preload/Prefetch 优化你的应用:
https://zhuanlan.zhihu.com/p/48521680