Node CLI工具原理解析(2)

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 使用npm install安装依赖,会根据bin中的描述,创建1个command到exec/filepath.js的软链软链所在目录区别于是否是global安装这个目录可以通过npm bin指令查看

Node CLI工具原理解析(1):https://developer.aliyun.com/article/1394831?spm=a2c6h.13148508.setting.16.55964f0ez7IHhI

使用npm install安装依赖,会根据bin中的描述,创建1个commandexec/filepath.js的软链

软链所在目录区别于是否是global安装

这个目录可以通过npm bin指令查看

image.png

全局路径和前面使用 which npm获取的一致,当前项目的路径即在node_modules/.bin

如果是本地开发CLI时,可以使用npm link指令根据bin描述信息,自动创建软链到npm bin所示的目录中,通过-g参数区别是否是全局

# 项目工作目录下执行
npm link
# or
npm link -g

命令行参数

前面主要都在围绕命令展开介绍。要实现工具的丰富功能离不开参数的组合,本小节就介绍下Node里如何处理CommandOptions

我们可以通过process.argv方法获取到运行时的 命令行入参

js

复制代码

console.log(process.argv);

image.png

各位置参数释义

  • 0:Node可执行文件所在路径
  • 1:执行的js脚本路径
  • >1:用户运行时传入的参数

通过这些参数,就能区分出用户要执行的行为

当然在实际开发中大部分场景下,都会使用第三方库去解析命令行参数,来降低代码的复杂度,提高可读性。

下面是一个使用commander的例子

#!/usr/bin/env node
const { Command } = require('commander')
const pkg = require('./package.json')
const program = new Command()
program.version(pkg.version)
program
    .command('hello [paths...]')
    .description('hello world demo')
    .alias('h')
    .option('-p, --pkg <path>', 'set package.json path')
    .action((paths, options) => {
        console.log('😄😄😄');
        console.log(paths);
        console.log(options);
    })
program.parse(process.argv)

image.png

可以看到使用第三方库辅助处理参数,已经非常完善了

除了老牌的commander之外还有其它的相同作用的库,这里就不展开介绍了。

彩色打印

这个大家都不陌生了,大部分CLI打印结果都是五颜六色

比如下面的例子

echo 'hello  world'

image.png

相关知识点是ANSI Escape code,这里就不展开说明了。

实际开发中,也很少直接写这种原始的数值。通常会使用chalk这个库辅助,比如上面这个颜色对应代码如下。

const Chalk = require('chalk');
console.log(Chalk.cyan('hello world'));

渐变色打印就常用gradient-string这个库

const gradient = require('gradient-string');
console.log(gradient('cyan', 'pink')('Hello world!'));

image.png

简单两行代码效果就出来了

终端交互

在使用 例如Vue CLI 此类工具进行项目初始化的时候,会有输入单选多选等交互操作。

相关原理涉及内容太“抽象”,篇幅较大,后续通俗精简了再做分享

常用的第三方库就是inquirer这个库

下面是简单checkbox示例

const inquirer = require('inquirer');
inquirer
    .prompt([
        {
            type: 'checkbox',
            message: '水果选择',
            name: 'fruits',
            choices: [
                {
                    name: '🍌',
                },
                {
                    name: '🍉',
                },
                {
                    name: '🍇',
                },
            ]
        },
    ])
    .then((answers) => {
        console.log(answers);
    });

image.png

最后

本文没有阐述非常深奥的知识点,只涉及日常的一些基操,有助于读者了解Node CLI 背后的工作原理。

如内容有不妥之处,可以评论区交流;有感兴趣希望深入了解的知识点也可评论区@。

完整示例代码移步=>Github


相关文章
|
16天前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
20天前
|
JSON 文字识别 数据格式
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
|
11天前
|
Unix Linux Shell
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
|
17天前
|
存储 Java 调度
解析Java中的线程池的工作原理
解析Java中的线程池的工作原理
|
21天前
|
JavaScript 数据安全/隐私保护
node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)
node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)
22 0
|
21天前
|
JavaScript 数据安全/隐私保护 索引
node.js 命令行交互工具(最新版) inquirer.js 实用教程
node.js 命令行交互工具(最新版) inquirer.js 实用教程
18 0
|
21天前
|
Ubuntu 网络协议
【ubuntu】DNS设置工具resolvectl安装教程
请注意,这些步骤可能会根据你的Ubuntu版本和配置有所不同。如果你在安装过程中遇到问题,可能需要查阅更具体的文档或者寻求专业的技术支持。
22 0
|
22天前
|
开发工具 数据安全/隐私保护 git
为了方便项目打包,我用Node写了个git-tag工具
为了方便项目打包,我用Node写了个git-tag工具
22 0
|
23天前
|
Cloud Native Java 开发者
深入解析Spring Framework的核心设计原理
深入解析Spring Framework的核心设计原理
|
27天前
|
存储 数据库 开发者
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
Elasticsearch中的三种分页策略深度解析:原理、使用及对比

推荐镜像

更多