有没有办法找到依赖包的 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}
。但它只会给你下载次数。
例如我有 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}
。但它只会给你下载次数。