[note] 撰寫 CLI 的工具
概念
shebang
如果希望 JavaScript 的檔案能夠被在 Terminal 中被當成執行檔直接執行,而不用在最前面加上 node
的話,可以在 JavaScript 檔案的最上方加上 shebang(#!
),又稱作 hashbang。
舉例來說,建立一支 hello.js
的檔案:
console.log('Hello');
一般來說,如果要執行這支檔案,需要在執行該檔案前加上 node
,例如:
$ node hello
但如果我們希望讓這支檔案能夠類似 shell script 直接被執行的話:
$ ./hello.js
只需要:
- 在這支檔案的開頭最上方加上 shebang 宣告,告訴作業系統要用哪個 interpreter 來執行這支檔案:
#!/usr/bin/env node
console.log('Hello');
這裡使用 JavaScript 的檔案示範,如果你寫的是 Shell Script,同樣只需在最上面定義用 shebang 定義 Bash 的來源(可以使用 which bash
找到 bash),例如 #! /bin/bash
。
- 讓這支檔案有被系統執行的權限:
$ chmod +x hello.js
最後就可以直接在 Terminal 中直接執行這支檔案了:
# 直接執行 hello.js 檔,而不需要在最前方加上 node
$ ./hello.js
工具
cleye (TS support)
cleye @ GitHub
Commander
commander @ github
一套方便用來撰寫 Node.js CLI 的工具。
Ora
ora @ github
ora 自 v6 開始只支援 ESM 的寫法,如果專案仍需要支援 CommonJS 需安裝 v5 的版本。
這是一套用來在 Terminal 中出現 spinner 的套件。
const ora = require('ora');
const spinner = ora({
text: 'foobar',
color: 'cyan',
});
spinner.start([text]).stop().succeed([text]).fail([text]).warn([text]).info([text]).clear();
.start()
之後需要呼叫後續的方法才會終止(換行),若單純要產生訊息內容,可以直接使用 spinner.succeed()
等這類方法。使用範例 example.js
。
顏色添加
kolorist (TS Support)
kolorist @ github
幫 CLI 中的內容增添顏色。
Colors
colors @ github
這是一套用來在 Terminal 中讓文字出現顏色的套件。
colors 會在 String.prototype
添加方法,因此直接針對文字使用:
// 直接針對文字使用
var colors = require('colors');
console.log('hello'.green); // outputs green text
console.log('i like cake and pies'.underline.red); // outputs red underlined text
console.log('inverse the color'.inverse); // inverses the color
console.log('OMG Rainbows!'.rainbow); // rainbow
console.log('Run the trap'.trap); // Drops the bass
使用 color
這個方法:
var colors = require('colors/safe');
console.log(colors.green('hello')); // outputs green text
console.log(colors.red.underline('i like cake and pies')); // outputs red underlined text
console.log(colors.inverse('inverse the color')); // inverses the color
console.log(colors.rainbow('OMG Rainbows!')); // rainbow
console.log(colors.trap('Run the trap')); // Drops the bass
詢問使用者(互動)
clack (TS Support)
clack @ github
Inquirer
inquirer @ github
整理了一系列可以在 Terminal CLI 中讓使用者互動的工具,並且提供了相當完整的範例可以參考。
prompts
prompts @ github
可以詢問使用者問題。
解析使用者 在 CLI 帶入的參數
Command Line Args
command-line-args @ GitHub
方便用來讀取使用者在 command line 輸入的參數。
const commandLineArgs = require('command-line-args');
// 定義使用者可以輸入 start 和 end 參數
const optionDefinitions = [
{ name: 'start', alias: 's', type: Number },
{ name: 'end', alias: 'e', type: Number },
];
// 取得使用者在 cmd 中輸入的參數
const options = commandLineArgs(optionDefinitions);
const { start, end } = options;
使用者可以在終端機中輸入
$ node index.js --start 10 --end 20
$ npm start -- --start 960 --end 1040
minimist
minimist @ GitHub
和 command-line-args
類似,可以用來解析使用者帶入 CLI 的參數。
打包工具
pkgroll
pkgroll @ GitHub
ZX
zx @ github
一套方便用來撰寫 script 檔的工具。