性能优化-构建产物体积优化

645 阅读4分钟

什么是性能优化

什么是性能优化?我相信很多人都没有想过这样一个问题?所谓的性能优化其实就是指在保持系统稳定的情况下,使功能更快速完成,交互更友好。

怎么做性能优化

那怎么去做性能优化?我们可能想到很多方式,例如ssr等等,但是问题就是这些优化方式不一定适用于当前你所面临的问题,我们只是盲目的去做这些事情,我们没有去考虑到付出的能力和收益成不成正比。
那我们该怎么去做呢?

  1. 收集数据,找到短板
  2. 找到对短板相对应的处理方式

一定要从数据出发,而不能主观认为。

最容易产生效果-产物体积优化

产物体积优化,对于很多项目来说都是最容易获得收益的方式。为什么容易获得收益?例如我们通过构建产物分析工具就能明确的分析是否tree shaking失效、第三方依赖重复引入、引入了运行时不需要得包、有些包是否是可以用更小的包替换等等,而解决这些问题,我们通常情况下就能使产物体积减小,从而产生一系列的优化,例如spa的首屏加载优化等等。简单来说就是这种方式简单、不需要太高的门槛,而且收益和投出的人力基本成正比

解决产物体积大的最根本的方式还是项目治理,例如下面会说到的几个问题,我们很少会这么做,为什么?因为这些工作麻烦.不能在评绩效的时候很好的用夸张的修辞手法去写,就是不能很好的吹牛。其次每个人都想学习更多的东西,更前沿的技术,所以导致很多人不能直面问题,而是采取很多可以说是过渡方式,最终导致项目可能越来越乱。

产物分析工具

tree shaking失效

tree shaking:简单来说就是把没有用到的东西,打包的时候从产物中去掉。但是有几个要注意的点:

  • tree shaking只对esmodule有效,因为tree shaking是静态分析的时候做的。
  • 对于项目代码,要在package.json里面配置sideEffect,声明模块没有副作用。 sideEffect有三个值:
  1. true 表示都有副作用
  2. false 表示都没有副作用
  3. [<路径>] 表示只有这些文件有副作用,其他没有副作用. 副作用:就是删除这段代码,对逻辑没有任何影响

第三方依赖重复引入

重复引用的问题实际上就是: a依赖b、c 。b 依赖c,又因为c的版本不一样,所以打包的时候都会一起引入。就依赖问题,有可能深层嵌套最终导致会导致嵌套地狱。

解决方式

版本兼容

package.json按照semver的规范,小版本升级是兼容的,但有时候第三方模块也不一定会遵守semver规范。对于兼容的版本我们可以用npm dedupe去简化依赖树,当然yarn也有同样的功能。

版本不兼容

如果版本不兼容的话,可以确定回归范围,再进行替换,这里其实有一个个人意见就是频繁更新,因为频繁更新就一般不会导致突然升级,导致一大堆需要回归的东西的问题。其实前者就是渐进,后者就是跳跃。就这两个区别。

引入运行时不需要的依赖

这里就要确认哪些是运行时不需要的包,可以通过分析工具去分析。

包替换

其实有时候我们只是用到一个包地一小部分功能,但是我们却把整个包都引入了,其实这种场景我们就可以尝试寻找更小体积的包进行替换。

代码整理

这里其实就是一些基础建设方面,例如公共组件的建设、公共工具的建设等等。

往前冲

一个人的碎碎念文章、一个人努力在世界留下足迹的方式。