node.js命令行教程图文详解

本文先介绍原生的node.js实现命令行交互,了解原生的api,然后通过commander.js和inquirer.js实现一个完整的交互命令行工具。

项目地址

process (进程)

process对象是一个全局变量,它提供了当前node.js进程的信息并对其控制。因为其是一个全局变量所以无需在文件中引入。

需要用到的几个api

  • process.argv
  • process.cwd()
  • process.stdin
  • process.stdout
  • process.stdin.resume()
  • process.argv

process.argv

属性返回一个数组。数组的第一个值是process.execPath,第二个是正在执行的JavaScript的文件路径,其余参数为其它命令参数,这是我们来自定义命令的关键。

示例

新建argv.js

// argv.js
console.log(process.argv)

执行node命令node argv.js

node argv.js --name zhu
## 输出
[ '/usr/local/bin/node', ## 执行当前脚本的Node二进制文件的绝对路径
 '/Users/zhuhuilong/Node/Book/argv.js', ## 文件的绝对路径
 '--name', ## 其余参数
 'zhu' ]

接收自定义的命令参数进行处理输出

// argv.js
console.log(process.argv)

let argvs = process.argv

let param = argvs.splice(2)
if(param[0] && param[0] == '--name'){
 if(param[1]){
 console.log(`hello ${param[1]}`)
 }else{
 console.log('请输入name')
 }
}

运行argv.js

node argv.js --name zhu
## 输出
[ '/usr/local/bin/node',
 '/Users/zhuhuilong/Node/Book/argv.js',
 '--name',
 'zhu' ]
hello zhu
param [ '--name', 'zhu' ]

process.stdin与process.stdout

process.stdin(标准输入)

process.stdin 属性返回连接到 stdin (fd 0) 的流。 它是一个 net.Socket 流(也就是双工流),除非 fd 0 指向一个文件,在这种情况下它是一个可读流。

process.stdout(标准输出)

process.stdout 属性返回连接到 stdout (fd 1) 的流。 它是一个 net.Socket 流(也就是双工流),除非 fd 1 指向一个文件,在这种情况下它是一个可写流。

process.stdin.resume()

  • 一个指向 标准输入流(stdin) 的可读流(Readable Stream)。标准输入流默认是暂停 (pause) 的,所以必须要调用 process.stdin.resume() 来恢复 (resume) 接收。
  • 作为流,process.stdin可以在旧模式下使用。为了兼容node v0.10以前的版本。在旧模式喜爱使用stdin必须调用process.stdin.resume()。注意如果调用了process.stdin.resume() stdin将转为旧模式。

通俗来讲就是控制台等待我们输入内容不退出进程,对输入输出进行交互。

新建inputout.js

// inputout.js
process.stdin.setEncoding('utf8')

let argvs = process.argv

let param = argvs.splice(2)
if (param[0] && param[0] == '--name') {
 if (param[1]) {
 console.log(`hello ${param[1]}`)
 } else {
 process.stdout.write(`请输入name:`)
 process.stdin.resume()
 process.stdin.on('data', chunk => {
  if (!!chunk.replace(/[\r\n]/g, '')) {
  process.stdout.write(`你输入的name是: ${chunk}`)
  process.stdin.emit('end')
  } else {
  process.stdout.write(`请输入name:`)
  }
 })
 }
}

process.stdin.on('end', () => {
 process.stdout.write('结束\n')
})

>执行node inputout.js --name

备注

在新版本node模式下可以使用process.stdin.on("readable",()=>{})代替process.stdin.resume()恢复输入流接收。

示例:

process.stdin.on("readable", () => {
 var chunk = process.stdin.read();
 console.log(typeof(chunk))
 if (chunk !==null) {
 process.stdout.write(`data: ${chunk}`);
 process.stdin.emit("end");
 }
});

process.stdin.on("end", () => {
 process.stdout.write("end");
});

从上面的示例我们可以拿到process.argv参数对其进行处理交互,但如果要实现更复杂的命令交互,使用上面的方法会很吃力。下面我们使用commander.js和inquirer来实现一个完整的node命令行工具(创建项目模版)。

