Get Package Size

Build

在 npm 中,可以通过 npm publish --dry-run 来“试运行”一次发布命令。不会真的将当前的内容发布到 npm 上,但是会执行完所有的步骤,并完整的列出会发布的文件以及文件对应的大小。通过这个 CLI 命令,可以直观的看到当前的 npm 包占用的体积。

如果希望可以通过 JavaScript API 的方式直接获取,可以考虑如下的方法:

const packlist = require('npm-packlist');
const tar = require('tar');
const cacache = require('cacache');
const rimraf = require('rimraf');

const tmpFolder = '.tmp';

async function getPackedSize(packagePath) {
  const files = await packlist({ path: packagePath });
  const folder = await cacache.tmp.mkdir(tmpFolder);
  const tmpTar = path.join(folder, 'package.tgz');
  await tar.create({
    prefix: 'package/',
    cwd: packagePath,
    file: tmpTar,
    gzip: true
  }, files);
  const { size } = fs.statSync(tmpTar);
  rimraf.sync(tmpFolder);
  return size;
}

上面的代码展示了如何获取发布包压缩后的代码,几点说明:

  • npm-packlist 这个包是专门用来分析需要发布的文件列表的,文档在这里
  • cacache 这个包可以创建临时的目录,用于存放临时生成的 tar 文件,文档在这里
  • tar 这个包可以用于将所有指定的文件都打包到 tar 中,文档在这里
  • rimraf 这个包可以用于将指定的目录删除,这里用于清理不需要的临时目录,文档在这里

以上的代码参考了 npm 的流程操作,见 npm cli 中的 packDirectory 代码

如果需要计算非压缩的体积,原理也是类似的。不同点在于,通过 npm-packlist 取得文件列表之后,直接依次将每个文件的大小通过 fs.statSync 计算出来,然后加起来就可以了。不需要额外生成辅助的临时文件。