专栏首页前端全栈开发者【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)

【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)

我们每天都使用CLI程序(例如Terminal,cmd,Powershell等)进行软件开发。你使用的每个工具本质上都是其他软件工程师的产品,我们也可以制作自己的CLI工具。

从零开始的简单CLI,让我们开始吧!

首先,让我们制作一个简单的CLI工具,该工具会打印“ HelloWord”

要制作CLI,您需要制作两个文件

  • package.json:将设置和配置指定入口
  • index.js:根据CLI命令的可执行文件

添加Package.json 文件

// package.json
{
  "name": "my-cli",
  "version": "0.0.1",
  "description": "nodejs cli program",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Dunizb",
  "license": "ISC"
}

在package.json中,指定有关当前CLI程序的元数据, nameversiondescriptionauthor等。

创建 index.js 可执行文件

// index.js
#! /usr/bin/env node
console.log('Hello CLI');

那么,第一句话是什么意思?

Linux和基于Unix的操作系统(例如Mac)中,#! / usr / bin / env node 不仅仅是一个注释。它使用在 /usr/bin/env 中注册的node命令来运行文件。

但是,在Windows中,这只是一个注释。

添加bin属性

我们添加 bin 属性来实际运行 index.js 文件

// package.json
{
  "name": "my-cli",
  "version": "0.0.1",
  ...
  ...
  "license": "ISC",
  "bin": {
    "cli": "./index.js"
  }
}

bin 属性具有可执行文件,cli 命令要求运行 index.js 文件。

运行CLI

最后,让我们运行CLI在控制台上打印Hello CLI。通过运行 npm i -g 在package.json中安装配置。

下次你在控制台上运行 npm i -g,您获得了 updated 1 package...,而不是 added 1 package ...

然后运行 cli 命令。终于, Hello CLI!

你可能需要在Mac和Linux环境中附加 sudo 命令(即 sudo cli),没有 node_modules 文件夹,因为你没有安装依赖项。

CLI中的Process.argv

// index.js
#! /usr/bin/env node
console.log('Hello CLI', process.argv);

你可以使用 process.argv 在命令中找到选项,选项以数组形式显示。

你不需要在每次更新 index.js 代码时再次运行 npm i -g,因为你已经将 package.jsonbin 属性连接到 cli 命令和 index.js 文件。因此,每次调用 cli 命令时,都可以执行 index.js 文件(它不是来自缓存的,因此您可以运行新的更新内容)。

在终端中运行命令:

cli one two three four

结果

数组中的前两个元素nodecli 命令的路径。(对于Windows系统,它可能会打印出不同的输出)输出可能会因您的计算机设置和环境而异(这取决于您在计算机上安装nodecli命令的位置)。

此外,one two three four 表示为数组类型

其次,通过“用户输入”与用户交互的简单CLI工具

使用称为readline的本机Node模块从用户那里获取输入。

// index.js
#! /usr/bin/env node
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.question("你今天好吗(快乐, 悲伤)?", (answer) => {
  if(answer === "快乐") {
    console.log("听你这么说我很高兴");
  } else if (answer === "悲伤") {
    console.log("希望你明天感觉好些")
  } else {
    console.log("你是快乐还是悲伤?");
  }
	rl.close();
});

你可以使用 readline 模块中的 createInterface 方法创建 rl 对象。

process.stdinprocess.stdout 是控制台输入和输出流。

readline 模块接受来自用户的输入,rl 对象提问法是向用户提问的一种方法,回调函数具有一个 answer 参数(来自用户的输入),如果所有 I/O(输入和输出)完成,则关闭 rl 对象。

我们是否可以通过再次询问用户在这种情况下是否既不回答“高兴”也不回答“悲伤”来进一步提高CLI ?

再次询问用户时,是否回答错误

#! /usr/bin/env node
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

console.clear();

const answerCallback = (answer) => {
  if (answer === "快乐") {
    console.log("听你这么说我很高兴");
    rl.close();
  } else if (answer === "悲伤") {
    console.log("希望你明天感觉好些");
    rl.close();
  } else {
    console.log("你是快乐还是悲伤?");
    rl.question("你今天好吗(快乐,悲伤)? ", answerCallback);
  }
};