commander.js

node.js命令行界面的完整解决方案,受Ruby Commander启发。

commander.js的API简述

program.version() 声明版本

const program = require('commander')
const pkg = require('../package.json')
program.version(pkg.version)

Options 解析

使用.option()方法定义commander的选项options,也可以作为选项的文档。

var program = require('commander');

program
 .version('0.1.0')
 .option('-p, --peppers', 'Add peppers')
 .option('-P, --pineapple', 'Add pineapple')
 .option('-b, --bbq-sauce', 'Add bbq sauce')
 .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
 .parse(process.argv);

console.log('you ordered a pizza with:');
if (program.peppers) console.log(' - peppers');
if (program.pineapple) console.log(' - pineapple');
if (program.bbqSauce) console.log(' - bbq');
console.log(' - %s cheese', program.cheese);

添加自定义命令program.command()

var program = require('commander');

program
 .command('rm <dir>') //<>必选参数,如果是[]则是可选参数
 .option('-r, --recursive', 'Remove recursively')
 .action(function (dir, cmd) {
 console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
 })

program.parse(process.argv)

// command()可变参数
/** 命令command有且只有最后一个参数可变不固定的。 要使参数变量可变,必须将...附加到参数名称。**/
program
 .version('0.1.0')
 .command('rmdir <dir> [otherDirs...]')
 .action(function (dir, otherDirs) {
 console.log('rmdir %s', dir);
 if (otherDirs) {
  otherDirs.forEach(function (oDir) {
  console.log('rmdir %s', oDir);
  });
 }
 });
program.parse(process.argv);

program.action() 定义命令的回调函数

var program = require("commander");

program
 .command("rm <dir>")
 .option("-r, --recursive", "Remove recursively")
 .option("-f, --force", "remove force")
 .action(function(dir, cmd) {
 // cmd为option参数选项
 //console.log('cmd',cmd)
 if (cmd.recursive) {
  console.log("remove " + dir + " recursively");
 }
 if (cmd.force) {
  console.log("remove " + dir + " forcefully");
 }
 });

program.parse(process.argv);

inquirer.js

Inquirer.js使用NodeJs做的一个通用交互式命令行用户界面的集合。具有常用的控制台交互操作。

由于交互的问题种类不同,inquirer为每个问题提供很多参数:

  • type:表示提问的类型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor;
  • name: 存储当前问题回答的变量;
  • message:问题的描述;
  • default:默认值;
  • choices:列表选项,在某些type下可用,并且包含一个分隔符(separator);
  • validate:对用户的回答进行校验;
  • filter:对用户的回答进行过滤处理,返回处理后的值;
  • transformer:对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;
  • when:根据前面问题的回答,判断当前问题是否需要被回答;
  • pageSize:修改某些type类型下的渲染行数;
  • prefix:修改message默认前缀;
  • suffix:修改message默认后缀。
  • 创建cli.js
const program = require('commander')
const inquirer = require('inquirer')
const fs = require('fs')
const path = require('path')
const pkg = require('../package.json')

const CWD = process.cwd()

const promptList = [
 {
 type: 'list',
 message: '请选择一种模版',
 name: 'template',
 choices: ['vue', 'angular', 'webpack-m-pages'],
 filter: function(val) {
  return val.toLowerCase()
 }
 }
]

program
 .version(pkg.version)
 .command('create <dir>')
 .description('create project template')
 .action(function(dir, cmd) {
 const TEMPLATE_PATH = path.join(CWD, dir)
 if (fs.existsSync(TEMPLATE_PATH)) {
 } else {
  fs.mkdirSync(TEMPLATE_PATH)
 }
 if (dir) {
  inquirer.prompt(promptList).then(anwsers => {
  console.log(anwsers)
  })
 }
 })

program.parse(process.argv)

运行 node cli/cli.js create vue

已经可以运行了,我们自定义一个命名替代每次都执行node

命令为:test-cli create <dir>

1、创建bin文件夹,在bin文件夹下创建index.js文件

