Node CLI工具原理解析(2)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 使用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


相关文章
|
29天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
15天前
|
安全 程序员 API
|
9天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
16天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
31 1
|
22天前
|
数据采集 存储 编解码
一份简明的 Base64 原理解析
Base64 编码器的原理,其实很简单,花一点点时间学会它,你就又消除了一个知识盲点。
60 3
|
3天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
3天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
11 0
|
19天前
|
供应链 安全 分布式数据库
探索区块链技术:从原理到应用的全面解析
【10月更文挑战第22天】 本文旨在深入浅出地探讨区块链技术,一种近年来引起广泛关注的分布式账本技术。我们将从区块链的基本概念入手,逐步深入到其工作原理、关键技术特点以及在金融、供应链管理等多个领域的实际应用案例。通过这篇文章,读者不仅能够理解区块链技术的核心价值和潜力,还能获得关于如何评估和选择适合自己需求的区块链解决方案的实用建议。
37 0
|
29天前
|
存储 前端开发 JavaScript
前端模块化打包工具的深度解析
【10月更文挑战第13天】前端模块化打包工具的深度解析
|
30天前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
87 0

推荐镜像

更多