process是node中的一個模塊,經過訪問process.argv咱們能輕鬆愉快的接收經過命令執行node程序時候所傳入的參數。node
[info] argv翻譯成中文意思是:命令行變元數組。linux
這是什麼意思呢?咱們都在命令行窗口中使用過npm
命令來進行包的下載,在使用npm命令的時候咱們還能進行一些傳參,像要下載的包的名字啊,是開發依賴仍是生產依賴啊。npm
這些所傳的參數+node.exe絕對路徑+node所執行文件的絕對路徑所組成的數組 = process.argv
。它不止包含所傳的參數還包含另外兩個東東做爲數組成員,故稱之爲變元數組。json
// 文件p1.js中
console.log(process.argv);
>>>命令行中輸入
node p1.js --a -b c
<<< 輸出
E:\w>node p1.js --a -b c
[ 'C:\\Program Files\\nodejs\\node.exe',
'E:\\w\\p1.js',
'--a',
'-b',
'c' ]
複製代碼
批處理文件,顧名思義,它能達到經過只執行一個文件從而執行多條node命令的效果,它能極大的簡化咱們在命令行中的輸入,咱們只須要輸入批處理文件的名字,甚至不須要輸 node
這個前綴。 批處理文件在不一樣的操做系統下是不同的,主要分爲:windows
windows中的批處理文件後綴名爲.bat
。數組
//hello.bat文件中
node p.js -a hello -b world
>>>命令行中
hello //爲xx.bat文件去掉後綴的文件名
<<<輸出
[ 'C:\\Program Files\\nodejs\\node.exe',
'E:\\w\\p1.js',
'-a',
'hello',
'-b',
'world' ]
複製代碼
在上面的栗子中有一個問題,咱們所傳入的參數是固定的,要想它不固定,須要在.bat文件中使用佔位符取代本來固定的參數,再在執行批處理文件時經過傳參進行映射。bash
//hello.bat文件中
node p.js %1 %2 %3 %4
>>>命令行中輸入
hello -a hello -b world //爲xx.bat文件去掉後綴的文件名
<<<輸出
[ 'C:\\Program Files\\nodejs\\node.exe',
'E:\\w\\p1.js',
'-a',
'hello',
'-b',
'world' ]
複製代碼
[warning] 注意:工具
%x
這個佔位符表明是第幾個傳入的參數上面雖然使傳參所傳入的參數值再也不固定化了,但個數仍然是固定的,so咱們推薦下面這種類linux的批處理文件。ui
此時,咱們再也不須要.bat
後綴名,咱們的批處理文件名直接就是xxx
(再也不須要後綴)。spa
倘若咱們要執行的文件名爲hello,要執行這個批處理文件,咱們須要先給它添加可執行權限
$ chmod +x hello
複製代碼
接着,在這個文件中添加一句話,意思是讓node來執行這個命令
#! /usr/bin/env node
複製代碼
最後,如何執行這個文件呢,只須要訪問它便可
>>>輸入
$ ./hello --a -b c
<<< 輸出
[ 'C:\\Program Files\\nodejs\\node.exe',
'E:\\w\\hello',
'--a',
'-b',
'c' ]
複製代碼
[danger] 注意: 此時./
是必須的
若是咱們想在輸入命令時不須要輸入前面的'./',咱們就須要用到npm link
了。 首先,在package.json下,添加這麼一段
"bin":{
"hello":"hello" //前者爲咱們輸入的命令,後者爲要執行的文件的路徑(包括文件名)
}
複製代碼
接着在package.json所處目錄下的命令行中輸入
npm link
複製代碼
這樣咱們就無需在輸入命令時候還要加上./
前綴。
[important]注意:
這是由於npm link後,命令行中的命令指向了npm目錄bat文件(npm-link後會自動在npm目錄下生成,其做用是將package.json中咱們所配置的那個可執行文件掛到這個.bat下),而 bat文件又指向了當前目錄 (package.json所處目錄)的hello文件(路徑)。
npm link 必須配合 #! /usr/bin/env node,不然windows會報腳本執行錯誤
yargs能幫助咱們在被執行的文件裏所接受的參數進行包裝處理。 yargs.argv就是包裝後的process.argv,除此以外咱們還能經過yargs.options對這個包裝對象再進行進一步的訂製。
[important] 注意: 和process.argv很大的不一樣是它返回的是一個對象而不是數組,以連詞線 -
或--
開頭的參數會做爲對象中的一個key值,而它後面的非連詞線開頭的參數會做爲key的值,若是後面沒有非連詞線開頭的參數則會返回true
//hello文件中
#! /usr/bin/env node
let yargs = require('yargs');
let argv = yargs.argv; //.argv是必須的
console.log(argv);
>>>命令行中輸入
$ ./hello --a 1 -b 2 c
<<<輸出
{ _: [ 'c' ],
help: false,
version: false,
a: 1,
b: 2,
'$0': 'hello',}
console.log(argv.a);
<<<輸出
1
複製代碼
咱們能夠經過訪問argv._
來獲取非連詞線開頭的參數
>>>命令行中輸入
$ ./hello d --a 1 -b 2 c
<<<輸出
[ 'd', 'c' ]
複製代碼
多個不一樣參數的配置經過.option
隔開
#! /usr/bin/env node
let yargs = require('yargs');
// let argv = yargs.argv;
let argv = yargs.options('a',{
alias:'ant'
,demand:true
,default:'super'
,describe:'一隻灰常大的螞蟻'
,boolean:false
,type:'string'
}).options('b',{
alias:'BB'
,describe:'woshi bb'
,boolean:false
}).argv;
console.log(argv._);
console.log(argv);
>>>命令行中輸入
$ ./p1.js -a valueA -b valueB -c
<<<輸出
[]
{ _: [],
help: false,
version: false,
a: 'valueA',
ant: 'valueA',
b: 'valueB',
BB: 'valueB',
c: true,
'$0': 'p1.js' }
複製代碼
配置項說明:
首先yargs已經默認爲咱們提供了--help
參數來顯示幫助信息,咱們一樣的,能夠給這個--help參數配置個別名來簡化
let argv = yargs.此處省略一萬字.help('h').argv
>>>命令行中輸入
$ ./p1.js --h
<<<輸出
選項:
--version 顯示版本號 [布爾]
-a, --ant 一隻灰常大的螞蟻 [字符串] [必需] [默認值: "super"]
-b, --BB woshi bb [布爾]
-h 顯示幫助信息 [布爾]
複製代碼
配置其它的幫助提示
// hello文件中
...
.help('h')
.usage('hello -[option] value')
.example('我,栗子,讓你明白!')
.epilog('copyright 2018-')
.argv;
>>>
$ ./hello -h
<<<
hello -[option] value
選項:
--version 顯示版本號 [布爾]
-a, --ant 一隻灰常大的螞蟻 [字符串] [必需] [默認值: "super"]
-b, --BB woshi bb [布爾]
-h 顯示幫助信息 [布爾]
示例:
我,栗子,讓你明白!
copyright 2018-
複製代碼
let args = process.argv;
let argv = {};
for(let i=2;i<args.length;++i){
let cur = args[i];
if(/^(--)/.test(cur)){
argv[cur.slice(2)] = args[++i];
}
}
複製代碼