Skip to main content

打包产物审计

简介

通过分析每一次前端项目的打包结果,给出绝对性能分析结果。最终以 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