#!/usr/bin/env node

require('../cli/cli')

2、修改package.json文件

添加bin选项

"bin": {
 "test-cli": "./bin/index.js"
 },

3、执行npm link (如果没有权限,执行sudo npm link)

4、测试

5、发布 npm publish (如果未登录需先 npm login登录)

6、发布完毕,需npm unlink解除本地的命令映射

npm install -g XXX

总结

以上所述是小编给大家介绍的node.js命令行教程图文详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 浅谈node.js 命令行工具(cli)

    一. 先了解一下package.json 每个项目的根目录都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息,下面是一个比较完整的package.json文件 { "name": "vue-cli", "version": "2.9.3", "description": "A simple CLI for scaffolding Vue.js projec

  • Node.js 使用命令行工具检查更新

    随着 Node.js 的"走红",使用 Node.js 开发命令行工具越来越简单.一个成熟的命令行工具应该从一开始就要考虑好之后的版本更新如何"优雅"的告知用户.最好的方法当然是当用户在终端执行命令时,将相关信息提示给用户. 这篇文章将给出一个易用.高效.可定制的方法.源码在这里: GITHUB ,欢迎大家顺手点赞.接下来我将讲解其实现思路. 使用 我们先简单看看这个 npm 包的使用方法: const updater = require('pkg-updater'

  • Node.js利用Net模块实现多人命令行聊天室的方法

    这篇文章介绍的是Node.js利用Net模块实现命令行式的多人聊天室,下面话不多说,来看看详细的介绍吧. 1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类: Server和Socket类.工厂方法. Server类如下图所示: net.Server类可以用来创建一个TCP或本地服务器,继承了EventEmitter. Socket类如下: net.Socket类一般用创建一个socket客户端或者是ne

  • Node.js命令行/批处理中如何更改Linux用户密码浅析

    前言 本文主要介绍了Node.js命令行/批处理更改Linux用户密码的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 hpasswd 可在批处理文件中批量更改Linux用户的密码. 用法: chpasswd [options] option主要为一些密码加密选项 -c, --crypt-method Use the specified method to encrypt the passwords. The available methods are DES, MD5

  • 详解Node.js如何开发命令行工具

    前言 Node 给前端开发带来了很大的改变,促进了前端开发的自动化,我们可以简化开发工作,然后利用各种工具包生成生产环境.如运行sass src/sass/main.scss dist/css/main.css即可编译 Sass 文件. 在实际的开发过程中,我们可能会有自己的特定需求, 那么我们得学会如何创建一个Node命令行工具. hello world 老规矩第一个程序为hello world.在工程中新建bin目录,在该目录下创建名为helper的文件,具体内容如下: #!/usr/bin

  • Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址

    使用Windows命令行cmd可以指定浏览器打开网址.在node.js中使用start即可: 比如分别用Chrome和IE打开网址 start chrome http://www.google.cn start iexplore http://www.google.cn 但是当用户没有安装Chrome时使用start则会报错,并会弹出错误对话框: [Window Title] chrome [Content] Windows 找不到文件 'chrome'.请确定文件名是否正确后,再试一次. 如果

  • 利用node.js制作命令行工具方法教程(一)

    前言 之前使用过一些全局安装的NPM包,安装完之后,可以通过其提供的命令,完成一些任务.比如Fis3,可以通过fis3 server start 开启fis的静态文件服务,通过fis3 release开启文件编译与发布:还有vue-cli,可以通过vue init webpack my-project来初始化vue+webpack的项目基础配置.最近有一个需求,需要写一个类似vue-cli的NPM包,通过命令行操作实现项目初始配置,所以就查看了相关资料,学习了一下如何使用node来生成自己的命令

  • node.js命令行教程图文详解

    本文先介绍原生的node.js实现命令行交互,了解原生的api,然后通过commander.js和inquirer.js实现一个完整的交互命令行工具. 项目地址 process (进程) process对象是一个全局变量,它提供了当前node.js进程的信息并对其控制.因为其是一个全局变量所以无需在文件中引入. 需要用到的几个api process.argv process.cwd() process.stdin process.stdout process.stdin.resume() pro

  • windows系统下node.js环境配置与安装教程图文详解(详细版)

    国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网https://nodejs.org/en/download/ 这里用的是 第二步:安装nodejs 下载完成之后,双击 node-v6.9.1-x64.msi,开始安装nodejs,默认是安装在C:\Program Files\nodejs下面 第三步:安装相关环境 打开C:\Program Files\

  • Node.js REPL (交互式解释器)实例详解

    Node.js  REPL (交互式解释器)实例详解 Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端,我们可以在终端中输入命令,并接收系统的响应. Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中. 执行 - 执行输入的数据结构 打印 - 输出结果 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出. 多行表达式

  • mysql-8.0.15-winx64 解压版安装教程图文详解

    1.官网下载,并解压 https://dev.mysql.com/downloads/mysql/ 2.设置环境变量 配置MYSQL_HOME为MySQL的解压路径,并在path设置;%MYSQL_HOME%\bin 3.在MySQL解压路径下,新建my.ini 配置初始化参数: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D:

  • mysql-8.0.16 winx64的最新安装教程图文详解

    最近刚学习数据库,首先是了解数据库是什么,数据库.数据表的基本操作,这就面临了一个问题,mysql的安装,我这里下载的是64位的,基于Windows的,以下是在我电脑上的安装过程,希望可以帮助到大家. 1.在mysql的官网上去下载,链接是 https://dev.mysql.com/downloads/mysql/ ,如图1-1,1-2所示,点击downloads,然后会弹出图1-3,点击No thanks,jast start my download.即可,当然你也可以注册一下. 图 1-1

  • python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们需要历史版本下载 如图点击: 下载途中标记的: 按照图中箭头执行: 这里选中存放的路径和把配置环境变量选项勾上,如图: 安装完成 测试结果 如果出现图下的就是环境变量没有配置好: 配置环境变量: 把图中2个路径配置到环境变量中 再次输入python 如图: python就安装好了; 第二种安装方法,

  • Python Django的安装配置教程图文详解

    Django 教程 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Python写成. Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 . Django采用了MVC的软件设计模式,即模型M,视图V和控制器C. 学习Django前,我们要确定电脑上是否已经安装了Python,目前Python有两个版本,不过这两个版

  • Windows下mysql-5.7.28下载、安装、配置教程图文详解

    最近需要更换mysql数据库的版本,写一篇文章,记录一下 一.下载mysql数据库 mysql的下载共有两种,一种是zip压缩文件,另一种是msi安装程序 官方5.7版本zip压缩文件下载页面 官方5.7版本msi安装程序下载页面 我这里选择5.7.28-Windows64位 点击左下角直接开始下载 使用迅雷或者IDM等下载器,下载会快一点 下载完成之后的两种文件 二.安装mysql数据库 我这里使用zip压缩文件安装,这是免安装的,配置的内容多一点 1.解压缩安装文件 注意:解压缩的路径里面不

  • Windows 下python3.8环境安装教程图文详解

    python3.8新功能相关文章 Python 3.8 新功能大揭秘[新手必学] Python 3.8 新功能来一波(大部分人都不知道) 第一步 下载python3.8,官网下载较慢,我已经下载好了 64位 32位 第二步 双击安装,记得勾选红框框! 不勾选的话,安装完需要自己配置环境变量 等待即可 第三步 完成安装,检验是否安装成功 ctrl+R打开运行,输入cmd打开命令行 命令行中运行输入python测试是否运行(若电脑中同时有python2和python3则输入python3来指定运行的

  • windows10下 MySQL msi安装教程图文详解

    一.下载 1.点击MySQL msi官网最新下载或复制https://dev.mysql.com/downloads/windows/installer/ 链接. 2.根据自己的需求进行下载,这里选择的是Windows (x86, 32-bit), MSI Installer( mysql-installer-web-community-8.0.19.0.msi) [注]mysql-installer-web-community-8.0.19.0.msi 18.6M是联网安装,安装时必须联网的:

随机推荐