Node.js to konsolowe środowisko uruchomieniowe dla programów napisanych w JavaScripcie. Powstało ono na silniku Chrome V8 i dzięki niemu, możemy uruchamiać JavaScriptowe programy poza przeglądarką! Jest to coś znacznie więcej niż tylko „serwer w JavaScripcie” jak często podsumowuje się Node’a.
W dzisiejszym poście napiszę prosty program działający w linii komend. Oczywiście użyję w tym celu Node’a. Nie będzie nic o asynchroniczności, serwerach czy modułach. Wprowadzenie do Node’a zacznę małymi kroczkami. Stworzona tu aplikacja pomoże przywyknąć do tego środowiska i będzie delikatnym wprowadzeniem do bardziej zaawansowanych zagadnień.
Aby móc używać Node’a należy go najpierw zainstalować. Instalkę pograć można z głównej strony projektu. Tam też znajduje się instrukcja jak przeprowadzić instalację (nic skomplikowanego 🙂 ).
Kolejny krok to odpalenie linii komend. W windowsie będzie to program cmd a na systemach unixowych terminal. Następnie wystarczy wpisać node aby uruchomić to środowisko.
W terminalu można teraz robić to samo co w konsoli w przeglądarce internetowej. W wyniku wpisywania poleceń w javascripcie użytkownik otrzyma spodziewane odpowiedzi:
Jednak pomimo tego, że wygląda to do konsoli przeglądarki, nie jest to to samo środowisko. W przeglądarce globalnym obiektem jest window. Takie deklaracje, będą w niej równe:
1 2 |
var a = 3; window.a = 3; |
W środowisku Node odwołanie do obiektu window spowoduje błąd, ponieważ taki obiekt nie istnieje. Zamiast tego Node posiada obiekt o nazwie global. To jest nadrzędna przestrzeń nazw poza przeglądarką.
Kolejnym obiektem przeglądarki, który jest często używany jest document. Jak łatwo się domyślić, on również nie jest dostępny w Node. Zamiast niego, Node udostępnia obiekt process, czyli aktualny proces komputera. Ten obiekt, może być bardzo przydatny w aplikacjach konsolowych.
Ale gdyby Node był tylko konsolą, nie na wiele by się zdał. Na szczęście, można w nim uruchamiać programy, zapisane w plikach JavaScriptowych. Na przykład plik hello.js o takiej zawartości:
1 2 3 4 5 6 7 |
var hello = "hello world"; function greet(msg) { console.log(msg); } greet(hello); ; |
Ten plik uruchamia się z konsoli wpisując node hello. Nie trzeba dodawać rozszerzenia pliku. Oto wynik:
jak widać, w takim wypadku nie należy uruchamiać konsoli node’a. Pliki JavaScript można odpalać bezpośrednio z linii komend. Najpierw wpisuję polecenie node, a po spacji ścieżkę prowadząca do pliku, który chcę odpalić. Ścieżka jest relatywna do mojej aktualnej lokacji w strukturze plików.
Ok skoro już wiadomo, jak działają podstawy, czas stworzyć prostą aplikację działającą w linii komend komputera. Ta aplikacja to uproszczona wersja listy, do której użytkownik, będzie mógł dodawać i usuwać elementy. Będzie on mógł również wyświetlić aktualnie znajdujące się na liście elementy.
Oto treść programu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
var readline = require("readline"); var rl = readline.createInterface(process.stdin,process.stdout); var data = []; rl.setPrompt("--> "); rl.prompt(); rl.on("line",function(text){ var words = text.split(" "); var action = words.shift(); var finalText = words.join(" "); switch(action){ case "view": console.log("list items",data); break; case "add": console.log("adding",finalText); data.push(finalText); break; case "remove": if(data.indexOf(finalText) > -1){ var removeIndex = data.indexOf(finalText); data.splice(removeIndex,1); console.log("removing",finalText); } else { console.log("item not found"); } break; default: console.log("unknown action"); break; } rl.prompt(); }) |
Już pierwsza linijka jest typowo „Node’wa”. Funkcja require, służy do załadowania dodatkowych modułów. Mogą to być zarówno moduły napisane przez innych programistów, jak i dodatkowe funkcje Node’a, które nie są dostępne od razu w procesie. Moduły opiszę szczegółowo w innym poście, póki co wystarczy wiedzieć, że pierwsza linijka, dodaje do mojego programu obiekt readline, który normalnie nie byłby dostępny. To coś jak include w językach c/c++.
Readline służy do wczytywania do programu wpisanych przez użytkownika w konsole wiadomości. W drugiej linijce tworzę obiekt rl, do którego przypisuję interfejs readline. Interfejs jest czymś jak kontekst dla płótna. Dzięki niemu będę mógł komunikować się z procesem. Podczas tworzenia interfejs otrzymuje dwa argumenty, pierwszy to wejście dla danych a drugi to wyjście. Korzystam z obiektu process, który ma zdefiniowane pola standardowego wejścia i wyjścia i przekazuje je interfejsowi readline. W praktyce oznacza to, że interfejs będzie czytał z klawiatury i wypisywał informacje w konsoli 🙂 .
Następnie deklaruję tablicę data. W niej będę przechowywał wszystkie dane listy.
Kolejne dwie linijki to wywołanie metod interfejsu readline: setPrompt oraz prompt. Pierwsza przyjmuje jeden argument, łańcuch znaków. Ten łańcuch będzie wykorzystywany jako znak zachęty do pisania w konsoli. Metoda prompt wyświetla ten znak.
Pozostała część kodu jest w funkcji zwrotnej, wywoływanej przez zdarzenie line. Zdarzenie to wykrywane jest przez interfejs readline i oznacza wpisanie przez użytkownika, czegoś w konsole. Funkcja zwrotna jako argument otrzymuje wpisany tekst.
Reszta to już standardowy JS. Pierwsze słowo wpisanego tekstu, ma być poleceniem dla programu. Odcinam je i przypisuje do osobnej zmiennej. Następnie konstrukcją switch uruchamiam odpowiednie dla danego polecenia zachowanie. Jeżeli polecenie nie jest znane, wyświetla się odpowiedni komunikat.
Przykładowe działanie programu w konsoli wyglądać będzie tak:
Jak widać wszystko śmiga idealnie 🙂
Pierwszy program w Node.js napisany. W kolejnym poście opisze dokładniej jak działają moduły i jak można je wykorzystywać. Jeżeli nie chcesz przeoczyć tego posta, zachęcam do polubienia mojej strony na facebooku. Zawsze zamieszczam tam informacje o nowościach na blogu.
U mnie nie działa. Brak definicji ‚console’. Błąd czasu wykonania.
Możesz mi coś odpisać na kordian.bober@wp.pl?
Dzięki koleś 🙂
Z tym tutorialem wystartowałem z NodeJS i z tego co widzę zapowiada się dobrze 😀