Witaj w challengu Node.js, gdzie codziennie przez 7 dni zdobędziesz konkretną dawkę informacji dotyczących Node.js oraz wykorzystasz ją w praktyce. Pamiętaj żeby wykonywać dni challengu po kolei - od dnia pierwszego do ostatniego (dzięki temu Twoja wiedza będzie poukładana i kompletna).
Każdy dzień to jeden temat przewodni. W jego ramach stworzysz aplikację Node.js, która faktycznie będzie potrafiła coś zrobić - od razu zobaczysz wynik swojej pracy.
Kilka ważnych informacji
Przed przystąpieniem do rozwiązywania zadań przeczytaj poniższe wskazówki
Do pełnego i satysfakcjonującego doświadczania tego challengu jest potrzebna znajomość JavaScript z elementami ES6. Jeżeli potrzebujesz informacji z zakresu ES6 to znajdziesz je tutaj: tutorial ES6.
Poszczególne zadania rozwiązuj w odpowiednich plikach.
- Pierwszy dzień to wstęp do Twojej przygody z Node.js - dowiesz się w jaki sposób przygotować środowisko oraz jak pisać i testować programy Node.js.
- W kolejnych dniach dowiesz się w jaki sposób za pomocą Node.js wchodzić w interakcję z systemem operacyjnym (np. modyfikować pliki czy dokonywać szyfrowania).
- Druga część challengu jest poświęcona tworzeniu back-endu - dowiesz się jak stworzyć własny serwer.
- Pod koniec doświadczysz roli full-stack developera - stworzysz komunikujący się ze sobą front-end i back-end.
Node.js jest środowiskim uruchomieniowym JavaScript poza przeglądarką. Pozwala więc na użycie znanego Ci JS po stronie back-endu, ale także do tworzenia aplikacji systemowych, narzędziowych i innych.
Podczas tych 7 dni poznasz zarówno możliwości integracji z systemem operacyjnym, jak i stworzenia w pełni działającego back-endu. Dogłębne poznanie Node.js pozwala także wykorzystywać go w innych zastosowaniach, np. do pisania aplikacji okienkowych, mobilnych, w chmurze, IoT, czy sztucznych sieciach neuronowych.
Jeżeli jesteś programistą front-end to bardzo możliwe, że posiadasz już zainstalowany Node.js! Jest on szeroko używany w takich narzędziach jak WebPack czy Gulp.
Uruchom terminal/linię komend i wpisz następujące polecenie:
node -v
Jeżeli zobaczysz napis podobny do tego:
$ node -v
v6.9.5
to Twoje środowisko jest już gotowe do działania z Node.js - możesz pominąć dział Instalacja Node.js! Jeżeli widzisz natomiast informację o braku polecenia lub programu, bądź wersja jest poniżej v6 to wykonaj poniższe kroki.
Wejdź na stronę pobierania Node.js, wybierz wersję LTS odpowiednią dla Twojego systemu operacyjnego. Postępuj według wskazówek, żeby zainstalować Node.js.
Jeżeli ciekawi Cię co oznacza wersja LTS - jest to taka wersja oprogramowania, której wsparcie zostało przedłużone (z ang. long term support). Nie będzie więc szybko porzucona i jest wspierana przez kilka lat.
Wszystkie ćwiczenia będziesz wykonywać na plikach w folderze app
tego repozytorium. Pamiętaj, aby otrzorzyć linię komend/terminal i przejść nim do tego folderu. Przykładowo, jeżeli to repozytorium sklonowałeś/aś do folderu /home/ja/Node.js_challenge_dzien_1
to wykonaj komendę:
cd /home/ja/Node.js_challenge_dzien_1/app
Teraz już możesz uruchomić program Node.js :) Wykonujemy to za pomocą komendy:
node nazwa_pliku [ewentualne argumenty]
Śmiało, spróbuj to zrobić już teraz! W katalogu app
znajduje się plik test.js
, aby go uruchomić wpisz:
node ./test.js
Powinna się pokazać poniższa informacja:
Wygląda na to, że wszystko działa :)
Pamiętaj, aby linia komend/terminal był otwarty na katalogu
app
!Jeżeli ta komenda nie działa u Ciebie to możesz ew. spróbować:
nodejs ./test.jsJeżeli nadal nic to nie da to jeszcze raz zainstaluj Node.js jeszcze raz, a następnie zrestatuj komputer.
Kiedy uruchamiamy program napisany w Node.js poprzez wskazanie pliku, to jest on traktowany podobnie jak w przeglądarkowym JavaScript-cie. Wykonywane są wszystkie komendy od góry do dołu.
Nauczymy się teraz kilku podstawowych i standardowych funkcji/metod wbudowanych w Node.js i dostępnych dla nas od razu. To pomoże nam zrozumieć działanie Node oraz wykonać pierwsze operacje.
W Node.js możesz korzystać z bardzo podobnego API do wypisania tekstu, jak w przypadku przeglądarki. Jest to przemyślana decyzja twórców Node, żeby front-endowiec mógł łatwo wykorzystać nowe narzędzie.
W związku z tym aby w linii komend/terminali wypiswać dowolną informację możesz skorzystać np. z:
console.log('Mój tekst');
Możemy także wykorzystać standardowe funkcje czasu takie jak np.:
setTimeout(() => {
//Funkcja wykona się po 2s.
}, 2000);
czy
setInterval(() => {
//Funkcja wykona się co 1s.
}, 1000);
Należy zwrócić szczególną uwagę na znaczenie tych funkcji w kontekście Node.js.
Jeżeli nasz program zawiera np. komendę która od razu ma coś zrobić i nic więcej - to od razu po jej wykonaniu Node.js zakończy wykonywane programu.
Jeżeli jednak w naszym kodzie jest setTimeout
, setInterval
(lub inne funkcje powodujące uruchomienie czegoś w przyszłości) to Node.js zgodnie z naszą intencję nie zakończy od razu programu.
- W przypadku setTimeout dopiero po wykonaniu odroczonej w czasie funkcji program zakończy się.
- Użycie setInterval spowoduje natomiast, że taki program w Node.js nigdy sam się nie zakończy w normalnych warunkach. Aby go zakończyć najprościej będzie użyć
clearInterval
lub ręcznie zakończyć proces (np. skrótemCtrl+C
).
Jeżeli korzystasz z WebPacka, czy Gulpa z watch
to znasz już miejsce gdzie jest to potrzebne. Dzięki temu proces działa cały czas i wykonuje powierzone mu zadania.
Za kilka dni zobacysz, że takie specjalne traktowanie pewnych funkcji przez Node.js jest też bardzo przydatne przy budowaniu back-endu.
Oto przykładowy program Node.js, który wypisuje po jednym znaku "Hello, World", a na końcu przerywa swoje działanie.
const text = 'Hello, World!';
let counter = 0;
//Program wyświetla po znaku z tekstu...
const intervalId = setInterval(() => {
console.log(text[counter]);
counter++;
//...ręcznie musimy mu powiedzieć kiedy należy przerwać wykonywanie - wtedy proces Node.js się zakończy
if (counter === text.length){
clearInterval(intervalId);
}
}, 400);
Po uruchomieniu takiego programu zobaczymy:
$ node ./test.js
H
e
l
l
o
,
W
o
r
l
d
!
$_
Na samym początku, podczas uruchamiania programu, była informacja o opcjonalnych argumentach. Są to dane wejściowe, które możemy przekazać do naszego programu - są one jak parametry funkcji.
Korzystając z różnych narzędzi możesz trafić na sytuację, że przekazujemy do programu Node.js jakiś argument, np.:
gulp watch
To polecenie jest tak na prawdę wewnętrznie skrótem np. do:
node /home/some/path/bin/gulp.js watch
Jeżeli będziemy potrafili obsłużyć przekazywane argumenty, to nasz program może stać się przydatnym narzędziem.
W każdym programie Node.js masz do dyspozycji zmienną globalną process
, która reprezentuje uruchomienie właśnie Twojego programu. Można z niej odczytać wiele informacji na temat środowiska uruchomieniowego.
Aby otrzymać listę wszystkich argumentów możemy wykorzystać tablicę process.argv
. Zawiera ona następujące informacje:
- Pierwszy argumentem jest pełna ścieżka do procesu interpretera Node.js.
- Drugi argument to pełna ścieżka do głównego pliku Twojego programu.
- Drugi i kolejne argumenty mogą być dodatkowymi argumentami - przekazywanymi właśnie podczas uruchamiania programu.
Zobacz poniższy kod:
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
});
Jeżeli uruchomisz swój program tak:
node ./test.js
to zobaczysz przykładowo:
0: /home/bin/node
1: /home/js/challenge/test.js
Możesz jednak przekazać dodatkowe argumenty, np.:
Jeżeli uruchomisz swój program tak:
node ./test.js test 123 Halo halo
wtedy zobaczysz np.:
0: /home/bin/node
1: /home/js/challenge/test.js
2: test
3: 123
4: Halo
5: halo
Jeżeli chcesz przekazać argument, który zawiera w środku spację, to otocz go "
(cudzysłowem), np.:
node ./test.js "Hello, World, dłuższy tekst!" test2
da np.:
0: /home/bin/node
1: /home/js/challenge/test.js
2: Hello, World, dłuższy tekst!
3: test2
Ćwiczenia wykonuj w odpowiednich plikach. W folderze
app
są one ponumerowane tak samo jak poniżej - zadaniu1. Rozgrzewka
odpowiada plikapp/zadanie01.js
itd. Aby uruchomić zadanie podaj jego nazwę (pamiętaj, aby linia komend/terminal był otwarty na kataloguapp
tego repozytorium), np.:node ./zadanie01.js
Napisz taki program Node.js, w którym wyświetlisz swoje imię i nazwisko. Następnie po 5 sekundach program powinien jeszcze wypisać wita się z Node.js!
i zakończyć swoje działanie.
Napisz program, który wypisze poniższe tekst zgodnie z zadaną kolejnością. Najpierw jest informacja po jakim czasie od uruchomienia programu tekst powinien się pojawić, a następnie jaki to tekst. Jaki tekst się ułożył :) ?
- Po 4 sekundach od uruchomienia:
Node.js
- Po 1 sekundzie od uruchomienia:
się
- Od razu po uruchomieniu wyświetl:
Witam
- Po 6 sekundach od uruchomienia:
i korzystam
- Po 5 sekundach od uruchomienia:
w konsoli
- Po 7 sekundach od uruchomienia:
z funkcji czasu!
- Po 2 sekundach od uruchomienia:
z
- Po 3 sekundach od uruchomienia:
programem
Napisz program Node.js, który może przyjąć dwa argumenty: dwie liczby. Pamiętaj, że argumenty są zawsze tekstem - zamień je w liczbę np. za pomocą Number(liczba)
lub parseInt(liczba)
.
Następnie wykonaj dodawanie tych dwóch liczb i je wypisz.
Przykładowo uruchomienie:
node ./zadanie03.js 2 4
Powinno wypisać 6
.
* Jeżeli chcesz to możesz spróbować zrobić bardziej zaawansową wersję tego zadania. Twój program umożliwia w niej podanie dowolnej ilości liczb jako argumenty i wyświetla ich sumę. Przykładowo uruchomienie:
node ./zadanie03.js 1 2 3 4Powinno wypisać
10
.Pamiętaj, że dwa pierwsze argumenty tablicy
process.argv
trzeba pominąć!
Sleep sort to zabawny sposób sortowania liczb. Polega on na tym, że każda liczba jest wypisana dopiero po tylu sekundach ile wynosi jej wartość.
Przykładowo posiadając liczby: 4, 1, 7, 4, 5
wypisujemy 4
po 4 sekundach, 1
po sekundzie, 7
po 7 sekundach itd. Przez to program w tym przypadku wykonuje się 7 sekund a jego wyjście wygląda w ten sposób:
1
4
4
5
7
Stwórz program Node.js, który może przyjąć dowolną ilość argumentów: liczby. Pamiętaj, że argumenty są zawsze tekstem - zamień je w liczbę np. za pomocą Number(liczba)
lub parseInt(liczba)
. Pamiętaj, że dwa pierwsze argumenty tablicy process.argv
trzeba pominąć!
Następnie wypisz w konsoli liczby od najmniejszej do największej korzystając ze sleep sort. Do zadania użyj setTimeout
, a czas mnóż razy 1000 (żeby 1
odpowiadało jednej sekundzie).
Przykładowo uruchomienie programu w ten sposób:
node ./zadanieDnia.js 8 4 10 8 4 6 1 2
Potrwa 10 sekund i wyświetli na końcu:
1
2
4
4
6
8
8
10
To wszystko na dziś - gratulacje! Do jutra :)