溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

node.js命令行的示例分析

發(fā)布時間:2021-08-17 13:58:37 來源:億速云 閱讀:125 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了node.js命令行的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

process (進程)

process對象是一個全局變量,它提供了當前node.js進程的信息并對其控制。因為其是一個全局變量所以無需在文件中引入。

需要用到的幾個api

  • process.argv

  • process.cwd()

  • process.stdin

  • process.stdout

  • process.stdin.resume()

  • process.argv

process.argv

屬性返回一個數(shù)組。數(shù)組的第一個值是process.execPath,第二個是正在執(zhí)行的JavaScript的文件路徑,其余參數(shù)為其它命令參數(shù),這是我們來自定義命令的關(guān)鍵。

示例

新建argv.js

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

執(zhí)行node命令node argv.js

node argv.js --name zhu
## 輸出
[ '/usr/local/bin/node', ## 執(zhí)行當前腳本的Node二進制文件的絕對路徑
 '/Users/zhuhuilong/Node/Book/argv.js', ## 文件的絕對路徑
 '--name', ## 其余參數(shù)
 'zhu' ]

接收自定義的命令參數(shù)進行處理輸出

// 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) 的,所以必須要調(diào)用 process.stdin.resume() 來恢復(fù) (resume) 接收。

  • 作為流,process.stdin可以在舊模式下使用。為了兼容node v0.10以前的版本。在舊模式喜愛使用stdin必須調(diào)用process.stdin.resume()。注意如果調(diào)用了process.stdin.resume() stdin將轉(zhuǎn)為舊模式。

通俗來講就是控制臺等待我們輸入內(nèi)容不退出進程,對輸入輸出進行交互。

新建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('結(jié)束\n')
})

>執(zhí)行node inputout.js --name

node.js命令行的示例分析

node.js命令行的示例分析

備注

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

示例:

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參數(shù)對其進行處理交互,但如果要實現(xiàn)更復(fù)雜的命令交互,使用上面的方法會很吃力。下面我們使用commander.js和inquirer來實現(xiàn)一個完整的node命令行工具(創(chuàng)建項目模版)。

commander.js

node.js命令行界面的完整解決方案,受Ruby Commander啟發(fā)。

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>') //<>必選參數(shù),如果是[]則是可選參數(shù)
 .option('-r, --recursive', 'Remove recursively')
 .action(function (dir, cmd) {
 console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
 })
 
program.parse(process.argv)

// command()可變參數(shù)
/** 命令command有且只有最后一個參數(shù)可變不固定的。 要使參數(shù)變量可變,必須將...附加到參數(shù)名稱。**/
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() 定義命令的回調(diào)函數(shù)

var program = require("commander");

program
 .command("rm <dir>")
 .option("-r, --recursive", "Remove recursively")
 .option("-f, --force", "remove force")
 .action(function(dir, cmd) {
 // cmd為option參數(shù)選項
 //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為每個問題提供很多參數(shù):

  • type:表示提問的類型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor;

  • name: 存儲當前問題回答的變量;

  • message:問題的描述;

  • default:默認值;

  • choices:列表選項,在某些type下可用,并且包含一個分隔符(separator);

  • validate:對用戶的回答進行校驗;

  • filter:對用戶的回答進行過濾處理,返回處理后的值;

  • transformer:對用戶回答的顯示效果進行處理(如:修改回答的字體或背景顏色),但不會影響最終的答案的內(nèi)容;

  • when:根據(jù)前面問題的回答,判斷當前問題是否需要被回答;

  • pageSize:修改某些type類型下的渲染行數(shù);

  • prefix:修改message默認前綴;

  • suffix:修改message默認后綴。

  • 創(chuàng)建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命令行的示例分析

已經(jīng)可以運行了,我們自定義一個命名替代每次都執(zhí)行node

命令為:test-cli create <dir>

1、創(chuàng)建bin文件夾,在bin文件夾下創(chuàng)建index.js文件

#!/usr/bin/env node

require('../cli/cli')

2、修改package.json文件

添加bin選項

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

3、執(zhí)行npm link (如果沒有權(quán)限,執(zhí)行sudo npm link)

4、測試

node.js命令行的示例分析

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

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

npm install -g XXX

感謝你能夠認真閱讀完這篇文章,希望小編分享的“node.js命令行的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI