要获取一个 NPM 包所有的版本信息,可以使用 npm view
这个命令。比如,检查 React 这个包的所有版本,并输出成 JSON 格式:
npm view react versions --json
当然,以上只是 CLI 的操作方式,如果希望可以通过编程的方式去了解一个 NPM 包的相关信息,需要换一个方式。注意到 NPM 本身也是一个 NPM 包,对应的源码可以在 GitHub 上找到。其中,npm view
这个命令,对应的代码是 lib/view.js。
通过观察这个文件,不难发现,NPM 底层依赖的其实是 libnpm 这个库。其中,获取包信息的部分,使用的是 libnpm/packument
这个部分。而根据文档,这里 libnpm/packument
本质上就是将 pacote 中的 packument
接口开放了出来。
实际的使用方法如下:
const packument = require('libnpm/packument');
async function getVersions(package) {
const { versions } = await packument(package, {
// to use custom registry
registry: 'https://registry.npm.taobao.org',
// get all meta data
fullMetadata: true,
// prefer to get latest online data
'prefer-online': true
});
return versions;
}
其中,packument
这个 API 的返回数据格式,可以参考 @types/pacote
中的相关定义。
需要额外注意的一点是:npm 和一些 registry 服务使用的数据格式可能略有区别。举例来说,npm 的返回数据里,每个版本的 dist
中可能包含 unpackedSize
数据(optional),表示该版本文件实际的大小;而 cnpm 返回的数据中,dist
内包含的是 size
数据(源代码),表示该版本的压缩文件 tar 的大小。