如何在 Node.js 中建立 CLI 應用程式
CLI(命令列介面)應用程式是簡單的基於文字的應用程序,在終端中運行以完成特定任務。 CLI 應用程式在幾乎每個開發人員和 IT 專業人員的工作流程中都發揮著至關重要的作用。
大多數這些軟體程式都用作實用程序,與作業系統或應用程式交互,無論是安裝在本機裝置上還是透過網路訪問,以便根據使用者的命令和指示執行任務。
了解 CLI 應用程式
命令列介面透過輸入文字命令促進使用者和程式之間的互動。許多 CLI 應用程式的行為可能會根據所使用的啟動命令而有很大差異。
事實上,「ls」命令用於以使用者友好的格式顯示檔案和目錄的詳細資訊。可以透過輸入命令後跟任何所需的參數或選項來執行它。
ls -l /home
該命令包括:
稱為「ls」的命令列公用程式用於列出和管理 Linux 或 Unix 作業系統中目錄中的檔案。它為使用者提供有關文件權限、所有權、大小、修改日期以及與其係統上儲存的文件有關的其他相關詳細資訊的資訊。
上述標誌以“-l”表示,作為術語“long”的替代,它在其輸出中引發了更大程度的特異性。
在本文中,「參數」是指在程式或系統中使用的參數或資料片段,用於指定應從中檢索或顯示資訊的特定位置或目錄。給定的程式碼片段表明指定的路徑可以由手頭上的腳本或應用程式存取和處理。
在為軟體應用程式開發命令列介面時,遵守既定約定非常重要,以確保習慣在此類環境中工作的使用者的可用性和可訪問性。透過合併常用元素,您可以增加不熟悉您的特定程式的使用者仍然能夠有效導航並與其互動的可能性。
Commander.js 是什麼?
Commander.js 是一個 npm 套件,可促進使用 Node.js 開發命令列介面 (CLI) 應用程式。該軟體包提供了一套全面的工具和功能,使開發人員能夠輕鬆創建強大的 CLI 應用程式。使用 Commander.js,開發人員可以簡單地指定其 CLI 應用程式所需的命令、選項和行為,而不必擔心底層實作細節。
透過將 Chalk.js 與此套件集成,人們可以輕鬆地在 Node.js 環境中產生一個全面可操作的命令列介面應用程式。
使用 Commander.js 在 Node.js 中建立 CLI 應用程式
考慮一個範例 CLI 應用程式 Urbanary-cli,它從 城市字典 中找到單字和社交媒體縮寫的含義。您將學習如何建立 CLI 並將其發佈到 npm 套件註冊表,以便其他人可以安裝它。
請依照以下步驟使用命令列介面建立一個新資料夾並初始化一個新的 Node.js 專案:1.打開電腦上的終端機或命令提示字元。2.透過輸入適當的目錄路徑導覽至您想要建立新資料夾的所需位置。例如,如果您想要在主目錄中建立一個名為「my-project」的新資料夾,請輸入下列命令:cd ~/my-project
.3。導航到正確的目錄後,請使用 mkdir
指令,後面跟著您要建立的資料夾的名稱。在這種情況下,指令將為 mkdir my-project
。這將建立一個名為“my-project”的新空資料夾。4。建立新資料夾後,導航回來
mkdir urbanary-cli
cd urbanary-cli
npm init -y
此 CLI 將使用 Axios 向 Urban Dictionary API 發送 HTTP 請求。您可以使用 Rapid API 檢查端點並查看憑證。
帶有子命令和幫助的簡單 CLI
要開始建立命令列介面 (CLI),您需要安裝兩個基本元件-“Commander”和“Axios”。您可以透過執行在安裝過程中包含這兩個依賴項的單一命令來實現此目的。所需命令如下:
npm install commander axios
請在專案目錄中建立一個名為「bin」的新資料夾,以及一個名為「index.js」的空檔案。
mkdir bin
cd bin
touch index.js
“bin”目錄代表“二進位”,非常重要,因為它包含 NodeJS 在運行命令列介面 (CLI) 應用程式時調用的入口點檔案。該入口點檔案稱為“index.js”檔案。要開始使用 Commander.js 庫建立您自己的 CLI,請隨意修改上述「index.js」檔案。
首先,從 Commander 匯入程式物件:
const { program } = require('commander');
利用程式物件作為描述應用程式介面的工具,包括輔助命令、選擇和參數。該實體擁有與各方面相對應的對應程序;值得注意的是,為了建立下級指揮部,請使用
當然,這裡有一個範例,說明如何在CLI 腳本中定義find
子命令,該子命令使用urbandictionary-api
套件在Urban Dictionary 上搜尋單字並顯示其定義:javascriptconst { Prompt }=require(’https//www.npmjs.com/package/prompt’);const UrbanDictionaryAPI=require(’./urban-dictionary-api’).default;//透過在城市字典中搜尋來取得單字定義的函數apiasync function find(word) {const result=wait UrbanDictionaryAPI.getDefinition({ query: word });console.log( ${word}-${result}
);}module.exports={ find };這段程式碼定義了一個有單一參數的 find
函數
// index.js
program
.command('find <word>')
.description('find meaning of a word or abbreviation or slang')
提供的程式碼片段示範了 JavaScript 中 find
函數的實現,利用雙引號 ""
內的尖括號 (<>
) 來定義具有強制要求的參數。或者,如果參數的存在是可選的,則可以使用方括號“[]”。
強烈建議合併說明性帳戶,因為 Commander.js 使用此資訊來產生用於幫助目的的資訊內容。當透過「help」指令執行時,將顯示常規的使用指南。
要測試這一點,請添加以下內容:
program.parse()
執行程式並為其提供“help”命令後,後續結果如下:
使用在標準命令列介面 (CLI) 應用程式中提供協助的傳統方法是一種常見做法,在實作 Commander 程式庫時,開發人員無需付出額外的努力。使用者可以透過輸入“-h”或“-help”選項,然後輸入所需的命令來輕鬆存取所提供的指導,以查看與每個命令相關的使用說明。
定義選項並準備最終程序
您可以透過結合使用選項方法和命令定義來進一步自訂命令的行為,透過這種稱為「連結」的技術有效地將它們連結在一起。
要將說明性範例納入詞彙的口頭解釋中,可以遵循以下步驟:
program.option('-e,--example', "Display examples")
以下是指定確定要傳回的定義數量的選項的方法:
program.option(
'-c,--count [amount]',
'amount of definitions to display (max is 10)'
)
此方法促進從一系列替代方案中進行選擇,採用兩個字串作為輸入,其中一個以簡潔和擴展格式表示選項的名稱,而第二個則概括其隨附的說明。另外,由「count」表示的可選參數指定與要顯示的概要的必要數量相對應的數字。
我們的實作中要包含的最後一個方法是「action」方法,它用來執行「find」命令固有的操作。透過在我們的程式碼庫中包含此方法,我們可以確保我們的程式遵循類似於提供的範本的結構。因此,我們的程式碼的最終配置將呈現類似於以下的格式:
program
.command('find <word>')
.description('find meaning of a word or abbreviation or slang')
.option('-e,--example', "Display examples")
.option(
'-c,--count [amount]',
'amount of definitions to display (max is 10)'
)
.action(async (word, options) => {});
結合提供的配置,執行對三個「lol」實例的請求以及相應的插圖可能類似於以下內容:
urbanary-cli find lol -e -c 3
解決這個問題的另一種方法可以是探索不同的觀點或策略來處理它。一種可能性是考慮其他可用的選擇,這些選擇可能會提供比目前正在追求的結果更有利的結果。這可能涉及尋求有關潛在解決方案的更多資訊或諮詢相關領域的專家,他們可能會提供有價值的見解和建議。透過採取這些步驟,我們可以努力取得更好的結果,同時避免與我們目前的行動方針相關的負面後果。
urbanary-cli find lol --example --count 3
請參閱 Commander 的 npm 頁面 以了解有關它的更多資訊以及如何根據您的不同用例調整其功能。
實作程式的功能
透過以下步驟將庫 Axios 合併到 index.js 檔案:
const axios = require('axios');
在「動作」物件方法的功能參數內,可以合併必要的程式碼來與城市字典互動並根據預定的偏好呈現結果。
首先定義您的請求:
let requestOptions = {
method: 'GET',
URL: "https://mashape-community-urban-dictionary.p.rapidapi.com/define",
params: { term: word },
headers: {
'X-RapidAPI-Key': YOUR_RAPID_API_KEY,
'X-RapidAPI-Host': 'mashape-community-urban-dictionary.p.rapidapi.com'
}
}
要使用 Axios 存取 API,可以使用以下程式碼行:javascriptaxios.get(’https://api.example.com/data’).then(response=> {//在此處理回應資料}).catch(error=> {//在此處理錯誤});
try {
let resp = await axios.request(requestOptions);
console.log(`Definitions for ${word} fetched`);
wordData = resp.data.list;
} catch (err) {
console.error(err.message)
}
我們從回應資料中需要的關鍵資訊之一是可枚舉屬性,它包含定義和插圖的集合。
將以下程式碼片段合併到現有的 try 區塊中,確保它處理選項輸入並相應地顯示相應的輸出:
if (options.example && options.count) {
let cnt = 1;
let definitions = wordData.slice(0, options.count);
definitions.forEach((elem) => {
console.log(`Definition ${cnt\+\+}: ${elem.definition}`);
console.log(`Example:\n${elem.example}\n`);
});
} else if (options.count && !options.example) {
let cnt = 1;
let definitions = wordData.slice(0, options.count);
definitions.forEach((elem) => {
console.log(`Definition ${cnt\+\+}: ${elem.definition}`);
});
} else if (options.example) {
console.log(`Definition: ${wordData[0].definition}`);
console.log(`Example:\n${wordData[0].example}`);
} else {
console.log(`Definition: ${wordData[0].definition}`);
}
本程式碼透過利用條件語句來分析輸入命令,以確定顯示結果的最合適的方法。如果提供的參數包括說明性實例、定界字元和計數選項,則程式將迭代與各個單字相關的數據,並相應地列印所需數量的定義和範例實例。
此功能將根據使用者輸入顯示一定數量的定義和/或範例。如果只傳“count”,則顯示具體的定義數量,不帶範例。類似地,傳遞「example」作為參數將呈現一個定義以及一個例句。如果兩個選項均未指定,則預設行為將僅顯示定義。
若要使應用程式可執行,請先在 bin/index.js 檔案的開頭合併一個 shebang 行,使其能夠作為獨立腳本運行。
#!/usr/bin/env node
接下來,導覽至專案目錄中的「package.json」檔案並修改「main」屬性的內容。此外,在現有屬性之後追加一個新的 bin
屬性,如下所示:
"main": "./bin/index.js",
"bin": {
"urbanary-cli": "./bin/index.js"
},
本質上,執行基於 Urbanary-cli 的專案的關鍵在於透過終端機輸入的命令。因此,在開發命令列應用程式時,必須為所述命令採用適當的標題。
要使用 npm 成功全域安裝應用程序,應在終端機中執行命令“npm install-g”。此操作將允許從同一終端機作為命令執行應用程式。
提供的插圖描述了安裝和執行診斷命令以確定 lmk 模組用途的過程。
在 npm(節點套件管理器)註冊表上發布您的作品是一個簡單的過程,可以廣泛分發並輕鬆安裝您的專案。為此,請導航至專案的根資料夾並在終端機中執行命令“npmpublish”。透過這樣做,您的專案將可供其他人透過命令「npm install」輕鬆安裝。
與使用 Rust 或類似技術建立命令列介面相比,使用 Node.js 可以促進應用程式的開發和傳播。
使用 Node.js 建立功能性 CLI 應用程式
事實上,對於那些從事需要補充命令列實用程式的npm 套件開發的人,或者對於尋求透過建立自訂工具來增強其工作流程的開發人員來說,Node.js Commander 套件提供了一個全面的解決方案,可幫助人們實現願景。
由於Node.js 提供的固有多功能性和穩定性,人們可以透過輕鬆利用其他函式庫來增強應用程式中命令列介面的使用者體驗,Node.js 為此類工作奠定了可靠的基礎,而不會造成太大的複雜性。