node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)

简介: node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)

通常在开发脚手架时,才会需要注册和配置命令,所以我们先来创建一个脚手架

创建脚手架 mycli

  1. 新建文件夹 commanderDemo
  2. 在 commanderDemo文件夹中打开命令行,执行
npm init -y

  1. 在 commanderDemo文件夹中创建文件 index.js,内容为:
#!/usr/bin/env node
console.log("成功运行 mycli");

重要提醒:脚手架的核心原理

此处必须在第一行添加 #!/usr/bin/env node ,因为它会去找操作系统的环境变量 node 对应的 node.exe 来执行 index.js

  1. 在package.json中添加命令 mycli 到文件index.js 的映射
"bin": {
    "mycli": "./index.js"
  },
  1. 执行命令,创建软链接
npm link

此时在系统安装的 node 源文件的 bin 文件夹中会生成命令 mycli软链接,当在命令行执行 mycli 时,node 便会从该软链接中找到并执行 index.js

  1. 执行命令 mycli
mycli

脚手架创建成功!

安装 commander

cnpm install commander

无 cnpm 的朋友先执行 npm i cnpm

导入并实例化 commander

import { Command } from "commander";
// 实例化一个 commander
const program = new Command();

为了支持 import,记得在 package.json 中添加

"type": "module",

注册命令

// 给实例 program 注册并配置命令
program
  .command("init") // 注册命令,参数 init 为自定义的命令名称
  .description("初始化") // 描述命令的描述,在帮助信息中会展示
  // 命令的具体行为(执行的代码)
  .action((params, options, cmd) => {
    console.log("---- 开始对 mycli 进行初始化 ----");

    // 自定义初始化需执行的代码,此范例为打印当前目录
    console.log("当前目录为:" + process.cwd());

    console.log("---- 完成了 mycli 的初始化 ----");
  });

// 解析 commander
program.parse();

此时便可执行命令

mycli init

同时,还会自动注册 help 命令,执行 mycli helpmycli -hmycli --help 都能看到脚手架 mycli 可执行的所有命令以及命令的描述。

给命令设置别名、添加参数、添加配置

program
  .command("split") // 注册命令
  .alias("sp") // 命令的别名
  .description("将字符串分割成数组") // 对命令功能的描述
  .option("-s, --separator <char>", "分割符", ",") // 命令的配置信息,最后的 ","为默认值
  .argument("<string>", "被分割的字符串") // 命令的参数
  .action((params, options, cmd) => {
    // action中函数的第一个参数为命令的参数,此范例中params是一个字符串
    console.log(params);
    // action中函数的第二个参数为命令的配置信息
    // 此范例中 options 是一个对象,有一个属性 separator, 属性值为分割符
    console.log(options);
    // action中函数的第三个参数为命令对象自己
    // console.log(cmd);

    // 命令的功能代码为分割字符串,打印最终分割成的数组
    console.log(params.split(options.separator));
  });

// 解析 commander
program.parse();

此时便可执行命令

mycli split --separator=/ a/b/c

或(用空格代替 = )

mycli split --separator / a/b/c

此命令的功能是:将字符串 a/b/c 按分割符 / 分割为数组

因给命令设置了别名 sp,所以命令可简写为

mycli sp --separator=/ a/b/c

命令的配置 -s--separator 的缩写,所以命令还简写为(-s 后紧跟 / )

mycli sp -s/ a/b/c

或(-s 后有空格再 / )

mycli sp -s / a/b/c

再试下

mycli sp 'a,b,c'

可见默认的分割符为设置的 ,

从 help 中也能了解命令配置和参数的写法

  • 命令使用 split 或 sp
  • options 命令的配置被 [] 包裹,说明命令的配置信息都是可选的
  • 最后的 string 被 <> 包裹,则是一个必传的参数,数据类型为 string

添加多种参数

共三种参数

  • 必要参数——必须传的参数,用 <>包裹
  • 可选参数——可传,可不传的参数,用 []包裹
  • 可变参数—— 数量没有限制,可动态变化的参数,必须为最后一项参数,通过数组的形式传入

argument() 的语法为:

argument(参数字段和类型定义,参数描述,参数默认值)

省略参数描述和默认值,可以将多个参数写在一个argument中,如

program.arguments('<username> <password>');
 
program
  .command("login")
  .description("登录")
  .argument("<username>", "用户名") // 必要参数
  .argument("[password]", "密码", "123456") // 可选参数(“123456”为默认值)
  .argument("[permissions...]", "权限") // 可变参数
  .action((username, password, permissions) => {
    console.log("username:", username);
    console.log("password:", password);
    permissions.forEach((item) => {
      console.log("权限 %s", item);
    });
  });

