在 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
计算出来,然后加起来就可以了。不需要额外生成辅助的临时文件。