有没有办法找到依赖包的 download/popularity 统计信息?

Is there a way find download/popularity stats for depending packages?

例如我有 a driver for elasticsearch and list of modules,它们是使用此驱动程序构建的。大约 800 个模块。

有没有办法按照流行度或下载量对这个列表进行排序,这样我就可以找到最常用的依赖包?我想这将有助于找到有用的库或基于本机驱动程序的 ODM。

我发现了几个基于社区 npm 的统计数据,但我从未见过类似的东西。

您可以 运行 一些像这样的脚本。它基本上是获取所有依赖项,然后为每个依赖项获取分数。

const pkg = "@elastic/elasticsearch";
const dependents = [];

const fetchAll = async (offset = 0) => {
  const res = await fetch(
    `https://www.npmjs.com/browse/depended/${pkg}?offset=${offset}`,
    { headers: { "x-spiferack": "1" }, method: "GET" }
  );
  const data = await res.json();
  dependents.push(...data.packages);
  if (data.hasNext) await fetchAll(offset + data.paginationSize);
};

const main = async () => {
  await fetchAll();
  const result = await Promise.all(
    dependents.map(async ({ name }) => {
      const res = await fetch(
        `https://registry.npmjs.com/-/v1/search?text=${name}&size=1`
      );
      const data = await res.json();
      return { name, score: data.objects[0]?.score };
    })
  );

  // console.log(JSON.stringify(result));
  // TODO: sort then display your result here
};

main();

result 在排序之前看起来像这样:

[
  {
    "name": "winston-elasticsearch",
    "score": {
      "final": 0.3617392174769229,
      "detail": {
        "quality": 0.5468432882273897,
        "popularity": 0.23232512016539603,
        "maintenance": 0.3324926827166212
      }
    }
  },
  {
    "name": "mongoosastic",
    "score": {
      "final": 0.3562854605860561,
      "detail": {
        "quality": 0.5583413799576047,
        "popularity": 0.2060467998060229,
        "maintenance": 0.3333333333333333
      }
    }
  },
  // ...
]

请注意,这是一个 hack(使用 NPM 的内部 APIs 并过度搜索注册表),NPM 可能会抛出一些错误,例如请求过多或连接超时,尤其是当您的包数量是太多了,而且你没有冷静下来(你可以在这里实现它,要么通过改变我使用 Promise.all 的逻辑,要么使用已经具有此类功能的 got)。

此外,这些 API 端点似乎不够一致(比如家属只为 @elastic/elasticsearch 提供了约 400 个条目,而在网站上显示为约 800 个,并且尽管应该给某些包裹打分,但 score one 并没有给出分数)。最好使用像 npms.io 这样的服务来正确验证(和缓存)结果。该方法将是相似的,并且实施起来非常简单。

NPM 上也有某些软件包已经 do/used 可以做到这一点。查找它们 here 看看是否有任何工作正常。


除了 /-/v1/search hack,您还可以使用 "x-spiferack": "1" header 获取 https://www.npmjs.com/package/${name}。但它只会给你下载次数。