這篇文章主要介紹了node.js命令行的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創新互聯建站主營鄞州網站建設的網絡公司,主營網站建設方案,App定制開發,鄞州h5小程序開發搭建,鄞州網站營銷推廣歡迎鄞州等地區企業咨詢
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

.jpg)
備注
在新版本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命令行的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創新互聯,關注創新互聯行業資訊頻道,更多相關知識等著你來學習!
網頁標題:node.js命令行的示例分析
標題網址:http://www.yijiale78.com/article46/ghdchg.html
成都網站建設公司_創新互聯,為您提供云服務器、自適應網站、外貿網站建設、企業網站制作、網站設計公司、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