Skip to content

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 客户端的体积优化 体积优化

如果有个包没有依赖,例如 pkgApackage.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 }
}