怎么样写一个能告诉你npm包名字是否被占用的工具

2022-12-01,,,,

事情是这样的:

因为我经常会写一些npm包,但是有时候我写完一个包,npm publish 的时候却被提示说包名字被占用了,要不就改名字,要不就加scope,很无奈。
npm 命令行可以通过 npm view 的方式去得知一个包是否存在,但是无法批量得知,所以就想着写一个工具来批量选名:)

本教程的相关代码已经全上传到github: 源代码

NPM方式

在写工具之前,我们先看看怎么通过 npm 提供的命令来得知包名是否被占用。

npm view

通过 npm view -h 我们可以得知其用法:

npm view [<@scope>/]<pkg>[@<version>] [<field>[.subfield]...]

aliases: v, info, show

通过以上命令来看看 unused-npm-names 包:

```npm view unused-npm-names
# 或者
npm info unused-npm-names
```

会输出:


{ name: 'unused-npm-names',
'dist-tags': { latest: '1.1.1' },
versions: [ '1.0.0', '1.0.1', '1.1.0', '1.1.1' ],
time:
{ created: '2018-09-07T02:53:05.277Z',
'1.0.0': '2018-09-07T02:53:05.439Z',
modified: '2018-09-07T03:44:06.363Z',
'1.0.1': '2018-09-07T03:07:46.542Z',
'1.1.0': '2018-09-07T03:35:40.221Z',
'1.1.1': '2018-09-07T03:44:03.534Z' },
maintainers: [ 'pjy &lt;731401082@qq.com&gt;' ],
description: 'Find unused npm names',
homepage: 'https://github.com/PengJiyuan/unused-npm-names#readme',
keywords: [ 'npm', 'names', 'unused', 'find' ],
repository:
{ type: 'git',
url: 'git+https://github.com/PengJiyuan/unused-npm-names.git' },
author: 'PengJiyuan',
bugs:
{ url: 'https://github.com/PengJiyuan/unused-npm-names/issues' },
license: 'MIT',
readmeFilename: 'README.md',
version: '1.1.1',
main: 'index.js',
bin: { unn: 'cli.js' },
scripts: { test: 'echo "Error: no test specified" &amp;&amp; exit 1' },
dependencies: { axios: '^0.18.0', chalk: '^2.4.1', commander: '^2.17.1' },
gitHead: '818611db1c2baeb589cb3f639559ab6afc9f8e8f',
dist:
{ integrity: 'sha512-t9bCfY3qbeVY54QC6Cznn3YhM0jq6HX0fE0r5TMAq1IOzu+NQ/caA8tfj62pZtDuZKb9R29ne7UyPB+4zAAplw==',
shasum: '0b7c162f7656c0d74868bf567713150488f8c473',
tarball: 'https://registry.npmjs.org/unused-npm-names/-/unused-npm-names-1.1.1.tgz',
fileCount: 5,
unpackedSize: 4544,
'npm-signature': '-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbkfQDCRA9TVsSAnZWagAAwS4QAKFC1MnosxmJEws07U4O\ngfUPLP04ZLZqtW6nuB/29A72DE1+bh/TGsir83r/sYf1TAPSLOCRd3Nrky3A\n7+umUUOl5zGU5WyG86Fo2XOl5cYgXXWXU6LcZufG/cwM3Xi9MUfxnT7zCEWt\nQPAE8Oh9UhkWCnvFMBA6M6knqK9K08nQf0Ke55UoiuX+OqF8BUlNw8LqEwrI\nMTW8hpjKqsAdo3JhBu0ZkrfTRMq7cTawfjAg+qDs4SSTuWD9OJ9d/2y4OC/p\nX6+3I+Et+SqFJxjGDBounjF1GYYiH3dQPRN8UWL1p9Ypu6YsiZ7l8dp6RH15\nHFUv6lsCmZvhkKc1zO1pY67xUOA9VbLjhXtObwopFvCIehlv3cCw5FMwoa7x\nz+tou0J4II6n68cG6IfTt+9odi9abj7M2YxStW32Miu3efhpXiw2PpX3HWOW\njkY7IQryyxJbQIdKHJqJ59fADHLxpdmr6WADYWt8mKI+9TK9onpSgFgX4udw\ng7fXN3z/L6i7yY+0fvvX/b0jjVzVFNP5kFnUBSnWk/Hjm+h96QS+0xfRCRNv\n5CmVT2kbxYNAdFsFFoNCqHqE+uQoMrSwBw1SIJdybWjs84QrLOrDFjhKypev\nl6bzrgcyE0VWYY1A+zdyquL1cQ+xEJacsfN5NbicxTZhDU0enAtcxhKSe7bz\nJ9CP\r\n=t8xy\r\n-----END PGP SIGNATURE-----\r\n' },
directories: {} }

