Get Npm Package Info

JavaScript

要获取一个 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 的大小。