rl.question("你今天好吗(快乐,悲伤)?", answerCallback);

当程序开始使用 console. Clear 时清除控制台,然后使用 rl.question 方法询问用户输入并使用answerCallback 函数获得答案。

如果答案既不是悲伤也不是快乐,请清除控制台,然后递归再次提问,如果答案是悲伤或快乐,关闭输入控制台。

总结

在本文中,我们练习了一种制作简单的CLI工具(要求用户输入)的方法。。


本文首发于微信公众号《前端外文精选》,关注即送大礼包,准能为你节省不少钱!

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.zhangbing.site复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 一统江湖的大前端(6)commander.js + inquirer.js——懒,才是第一生产力

    你没有看错,懒绝壁是第一生产力,技术的进步,很多时候都是因为一些非常聪明的人难以忍受一些(在他们眼里)枯燥重复且低效的东西,从而发明出的东西,无论这些新发明在经...

    大史不说话
  • 最有效、最全的Vue 2.0 学习路线,各个阶段适用

    对于我这种从0.x版本就开始体验 vuejs 的人来说,当然不算难,那时候没各种脚手架和复杂搭配,仅仅是一个mvvm的解决方案库而已,解决了jq带来的繁琐操作d...

    一墨编程学习
  • HTML页面生成器:使用JavaScript和Node创建CLI

    在上一篇文章:【实战】从零开始使用JavaScript制作自己的命令行(CLI工具) 中我介绍了如何从零开始制作CLI,那么现在我们更进一步。在这篇文章中,我们...

    张张
  • [Vue 牛刀小试]:第十六章 - 针对传统后端开发人员的前端项目框架搭建

      在之前学习 Vue 基础知识点的文章中,我们还是采用传统的方式,通过在 html 页面上引用 vue.js 这个文件,从而将 Vue 引入到我们的项目开发中...

    程序员宇说
  • 2018-07-04 .NET及相关开发资讯速递

    2.Injecting Services to ASP.NET Core Controller Actions

    Rector
  • VUE+ElementUI后台管理项目经验与技巧分享

    用vue+elementUI开发项目成了越来越多中小企业的首选,特别是开发各种管理平台和移动端项目,如何从零开始到系统构建呢?以下是我的一些经验和技巧;

    coder_koala
  • 深入认识 vue-cli:能做的不仅仅是初始化 vue 工程

    相信对于大部分使用过VueJS的同学来说, 是他们非常熟悉的一个工具。借助 ,我们通过非常简单的问答形式,方便地初始化一个vue工程,完全不需要担心繁复的web...

    企鹅号小编
  • 新手向:Vue 2.0 的建议学习顺序

    时见疏星
  • 这些node开源工具你值得拥有(上)

    通过阅读 awesome-nodejs 库的收录,我抽取其中一些应用场景比较多的分类,通过分类涉及的应用场景跟大家分享工具

    树酱
  • webpack实战——打包第一个应用

    作为前端开发者,我们以前在浏览器中运行 JavaScript ,会引用一些脚本来存放每个功能;此解决方案很难扩展,因为加载太多脚本会导致网络瓶颈;亦或使用一个包...

    流眸
  • oeasy 教您玩转 linux 010400 总结 summary

    oeasy
  • 《HelloGitHub》第 66 期

    这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短时间内感受到开源...

    冬夜先生
  • Polyaxon食谱 | 大规模深度学习应用训练平台使用笔记,让代码在集群上飞快跑起来

    这是来自官方文档的介绍。就我理解而言,polyaxon依靠k8s部署在集群上,可以自主分配需要集群资源,创建简单,可重复,可移植的部署,依靠docker定制运行...

    linhw
  • 大前端的自动化工厂(1)——Yeoman

    Yeoman是现代化前端项目的脚手架工具,用于生成包含指定框架结构的工程化目录结构。它是整个前端自动化工厂的第一站。

    大史不说话
  • 是时候拥有一个你自己的命令行工具了

    本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具。

    SH的全栈笔记

扫码关注腾讯云开发者

领取腾讯云代金券