这样的输出太长了,我们可以只看 unused-npm-names 最近的版本号:

```npm view unused-npm-names version
```

会输出:


1.1.1

当然,如果这个包不存在的话,就会报 404 的错误,我们也就知道这个包名是否被占用了。

写个命令行工具

上面的方式是可以得到我们想要的结果,可是如果我想从一批名字中选一个可用的,就没有那么方便了,就要一个一个试了。

如果有一个工具可以像这样使用:

```unn react react-router react-dom react-pp react-fdasf
```

能一步鉴别所有的包,那就太方便了。

所以,我们一步一步来看一下应该怎么实现这个功能。

一、看npm如何做的

我们通过 npm view 可以查看一个包的信息,那么在走这个命令的时候,npm 肯定是发了一个请求去拿到的这个包的数据,那么我们怎么知道 npm 发的什么请求呢?

```# 加 --verbose 后缀来看详细的输出
npm view unused-npm-names --verbose
```

会输出:


... npm http request GET https://registry.npmjs.org/unused-npm-names ... npm info ok

我们在其中发现,npm 发了个 GET 请求,请求的url是 https://registry.npmjs.org/unused-npm-names

哦,那知道了,我们可以请求 https://registry.npmjs.org/${packageName} 来获取名为 packageName 的包信息。当然,在npm的官方仓库也能找到相关api的用法:package-metadata。

二、开始写工具

之前有一篇文章,讲了怎么写一个命令行工具,见这里:手把手教你写命令行工具。这篇文章就不从怎么从零开始构建一个命令行工具开始了,我们直接来代码:

文件目录大概是这样:


unused-npm-names
├── node_modules
├── package.json
├── cli.js (bin)
└── index.js (main)

package.json:


{
"name": "unused-npm-names",
"version": "1.0.0",
"description": "Find unused npm names",
"main": "index.js",
"bin": {
"unn": "cli.js"
},
"scripts": {
"test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
},
"license": "MIT",
"dependencies": {
"axios": "^0.18.0",
"chalk": "^2.4.1",
"commander": "^2.17.1"
}
}

通过 package.json 中设置 bin 字段,我们将命令的名字设置为 unn,比较简短,方便实用。

我们把查询的主逻辑放到 index.js 中,把命令行逻辑放到 cli.js 中,这样的话我们既可以通过 cli 的方式去使用,也可以通过 require 的方式在 nodejs 脚本中使用。


// index.js
const axios = require('axios'); // 用于发送 http 请求
const chalk = require('chalk'); // 终端输出带颜色的文本

// search方法的参数是一个数组,存放着需要查询的包的名字
// 比如我们要查询 react和react-dom,那么search(['react', 'react-dom'])
function search(pkgs = []) {
if (!Array.isArray(pkgs)) {
throw 'Param should be an array.';
}

console.log();
pkgs.forEach((pkg) =&gt; {
axios.get(`https://registry.npmjs.org/${pkg}`)
.then((res) =&gt; {
// 如果请求成功,说明包存在,那么名字被占用。
console.log(`${chalk.cyan(pkg)}: ${chalk.red('Used ❌')}`);
})
.catch((err) =&gt; {
// 如果请求失败,并且是因为404报错,那么证明包不存在,名字可用。
if (err.stack &amp;&amp; /Request failed with status code 404/.test(err.stack)) {
console.log(`${chalk.cyan(pkg)}: ${chalk.green('Unused ✅')}`);
} else {
// 处理未知情况
console.log(`${chalk.cyan(pkg)}: ${chalk.gray('Unknown

怎么样写一个能告诉你npm包名字是否被占用的工具的相关教程结束。

《怎么样写一个能告诉你npm包名字是否被占用的工具.doc》

下载本文的Word格式文档,以方便收藏与打印。

  • JavaScript常用工具函数库汇总
    JavaScript常用工具函数库汇总

    对象或数组的深拷贝 /** * 对象或数组的深拷贝 * @param {*} cloneObj 被克隆的对象 * @param {*} targetObj 克隆的目标对象 * @param {*} isOverride 若属性重复,是否覆盖被克隆对象的属性 */ function d...

    2024-03-14编程代码,,
  • Sourcetrail 代码分析工具的使用
    Sourcetrail 代码分析工具的使用

    Sourcetrail 概述 Sourcetrail 是一个代码分析工具,它旨在帮助开发人员理解和导航复杂的代码库。它可以创建代码库的可视化图形,显示代码中的类、函数、变量、依赖关系等信息,从而帮助开发人员更好地理解代码结...

    2023-08-16编程代码,,
  • 【工具】-Misc-Python-dsstore
    【工具】-Misc-Python-dsstore

    介绍 这是一个.DS_Store解析工具。 什么是.DS_Store .DS_Store 是 Desktop Services Store 的缩写,是 macOS 操作系统上的一个不可见文件,只要您使用“Finder”查看文件夹,它就会自动创建。然后,该文件将随文件...

    2023-08-05编程代码,,
  • 【工具】-Reverse-DIE(Detect-It-Easy)
    【工具】-Reverse-DIE(Detect-It-Easy)

    关于 Detect It Easy,或缩写为“DIE”是一个用于确定文件类型的程序。Detect It Easy 是一个多功能的 PE 检测工具,基于 QT 平台编写,主要用于 PE 是否加壳侦测。 “DIE”是一个跨平台的应用程序,除了 Windows 版...

    2023-08-05编程代码,,
  • 一篇文章告诉你什么是Java内存模型
    一篇文章告诉你什么是Java内存模型

    在上篇 并发编程Bug起源:可见性、有序性和原子性问题,介绍了操作系统为了提示运行速度,做了各种优化,同时也带来数据的并发问题, 定义 在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题。比如...

    2023-07-31编程代码,,
  • JavaFx 生成二维码工具类封装
    JavaFx 生成二维码工具类封装

    原文地址: JavaFx 生成二维码工具类封装 - Stars-One的杂货小窝 之前星之音乐下载器有需要生成二维码功能,当时用的是一个开源库来实现的,但是没过多久,发现那个库依赖太多,有个http-client的依赖,把软件都搞大了...

    2023-07-31编程代码,,
  • python轻量级性能工具-Locust
    python轻量级性能工具-Locust

    Locust基于python的协程机制,打破了线程进程的限制,可以能够在一台测试机上跑高并发 性能测试基础   1.快慢:衡量系统的处理效率:响应时间   2.多少:衡量系统的处理能力:单位时间内能处理多少个事务(tp...

    2023-07-29编程代码,,
  • 前端工业化工具Gulp初体验
    前端工业化工具Gulp初体验

    1. 全局安装 gulp: npm install --global gulp 2.在项目目录下,用以下命令创建一个基本的package.json文件 npm init 3.安装Gulp npm install --save-dev gulp 4.安装所需插件如: npm install gulp-contrib-ugl...

    2023-07-29编程代码,,