亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

node.js命令行教程圖文詳解

2024-05-06 16:51:27
字體:
來源:轉載
供稿:網友

本文先介紹原生的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.jsconsole.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.jsconsole.log(process.argv)let argvs = process.argvlet 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 zhuparam [ '--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.jsprocess.stdin.setEncoding('utf8')let argvs = process.argvlet 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.js,命令行

node.js,命令行

備注

在新版本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做的一個通用交互式命令行用戶界面的集合。具有常用的控制臺交互操作。

node.js,命令行

由于交互的問題種類不同,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.js,命令行

已經可以運行了,我們自定義一個命名替代每次都執行node

命令為:test-cli create <dir>

1、創建bin文件夾,在bin文件夾下創建index.js文件

#!/usr/bin/env noderequire('../cli/cli')

2、修改package.json文件

添加bin選項

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

3、執行npm link (如果沒有權限,執行sudo npm link)

4、測試

node.js,命令行

5、發布 npm publish (如果未登錄需先 npm login登錄)

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

npm install -g XXX

總結

以上所述是小編給大家介紹的node.js命令行教程圖文詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美精品网站| 亚洲v日韩v综合v精品v| 日韩精品在线视频观看| 精品国内产的精品视频在线观看| 亚洲欧美中文在线视频| 26uuu日韩精品一区二区| 亚洲视频在线免费观看| 国产精品第七十二页| 欧美国产一区二区三区| 色无极影院亚洲| 国产精品视频地址| 在线亚洲男人天堂| 国产日韩一区在线| 欧美多人爱爱视频网站| 大伊人狠狠躁夜夜躁av一区| 国产成人精品电影| 精品视频在线播放色网色视频| 成人高清视频观看www| 国产成人久久久| 51久久精品夜色国产麻豆| 国语自产精品视频在免费| 亚洲国产精品久久久久久| wwwwwwww亚洲| 欧美日韩国产专区| 精品国产乱码久久久久酒店| 成人免费网站在线| 北条麻妃一区二区三区中文字幕| 欧美电影在线免费观看网站| 亚洲日本中文字幕免费在线不卡| 日韩av一区在线观看| 北条麻妃一区二区三区中文字幕| 亚洲欧洲av一区二区| 91大神福利视频在线| 久久精品视频亚洲| 欧洲一区二区视频| 亚洲国产欧美一区二区三区久久| 亚洲永久在线观看| 亚洲成人久久久| 91av视频在线免费观看| 国产精品劲爆视频| 精品女同一区二区三区在线播放| 亚洲国产成人91精品| 欧美日韩国产一区二区| 欧美国产在线视频| 精品视频久久久久久久| 国产盗摄xxxx视频xxx69| 国产在线拍揄自揄视频不卡99| 亚洲自拍高清视频网站| 亚洲国内精品在线| 亚洲色图激情小说| 欧美日韩高清区| 亚洲电影中文字幕| 国产综合视频在线观看| 人人爽久久涩噜噜噜网站| 成人h视频在线| 久久久久久久久爱| 国产欧美日韩丝袜精品一区| 日韩资源在线观看| 久久久久久久影视| 亚洲精品电影网| 粉嫩av一区二区三区免费野| 精品福利免费观看| 久久精品亚洲94久久精品| 欧美一级高清免费播放| 欧美日本国产在线| 日韩av免费在线| 亚洲成色777777女色窝| 伊人久久久久久久久久| 欧美丰满老妇厨房牲生活| 日韩av免费在线观看| 欧美性生活大片免费观看网址| 欧美精品久久久久久久免费观看| 亚洲女人天堂网| 九九精品视频在线| 日韩女在线观看| 在线免费观看羞羞视频一区二区| 91国产美女视频| 亚洲日本中文字幕免费在线不卡| 欧美激情性做爰免费视频| 欧美色欧美亚洲高清在线视频| 亚洲理论片在线观看| 久久99国产精品自在自在app| 欧美大片免费看| 国产成人小视频在线观看| 精品久久中文字幕久久av| 亚洲综合大片69999| 国产精品扒开腿做爽爽爽视频| 欧美在线观看网址综合| 久久免费成人精品视频| 欧美激情a∨在线视频播放| 一区二区三区视频免费在线观看| 51视频国产精品一区二区| 亚洲欧美中文另类| 国产日韩精品在线| 日韩精品小视频| 亚洲最新av在线网站| 国产福利成人在线| 97人人模人人爽人人喊中文字| 日韩av在线网站| 精品国产网站地址| 国产日本欧美在线观看| 国产一区二区日韩精品欧美精品| 亚洲国产日韩欧美在线动漫| 久久大大胆人体| 欧美丰满少妇xxxxx| 国产精品69精品一区二区三区| 中文字幕视频在线免费欧美日韩综合在线看| 在线视频日本亚洲性| 国产成人精品网站| 久久久av一区| 人人澡人人澡人人看欧美| 欧美性色19p| 性夜试看影院91社区| 97超级碰在线看视频免费在线看| 国产精品永久免费在线| 91在线观看免费高清| 亚洲欧美日韩国产中文| 在线视频欧美性高潮| 欧美怡春院一区二区三区| 久久久噜噜噜久久中文字免| 国产成人亚洲精品| 国产成人a亚洲精品| 欧美日韩国产麻豆| 亚洲三级av在线| 日韩欧美国产激情| 中文字幕视频一区二区在线有码| 亚洲第一级黄色片| 亚洲国产精品久久久久| 欧美国产日本在线| 久久天堂av综合合色| 欧美午夜激情视频| 国产精品海角社区在线观看| 久久久久久久av| 亚洲人线精品午夜| 欧美性猛交xxxx免费看漫画| 国产精品成人av性教育| 亚洲影视九九影院在线观看| 亚洲免费人成在线视频观看| 日韩av电影免费观看高清| 一个人看的www久久| 国产精品老女人精品视频| 欧美精品在线第一页| 欧美日本高清一区| 久久九九有精品国产23| 一本一道久久a久久精品逆3p| 国产免费一区二区三区在线观看| 国产99久久精品一区二区永久免费| 国产亚洲精品激情久久| 亚洲精品日韩在线| 91精品国产91久久久久久不卡| 国产精品爽爽爽| 欧美成人免费大片| 亚洲**2019国产| 日韩av一区二区在线观看| 国产精品777| 欧美在线中文字幕| 国产日韩一区在线| 欧美午夜性色大片在线观看| 欧美日韩免费观看中文| 亚洲国产中文字幕在线观看| 亚洲性线免费观看视频成熟| 成人做爰www免费看视频网站| 成人在线激情视频| 精品少妇一区二区30p|