Jak zbudować aplikację CLI w Node.js
Aplikacje CLI (Command Line Interface) to uproszczone aplikacje tekstowe uruchamiane w terminalu w celu wykonania określonych zadań. Aplikacje CLI odgrywają kluczową rolę w przepływie pracy prawie każdego programisty i specjalisty IT.
Większość z tych programów służy jako narzędzia, które współdziałają z systemem operacyjnym lub aplikacją, niezależnie od tego, czy jest ona zainstalowana na urządzeniu lokalnym, czy też jest dostępna przez Internet, w celu wykonywania zadań w oparciu o polecenia i instrukcje użytkownika.
Zrozumienie aplikacji CLI
Interfejs wiersza poleceń ułatwia interakcję między użytkownikiem a programem poprzez wprowadzanie poleceń tekstowych. Zachowanie wielu aplikacji CLI może się znacznie różnić w zależności od zastosowanego polecenia inicjującego.
Rzeczywiście, polecenie “ls” jest wykorzystywane do wyświetlania szczegółów plików i katalogów w przyjaznym dla użytkownika formacie. Można je wykonać, wprowadzając polecenie, a następnie dowolne żądane parametry lub opcje.
ls -l /home
To polecenie zawiera:
Narzędzie wiersza poleceń znane jako “ls” służy do wyświetlania listy plików i zarządzania nimi w katalogu w systemie operacyjnym Linux lub Unix. Zapewnia użytkownikom informacje o uprawnieniach do plików, własności, rozmiarze, dacie modyfikacji i innych istotnych szczegółach dotyczących plików przechowywanych w ich systemach.
Wyżej wymieniona flaga, oznaczona jako “-l”, służy jako alternatywa dla terminu “long”, który wywołuje większy stopień szczegółowości w swoim wyjściu.
W tym kontekście “argument” odnosi się do parametru lub fragmentu danych, który jest używany w programie lub systemie do określenia konkretnej lokalizacji lub katalogu, z którego informacje powinny być pobierane lub wyświetlane. Podany fragment kodu wskazuje, że określona ścieżka może być dostępna i przetwarzana przez skrypt lub aplikację.
Podczas opracowywania interfejsu wiersza poleceń dla aplikacji ważne jest przestrzeganie ustalonych konwencji w celu zapewnienia użyteczności i dostępności dla użytkowników przyzwyczajonych do pracy w tego typu środowisku. Włączając powszechnie używane elementy, można zwiększyć prawdopodobieństwo, że użytkownicy niezaznajomieni z konkretnym programem będą nadal w stanie skutecznie nawigować i wchodzić w interakcje z nim.
Co to jest Commander.js?
Commander.js to pakiet npm, który ułatwia tworzenie aplikacji interfejsu wiersza poleceń (CLI) przy użyciu Node.js. Pakiet zapewnia kompleksowy zestaw narzędzi i funkcjonalności, które umożliwiają programistom tworzenie solidnych aplikacji CLI przy minimalnym wysiłku. Dzięki Commander.js programiści mogą po prostu określić polecenia, opcje i zachowania wymagane przez ich aplikację CLI bez konieczności martwienia się o szczegóły implementacji.
Integrując Chalk.js z tym pakietem, można bez wysiłku wygenerować kompleksowo działającą aplikację interfejsu wiersza poleceń w środowisku Node.js.
Tworzenie aplikacji CLI w Node.js przy użyciu Commander.js
Rozważmy przykładową aplikację CLI, urbanary-cli, która wyszukuje znaczenie słów i skrótów mediów społecznościowych ze słownika Urban Dictionary . Dowiesz się, jak utworzyć CLI i opublikować go w rejestrze pakietów npm, aby inni mogli go zainstalować.
Wykonaj następujące kroki, aby utworzyć nowy folder i zainicjować nowy projekt Node.js za pomocą interfejsu wiersza poleceń:1. Otwórz terminal lub wiersz polecenia na komputerze.2. Przejdź do żądanej lokalizacji, w której chcesz utworzyć nowy folder, wpisując odpowiednią ścieżkę katalogu. Na przykład, jeśli chcesz utworzyć nowy folder o nazwie “my-project” w katalogu domowym, wpisz następujące polecenie: cd ~/my-project
.3. Po przejściu do właściwego katalogu użyj polecenia mkdir
, a następnie nazwy folderu, który chcesz utworzyć. W tym przypadku będzie to polecenie mkdir my-project
. Spowoduje to utworzenie nowego pustego folderu o nazwie “my-project”.4. Po utworzeniu nowego folderu, przejdź z powrotem
mkdir urbanary-cli
cd urbanary-cli
npm init -y
To CLI użyje Axios do wysyłania żądań HTTP do interfejsu API Urban Dictionary. Możesz użyć Rapid API , aby sprawdzić punkty końcowe i wyświetlić dane uwierzytelniające.
Proste CLI z podkomendą i pomocą
Aby rozpocząć tworzenie interfejsu wiersza poleceń (CLI), należy zainstalować dwa podstawowe komponenty - “Commander” i “Axios”. Można to zrobić, wykonując jedno polecenie, które uwzględnia obie zależności w procesie instalacji. Wymagane polecenie jest następujące:
npm install commander axios
Utwórz nowy folder o nazwie “bin” w katalogu projektu, a także pusty plik o nazwie “index.js”.
mkdir bin
cd bin
touch index.js
Katalog “bin”, co oznacza “binarny”, ma istotne znaczenie, ponieważ zawiera plik punktu wejścia, który NodeJS wywołuje po uruchomieniu aplikacji interfejsu wiersza poleceń (CLI). Ten plik punktu wejścia jest określany jako plik “index.js”. Aby rozpocząć tworzenie własnego CLI przy użyciu biblioteki Commander.js, należy wprowadzić modyfikacje do wspomnianego pliku “index.js”.
Najpierw zaimportuj obiektprogram z Commander:
const { program } = require('commander');
Wykorzystaj obiekt program jako instrument do określenia interfejsu aplikacji, obejmującego dodatkowe polecenia, wybory i parametry. Jednostka ta posiada odpowiedniki procedur, które odpowiadają każdemu aspektowi; w szczególności, aby utworzyć polecenie podrzędne, należy użyć
Z pewnością oto przykład tego, jak można zdefiniować podpolecenie find
w skrypcie CLI, który wykorzystuje pakiet urbandictionary-api
do wyszukiwania słów w Urban Dictionary i wyświetlania ich definicji: javascriptconst { prompt } = require(’ https://www.npmjs.com/package/prompt’);const UrbanDictionaryAPI = require(’./urban-dictionary-api’).default;// Funkcja pobierająca definicję słowa poprzez wyszukiwanie w urban dictionary apiasync function find(word) { const result = await UrbanDictionaryAPI.getDefinition({ query: word });console.log( ${word} - ${result}
);}module. exports = { find };Ten kod definiuje funkcję find
, która przyjmuje pojedynczy argument
// index.js
program
.command('find <word>')
.description('find meaning of a word or abbreviation or slang')
Podany fragment kodu demonstruje implementację funkcji find
w JavaScript, wykorzystując nawiasy kątowe ( < >
) w podwójnych cudzysłowach ""
do zdefiniowania parametru z obowiązkowym wymogiem. Alternatywnie można zastosować nawiasy kwadratowe []
, jeśli obecność parametru jest opcjonalna.
Włączenie konta ilustracyjnego jest wysoce zalecane, ponieważ Commander.js wykorzystuje te informacje do tworzenia treści informacyjnych do celów pomocy. Po wykonaniu polecenia “help” zostaną przedstawione konwencjonalne wytyczne dotyczące użytkowania.
Aby to przetestować, dodaj następujące elementy:
program.parse()
Po uruchomieniu programu i wydaniu polecenia “help”, wynik jest następujący:
Wykorzystanie konwencjonalnej metody prezentacji pomocy w standardowej aplikacji interfejsu wiersza poleceń (CLI) jest powszechną praktyką, która nie wymaga dodatkowego wysiłku od programistów podczas implementacji biblioteki Commander. Użytkownicy mogą łatwo uzyskać dostęp do dostarczonych wskazówek, wprowadzając opcję “-h” lub “-help”, a następnie żądane polecenie, aby przejrzeć instrukcje użytkowania związane z każdym poleceniem.
Definiowanie opcji i przygotowywanie ostatecznego programu
Możesz jeszcze bardziej dostosować zachowanie polecenia, stosując metodę opcji w połączeniu z definicją polecenia, skutecznie łącząc je ze sobą za pomocą tej techniki znanej jako “łańcuch”.
Aby włączyć ilustrujące przykłady do słownych objaśnień słownictwa, można postępować zgodnie z poniższą procedurą:
program.option('-e, --example', "Display examples")
Oto sposób na określenie opcji, która określa liczbę zwracanych definicji:
program.option(
'-c, --count [amount]',
'amount of definitions to display (max is 10)'
)
Metoda ułatwiająca wybór z szeregu alternatyw wykorzystuje dwa ciągi jako dane wejściowe, z których jeden reprezentuje oznaczenie wyboru zarówno w zwięzłym, jak i rozszerzonym formacie, podczas gdy drugi uosabia towarzyszącą mu ekspozycję. Dodatkowo, opcjonalny parametr oznaczony jako “count” określa liczbę odpowiadającą wymaganej ilości streszczeń do wyświetlenia.
Ostatnią metodą, którą należy włączyć do naszej implementacji, jest metoda action
, która służy do wykonywania operacji związanych z poleceniem find
. Włączając tę metodę do naszej bazy kodu, możemy zapewnić, że nasz program będzie zgodny ze strukturą przypominającą dostarczony szablon. W rezultacie wynikowa konfiguracja naszego kodu będzie miała format podobny do poniższego:
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) => {});
Uwzględniając dostarczoną konfigurację, wykonanie żądania dla trzech instancji “lol” wraz z odpowiednimi ilustracjami może wyglądać następująco:
urbanary-cli find lol -e -c 3
Alternatywnym podejściem do rozwiązania tego problemu może być zbadanie innej perspektywy lub strategii radzenia sobie z nim. Jedną z możliwości jest rozważenie innych dostępnych opcji, które mogą zapewnić bardziej korzystne wyniki niż te, które są obecnie realizowane. Może to obejmować poszukiwanie dodatkowych informacji na temat potencjalnych rozwiązań lub konsultacje z ekspertami w odpowiednich dziedzinach, którzy mogą zaoferować cenne spostrzeżenia i zalecenia. Podejmując takie kroki, możemy dążyć do osiągnięcia lepszych wyników, unikając jednocześnie negatywnych konsekwencji związanych z naszym obecnym sposobem działania.
urbanary-cli find lol --example --count 3
Sprawdź stronę npm Commandera , aby dowiedzieć się więcej o nim i jak dostosować jego funkcje do różnych przypadków użycia.
Wdrażanie funkcjonalności programu
Włącz bibliotekę Axios do pliku index.js, wykonując następujące kroki:
const axios = require('axios');
W ramach parametrów funkcjonalnych metody obiektu “action” można włączyć niezbędny kod do interakcji z Urban Dictionary i przedstawienia wyników na podstawie wcześniej określonych preferencji.
Zacznij od zdefiniowania swojego żądania:
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'
}
}
Aby uzyskać dostęp do API za pomocą Axios, można wykorzystać następującą linię kodu:javascriptaxios.get(’ https://api.example.com/data’).then(response => {// obsłuż dane odpowiedzi tutaj}).catch(error => {// obsłuż błąd tutaj});
try {
let resp = await axios.request(requestOptions);
console.log(`Definitions for ${word} fetched`);
wordData = resp.data.list;
} catch (err) {
console.error(err.message)
}
Jedną z kluczowych informacji, których potrzebujemy z danych odpowiedzi, jest właściwość enumerable, która zawiera zbiór definicji i ilustracji.
Włącz poniższy fragment kodu do istniejącego bloku try, upewniając się, że obsługuje on dane wejściowe opcji i odpowiednio wyświetla odpowiednie dane wyjściowe:
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}`);
}
Niniejszy kod analizuje polecenia wejściowe za pomocą instrukcji warunkowych w celu ustalenia najbardziej odpowiedniej metody wyświetlania wyników. W przypadku podania parametrów obejmujących przykładową instancję, znak ograniczający i opcję zliczania, program będzie iterował dane dotyczące poszczególnych słów i odpowiednio wydrukuje wymaganą liczbę definicji i przykładowych instancji.
Funkcja wyświetli określoną liczbę definicji i/lub przykładów na podstawie danych wprowadzonych przez użytkownika. Jeśli przekazana zostanie tylko wartość “count”, wyświetlona zostanie określona liczba definicji bez przykładów. Podobnie, podanie “example” jako argumentu spowoduje wyświetlenie jednej definicji wraz z przykładowym zdaniem. W przypadku, gdy żadna z opcji nie zostanie określona, domyślnym zachowaniem będzie po prostu wyświetlenie definicji.
Aby uczynić aplikację wykonywalną, zacznij od włączenia linii shebang na początku pliku bin/index.js, umożliwiając jej działanie jako niezależnego skryptu.
#!/usr/bin/env node
Następnie przejdź do pliku package.json
w katalogu projektu i zmodyfikuj zawartość właściwości main
. Dodatkowo dołącz nową właściwość bin
do istniejącej, jak pokazano poniżej:
"main": "./bin/index.js",
"bin": {
"urbanary-cli": "./bin/index.js"
},
Zasadniczo sedno wykonywania projektu opartego na urbanary-cli leży w poleceniu wprowadzonym za pośrednictwem terminala. W związku z tym konieczne jest zastosowanie odpowiedniego tytułu dla tego polecenia podczas tworzenia aplikacji wiersza poleceń.
Aby pomyślnie zainstalować aplikację globalnie za pomocą npm, należy uruchomić polecenie “npm install -g” w terminalu. Ta czynność pozwoli na wykonanie aplikacji jako polecenia z tego samego terminala.
Przedstawiona ilustracja przedstawia procedurę instalacji i wykonania polecenia diagnostycznego w celu ustalenia przeznaczenia modułu lmk.
Opublikowanie swojej pracy w rejestrze npm (Node Package Manager) jest prostym procesem, który pozwala na szeroką dystrybucję i łatwą instalację projektu. Aby to osiągnąć, przejdź do folderu głównego projektu i wykonaj polecenie “npm publish” w terminalu. W ten sposób Twój projekt będzie dostępny dla innych do łatwej instalacji za pomocą polecenia “npm install”.
Wykorzystanie Node.js ułatwia tworzenie i rozpowszechnianie aplikacji w przeciwieństwie do stosowania Rusta lub podobnych technologii do tworzenia interfejsów wiersza poleceń.
Buduj funkcjonalne aplikacje CLI z Node.js
Rzeczywiście, dla osób zaangażowanych w rozwój pakietu npm wymagającego uzupełniającego narzędzia wiersza poleceń lub dla programistów pragnących usprawnić swój przepływ pracy poprzez tworzenie niestandardowych narzędzi, pakiet Node.js Commander oferuje kompleksowe rozwiązanie umożliwiające urzeczywistnienie własnej wizji.
Można z łatwością rozszerzyć wrażenia użytkownika z interfejsów wiersza poleceń w swoich aplikacjach poprzez wykorzystanie dodatkowych bibliotek dzięki nieodłącznej wszechstronności i stabilności zapewnianej przez Node.js, który służy jako niezawodny fundament dla takich przedsięwzięć bez znaczących komplikacji.