Node CLI工具原理解析(2)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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


相关文章
|
7天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
26 3
|
15天前
|
存储 JavaScript 前端开发
Node.js 常用工具
10月更文挑战第6天
12 2
|
16天前
|
开发框架 缓存 前端开发
electron-builder 解析:你了解其背后的构建原理吗?
本文首发于微信公众号“前端徐徐”,详细解析了 electron-builder 的工作原理。electron-builder 是一个专为整合前端项目与 Electron 应用的打包工具,负责管理依赖、生成配置文件及多平台构建。文章介绍了前端项目的构建流程、配置信息收集、依赖处理、asar 打包、附加资源准备、Electron 打包、代码签名、资源压缩、卸载程序生成、安装程序生成及最终安装包输出等环节。通过剖析 electron-builder 的原理,帮助开发者更好地理解和掌握跨端桌面应用的构建流程。
44 2
|
8天前
|
存储 前端开发 JavaScript
前端模块化打包工具的深度解析
【10月更文挑战第13天】前端模块化打包工具的深度解析
|
9天前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
33 0
|
9天前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
37 0
|
9天前
|
缓存 资源调度 JavaScript
npx与npm的差异解析,以及包管理器yarn与Node版本管理工具nvm的使用方法详解
npx与npm的差异解析,以及包管理器yarn与Node版本管理工具nvm的使用方法详解
19 0
|
9天前
|
Web App开发 JavaScript 前端开发
Node.js:JavaScript世界的全能工具
Node.js:JavaScript世界的全能工具
|
12天前
|
存储 缓存 数据处理
深度解析:Hologres分布式存储引擎设计原理及其优化策略
【10月更文挑战第9天】在大数据时代,数据的规模和复杂性不断增加,这对数据库系统提出了更高的要求。传统的单机数据库难以应对海量数据处理的需求,而分布式数据库通过水平扩展提供了更好的解决方案。阿里云推出的Hologres是一个实时交互式分析服务,它结合了OLAP(在线分析处理)与OLTP(在线事务处理)的优势,能够在大规模数据集上提供低延迟的数据查询能力。本文将深入探讨Hologres分布式存储引擎的设计原理,并介绍一些关键的优化策略。
52 0
|
14天前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
17 0

推荐镜像

更多