truth-cli 中的优化
优化
npm
依赖之间的嵌套关系会很深,这意味着:生成的数据大小随着深度增加是指数增加的。
为此,truth-cli
在递归的"递"过程中,会记住走过的所有节点,后续向下"递"的过程中碰到相同点节点,那么此节点便是最大深度,不会继续向下递归,并在"归"的过程中,删除记住的节点。
另外,@truth-cli/core
还提供了一种深度优化的方案(只针对 genJson
),开启后不会删除记住的节点,这意味着一个依赖只会出现一次(对于自身引用的依赖,例如 typescript,会出现两次)。
递归优化
truth-cli
在多处地方使用了递归算法,这意味着我们必须找到一个合适的数据结构加快递归的速度,我们采用的策略是:生成 relations
关系图
你可以把 relations
看成所有依赖的 package.json
合集,它只有一层结构,格式类似于:
json
{
"pkg1": { "packages": { "pkg2": "^1.1.1" } },
"pkg2": {
/* */
}
// ...
}
这种格式的好处是,当我们想要查找某个依赖时,我们只需要查找该键值对应的值即可,而对象根据键值查找的时间复杂度只有 O(1)
,递归耗费时间会大大减少。
同时当我们生成了 relations
后,后续操作都不需要再次读取文件。
体积优化
在原理介绍中,我们讲解了 truth-cli
客户端的体积优化 体积优化。
如果有个包没有依赖,例如 pkgA
的 package.json
文件,只有以下内容:
json
{
"name": "pkgA",
"version": "3.3.3"
}
在没有进行体积优化前的 pkgs
:
json
{
"pkgA": { "version": "3.3.3", "packages": {}, "type": 0 }
}
进行体积优化后的 pkgs
:
json
{
"pkgA": { "version": "3.3.3", "type": 0 }
}