不传密码时,默认密码为 123456

传密码时,则用传入的密码

传入更多参数,则都是可变参数,一起以数组形式传入

自定义默认命令

默认的命令是 help

在command() 中添加参数 { isDefault: true }

program
  .command("init", { isDefault: true }) // 注册默认命令
  .description("初始化") // 描述命令的描述,在帮助信息中会展示
  // 命令的具体行为(执行的代码)
  .action((params, options, cmd) => {
    console.log("---- 开始对 mycli 进行初始化 ----");

    // 自定义初始化需执行的代码,此范例为打印当前目录
    console.log("当前目录为:" + process.cwd());

    console.log("---- 完成了 mycli 的初始化 ----");
  });

将配置设置为必填 requiredOption

program
  .command("split") // 注册命令
  .description("将字符串分割成数组") // 对命令功能的描述
  .requiredOption("-s, --separator <char>", "分割符") // 必填的命令配置信息
  .argument("<string>", "被分割的字符串") // 命令的参数
  // 命令的具体行为(执行的代码)
  .action((params, options, cmd) => {
    // 命令的功能代码为分割字符串,打印最终分割成的数组
    console.log(params.split(options.separator));
  });

若执行配置缺失的命令会报错,加上配置就正常了。

获取版本号的实现

从 package.json 中可以取到版本号

import pkg from "./package.json" assert { type: "json" };
// version() 完成版本号指令的注册和配置
program.version(pkg.version);

// 解析 commander
program.parse();

执行

mycli --version

mycli -V

都会打印版本号

自定义 help 信息

默认的 help 信息如下:

  • 通过 Usage 可以修改默认help 信息的 Usage 说明。
program.usage("<命令> [配置]");

  • 通过 helpInformation 可以完全自定义 help 信息
program.helpInformation = function () {
  return "《mycli使用说明》\n命令列表\ninit —— 初始化\nsplit —— 字符串分割";
};

更多功能

可参考官方文档

https://github.com/tj/commander.js/blob/HEAD/Readme_zh-CN.md  

目录
相关文章
|
9月前
|
编解码 JavaScript 前端开发
如何在网页播放英文的m3u8文件(基于Javascript搭建的在线网页工具)
什么是m3u8?又该如何在网页中高效、便捷地播放英文的m3u8文件呢?今天这篇文章就带你一起了解,并推荐一种基于Javascript搭建的在线网页工具,让你轻松解决播放问题。
2766 0
|
11月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
704 159
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
641 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
12月前
|
人工智能 监控 前端开发
基于 Next.js 的书法字体生成工具架构设计与 SSR 优化实践
本项目是一款书法字体生成工具,采用 Next.js 14(App Router)与 Tailwind CSS 构建前端,阿里云 Serverless 部署后端。通过混合渲染策略(SSG/SSR/CSR)、Web Worker 异步计算及 CDN 字体分片加载优化性能。服务端借助阿里云函数计算处理计算密集型任务,将平均耗时从 1200ms 降至 280ms,支持 1000+ QPS。动态路由与 ARMS 监控提升工程化水平,未来计划引入 WebGPU 和 AI 字体风格迁移技术,进一步优化用户体验。
|
存储 资源调度 JavaScript
npm、cnpm 和 pnpm 是三种常用的 Node.js 包管理工具
npm、cnpm 和 pnpm 是三种常用的 Node.js 包管理工具。npm 是官方默认的包管理器,提供依赖管理、安装和更新等功能;cnpm 是由阿里巴巴开发的 npm 镜像,专为中国大陆用户优化,解决下载速度慢的问题;pnpm 通过硬链接技术提高安装速度并节省磁盘空间,特别适合磁盘资源紧张的环境。三者命令类似,但各有特色,开发者可根据需求选择合适的工具。
2199 5
|
JavaScript 前端开发 开发工具
从零开始使用node.js制作一个脚手架
本文介绍了如何从零开始使用Node.js制作一个项目脚手架,涵盖了脚手架的基本概念、所需准备的第三方库、项目结构的初始化、命令注册、项目创建流程及用户交互设计等内容。通过实例演示了如何利用commander、inquirer等库实现命令行工具的开发,最终完成了一个能够根据用户选择自动创建Vue或React项目的脚手架。
438 1
从零开始使用node.js制作一个脚手架
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
1060 10
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1838 9