打包产物审计
简介
通过分析每一次前端项目的打包结果,给出绝对性能分析结果。最终以 Audit Rules(审计规则)的形式给出每一条规则的得分,根据打分结果与阈值比对,在劣化(有基准)或绝对值较差(无基准)时生成报警规则。
所有规则的得分最高值为 1 分,最低值为 0 分,所有警告生成条件为 得分 < 阈值。
打包产物评分标准
SUM(规则得分 * 规则权重) / 规则总权重
。产物中存在多个 Entrypoints 的情况,最终得分为所有 Entrypoints 得分的平均值。
审计规则
Large synchronous composable assets (大体积同步加载 JS/CSS 文件)
介绍
:大体积的同步 JS/CSS 会显著增加页面的加载时间,通过拆分不必要的首屏加载资源,可以达成很高的优化收益。可以通过 webpack 的 split chunks 配置及 lazy load 达成。
判断规则
:文件体积 > 200 KB
计分方式
:1 - 大体积同步 JS/CSS 文件总体积 / 所有 JS/CSS 资源总体积
绝对警告阈值(无基准)
:得分 < 0.75
相对警告阈值(有基准)
:得分 < 基准得分 - 0.1
权重
:20
Duplicated third-party libraries (重复的第三方依赖)
介绍
:打包结果中出现的同一依赖不同版本或不同依赖但功能相同的依赖。例如打包产物中出现了两个版本的 lodash(@1.1.0, @2.0.0),或同时出现了 momentjs、dayjs 或 date-fns
判断规则
:出现重复
计分方式
:1 / log2(重复依赖数量 + 2)
绝对警告阈值(无基准)
:得分 < 0.4(4 个以上)
相对警告阈值(有基准)
:得分 < 基准得分
权重
:20
Mixed content (混合源代码及第三方依赖的 js/css 文件)
介绍
:打包产物中混合了业务源代码以及第三方依赖代码的文件。这些文件同时会影响到 cache invalidation 的结果。这些文件需要被标注的原因是,在项目迭代过程中,第三方依赖的更新频率往往是不同于项目代码的。这就导致了一次发版中,即便第三方依赖没有进行更新,但还是被与源代码同时打包到一个文件中,导致产生了新的文件,用户也就需要重复下载没有被更新的第三方依赖。了解更多
判断规则
:同时包含了源代码与第三方依赖的文件
计分方式
:1 / log2(混合文件数量 + 2)
绝对警告阈值(无基准)
:得分 < 0.5(3 个以上)
相对警告阈值(有基准)
:得分 < 基准得分
权重
:20
Large third-party libraries (大体积同步加载第三方依赖)
介绍
:大体积第三方依赖会增加加载时间以及执行时间。可以选择体积更小的同功能替代者来降低体积,或者按需(lazy load)仅在使用时加载。
判断规则
:第三方包出现在产物中的总体积 > 100 KB
计分方式
:1 - 大体积同步加载第三方依赖总体积 / 所有依赖总体积
绝对警告阈值(无基准)
:得分 < 0.9
相对警告阈值(有基准)
:得分 < 基准得分 - 0.1
权重
:10
Non-minified assets (未 minified/uglified 静态资源,仅 js/css/html)
介绍
:通过 uglify 打包产物,降低产物体积
判断规则
:有未 minified/uglified 的静态资源
计分方式
:有 - 0, 无 - 1
绝对警告阈值(无基准)
:得分 < 1
相对警告阈值(有基准)
:得分 < 1
权重
:20
CDN preconnect (HTML 中添加 CDN preconnect 内容)
介绍
:在劣网络环境中,建立链接通常会消耗比较长的时间,尤其是建立安全连接。在服务真正相应用户请求前会经过多道步骤,比如 DNS 查询,重定向等等。将这些步骤提前(并不会增加解析/带宽开销)可以让用户体验到页面加载更加迅捷。了解更多。
判断规则
:静态资源链接 origin 有无定义 preconnect/dns-prefetch
计分方式
:有 preconnect - 1,无 - 0
绝对警告阈值(无基准)
:得分 < 1
相对警告阈值(有基准)
:得分 < 1
权重
:5
Unhealthy third-party libraries (不健康第三方依赖)
介绍
:第三方依赖中,存在不健康状态会被此规则命中。不健康包括:体积过大并且有已知功能完备的替代品、不该出现的依赖(process/fs/path 等)、需要额外配置才能达到最佳使用效果。
判断规则
:命中列表
计分方式
:1 / log2(不健康依赖数量 + 2)
绝对警告阈值(无基准)
:得分 < 0.5(3 个以上)
相对警告阈值(有基准)
:得分 < 基准得分
权重
:5
Large synchronous decomposable assets (大体积同步加载资源文件)
介绍
:大体积同步资源文件(fonts/images/videos)会显著增加页面的加载时间,使用更小的资源或者使用更优秀的压缩/编码算法。
判断规则
:文件体积 > 200 KB
计分方式
:1 - 大体积同步资源文件总体积 / 所有资源总体积
绝对警告阈值(无基准)
:得分 < 0.75
相对警告阈值(有基准)
:得分 < 基准得分 - 0.1
权重
:0
Cache invalidation (缓存失效)
介绍
:在两次发版中,第二次所生成的静态资源无法复用的部分。换句话说,在 1.0 版本中,用户下载并缓存的静态资源,由于 1.1 版本的变动,生成出的静态资源有所改变,部分静态资源没有命中之前的缓存,需要重新下载。
判断规则
:是否为新文件
计分方式
:1 - 新文件体积 / 基准中所有文件总体积
绝对警告阈值(无基准)
:得分 < 0.75
相对警告阈值(有基准)
:得分 < 基准得分 - 0.1
权重
:0
Out repository libraries (引入非项目依赖)
介绍
:部分打包工具会将运行时依赖 resolve 到非项目指定安装的版本,这会导致依赖版本不受 lock 文件(yarn.lock/package-lock.json)控制,进而出现依赖多版本混用,版本不兼容等问题。例如,我们从某个项目中发现了 4 个不同版本的 react-dom
判断规则
:无法从项目自身安装的依赖(node_modules)中直接收集到的第三方依赖
计分方式
:有 - 0, 无 - 1
绝对警告阈值(无基准)
:得分 < 1
相对警告阈值(有基准)
:得分 < 1
权重
:0