從零開發一個Node Cli

Node.js用途很廣,經常使用來開發服務、桌面應用等被開發者熟知,Node.js還有另一個很是實用的場景 - 命令行應用(後文統稱CLI)。node

本文可參考的源碼:github.com/youngjuning…git

HelloWorld

建立一個youngjuning 目錄,並使用進入該目錄:github

$ mkdir youngjuning && cd youngjuning
複製代碼

在該目錄下新建 index.js:shell

#!/usr/bin/env node
console.log('Hello World')
複製代碼

使用 package.jsonbin 項是用來指定各個內部命令對應的可執行文件的位置:npm

"bin": {
  "youngjuning": "./bin/cli.js"
}
複製代碼

在命令行輸入 npn linknpm install -g 將當前項目安裝到全局環境,這樣就能夠直接使用 youngjuning 來運行文件了:json

commander.js

node 爲咱們提供了 process.argv 來讀取命令行參數,這裏咱們對此不做介紹,有興趣能夠自行研究,我選擇了 tj 大神的 commander微信

  • command: 定義命令行指令,後面可跟上一個 name,用空格隔開,如 .command( 'app [name]')
  • alias: 定義一個更短的命令行指令
  • description: 描述,它會在 help 裏面展現
  • option: 定義參數。它接受四個參數
    • 在第一個參數中,它可輸入短名字 -a 和長名字 –app,使用 | 或者 , 分隔,在命令行裏使用時,這兩個是等價的,區別是後者能夠在程序裏經過回調獲取到
    • 第二個爲描述, 會在 help 信息裏展現出來
    • 第三個參數爲回調函數,他接收的參數爲一個 string,有時候咱們須要一個命令行建立多個模塊,就須要一個回調來處理
    • 第四個參數爲默認值
  • action: 註冊一個 callback 函數,這裏需注意目前回調不支持 let 聲明變量
  • parse: 解析命令行

inquire.js

基本語法

const answers = await inquirer.prompt([
  /* Pass your questions in here */
])
console.log(answers)
複製代碼

參數詳解

  • 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 默認後綴。

實現動態模板

  • 利用 recursive-readdir 庫遞歸讀取項目全部文件
  • 利用 handlebars 進行模板替換
  • 利用 fs 模塊進行讀文件和寫文件操做
const fs = require('fs')
const handlebars = require('handlebars')
const recursive = require('recursive-readdir')

const compile = (meta, file) => {
  const content = fs.readFileSync(file).toString()
  const result = handlebars.compile(content)(meta)
  fs.writeFileSync(file, result)
}

module.exports = (meta, src) => {
  recursive(src, (err, files) => {
    files.forEach(file => {
      compile(meta, file)
    })
  })
}
複製代碼

命令行工具

  • chalk.js: 美化命令行的模塊
  • ora: Elegant terminal spinner
  • ncp: 異步的拷貝文件,包含空文件夾
  • recursive-readdir: 遞歸地列出目錄和子目錄下的全部文件,不包含目錄自己。
  • shelljs: Unix shell commands for Node.js
  • log-symbols: 打印日誌的特殊標誌
  • download-git-repo: Download and extract a git repository (GitHub, GitLab, Bitbucket) from node
  • global-prefix: 獲取 npm 全局安裝的前綴
  • exec-sh: 執行 shell 命令轉發全部 stdio 流,比 shelljs exec 命令好用
  • wml: wml 偵聽某個文件夾中的更改(使用 watchman),而後將更改的文件複製到另外一個文件夾中。
  • cmd-open: 擴展 Windows 命令 open
  • shx: shx is a wrapper around ShellJS Unix commands, providing an easy solution for simple Unix-like, cross-platform commands in npm package scripts.

聯繫做者

做者微信 知識星球 讚揚做者
相關文章
相關標籤/搜索