Zanim przejdziemy do kodowania i używania narzędzi w praktyce, zapraszamy Cię do wpisu, który przedstawi narzędzia, biblioteki, frameworki i koncepty związane z tworzeniem front-endu. Wpis ten potraktujcie jako zajawkę, bo o wielu technologiach wspomianych tutaj będziemy również pisać szerzej, a przede wszystkim stosować w praktyce.
Oczywiście, to co zobaczycie poniżej to jedynie wybrane i popularne z nich (możliwości jest znacznie więcej, a front-end jest super dynamiczną dziedziną programowania, która zmienia się bardzo szybko). Gotowi?
Czym jest front-end?
Zacznijmy od podstawy podstaw, czyli rozróżnienia front-endu od back-endu :) Chyba najprościej powiedzieć, że front-end to wszystko, co widzi użytkownik i z czego korzysta przeglądarka, podczas gdy back-end to warstwa serwerowa aplikacji (a więc zapis, obróbka danych, większość logiki biznesowej). I jeśli chodzi o konkretne przykłady takich warstw, to można śmiało zauważyć tendencje do ich rozdzielania od siebie. Patrząc nawet z perspektywy technologii javowych, jeszcze kilka lat temu aplikacja webowa “all-in‑1” z użyciem JSP czy JSF jako warsty widoku, była często wybieranym rozwiazaniem, tak teraz, o wiele więcej aplikacji jest tak naprawdę, nie jedną, a dwoma (kilkoma) różnymi aplikacjami, gdzie front-end stanowi odrębny projekt/odrębną aplikację. Taki projekt komunikuje się z back-endem za pomocą RESTowego API (i w taki sposób będziemy właśnie implementować nasze rozwiązanie). Front-end to nie tylko “wyświetlanie wyników” z back-endu, ale też odpowiednie projektowanie interfejsu i doświadczeń użytkownika (a więc UI/UX), a także biznesowe wymagania jak np. walidacje, filtrowanie, wyszukiwanie (część z tych zachowań będzie obsługiwana (lub dodatkowo obsługiwana) w warstwie front-endowej naszej aplikacji. W zależności od firmy, czy projektu obowiązki programisty front-endowego będą różne, albo zamiast sztywnego podziału na back-end czy front-end, będziesz po prostu zatrudniony na stanowisku full-stack developer (można dostrzec, że obecnie przybywa takich właśnie stanowisk).
Pozwolę sobie tutaj na małe wtrącenie do początkujących widzących to ostatnie zdanie — jeśli dopiero zaczynacie naukę programowania, zdecydowanie radzimy Wam skupienie się na jednej z tych dwóch wartstw. To znacznie ułatwi Wam naukę, przyśpieszy proces do znalezienia pierwszej pracy, a potem nauczenie się “tego drugiego” z doświadczeniem np. w backendzie, powinno być znacznie łatwiejsze. Dlatego, w naszym podstawowym kursie javy zobaczycie, że warstwa wizualna jest opracowana za pomocą JSP — głownie po to, by “była możliwa”, a z drugiej strony nie utrudniała (nie dokladała za dużo nowych informacji). Na start, sam back-end, czy sam front-end jest naprawdę ok.
Słowniczek
HTML
HTML pozwala Ci na dodatnie treści do twojej aplikacji, za pomocą specjalnych tagów.… ale, pisaliśmy już o nim więcej we wpisie: Podstawy HTMLa, do którego Cię serdecznie zapraszamy.
Dodatkowe materiały do nauki/zapoznania się z nim to:
- https://developer.mozilla.org/en-US/docs/Web/HTML
- https://pl.khanacademy.org/computing/computer-programming/html-css/
CSS
CSS (ang. Cascading Style Sheet) czyli kaskadowe arkusze stylów to język służący do opisu prezentacji treści na stronach WWW. Podobnie jak w przypadku HTML, znajdziesz o nim osobny wpis na naszym blogu!
Możesz jeszcze spotkać się z terminami LESS i SASS, to pre-procesory CSSa, które to rozszerzają go o nowe właściwości, zmienne, funkcje. Kod zapisany z ich pomocą jest bardziej czytelny. Porównanie obu tych narzędzi znajdziecie tutaj.
Single-page Application
To taka aplikacja, która zmienia swoje treści pod wpływem działań użytkownika bez konieczności ponownego załadowania. W ten właśnie sposób tworzy się współczesne aplikacje, bo zapewnia to znacznie lepszy user experience (użytkownik nie musi czekać na załadowanie całej strony od nowa, a np. dostaje komunikat bądź loading bar/mill, w czasie wykonywania zapytań do API.
DOM
DOM (Document Object Model — obiektowy model dokumentu), sposób reprezentacji dokumentów xml i html w postaci modelu obiektowego, który jest niezależny od platformy i języka. Model ten to drzewo, a każdy jego węzeł to obiekt przedstawiający inną część dokumentu.
UX
Nie sposób mówić o współczesnym front-endzie nie wspominając User Experience, czyli nauki skupionej wokół doświadczeń użytkownika. Współczesne aplikacje bardzo duży nacisk kładą na użyteczność i pozytywne doświadczenia użytkownika, tak by korzystanie z nich sprawiało przyjemność i satysfakcje.
Więcej informacji znajdziecie w artykułach poniżej:
Języki skryptowe
Języki skryptowe to języki, które nie wymagają kompilacji przed uruchomieniem. Programy napisane w ten sposób to właściwie pliki tekstowe (i tak, można je edytować nawet w notatniku), uruchamia się je za pomocą dodatkowego programu (interpretera / silnika skryptowego) i w momencie uruchomienia tekst (kod) jest interpretowany (zamieniany na postać zrozumiałą dla komputera i wykonywany). Zaletą tego podejścia jest to, że możemy szybko zobaczyć efekty zmian (po zmianie wystarczy odświeżyć stronę czy uruchomić ponownie i od razu widzimy zmiany). Minusem jest, że o błędach w kodzie (np. w składni) dowiemy się (najczęściej) dopiero w momencie uruchamiania tego konkretnego fragmentu kodu, co utrudnia szukanie błędów. Drugim minusem, który jednak nie będzie problemem w większości przypadków, jest mniejsza wydajność takich aplikacji. W ogólnym przypadku jednak w językach skryptowych pisze się szybciej, ale lepiej sprawdzają się w prostszych aplikacjach/projektach.
Do takich języków zaliczamy: Perl, JavaScript, PHP, Python, TypeScript, CoffeeScript.
JavaScript, ES6, CoffeeScript, TypeScript
JavaScript(JS) to język skryptowy, który powstał w 1995 roku. Pod koniec lat 90. ECMA zaczęła pracę nad specyfikacją (standaryzacją języka) i tak powstał ECMAScript, który jest wersjonowanym standardem (czyli dokumentacja ECMAScript powie Ci jak stworzyć język programowania (jej używa właśnie JavaScript), a dokumentacja JavaScript podpowie jak napisać aplikacje z użyciem tego języka). To co różni go np. od Javy to to, że jest słabotypowany, czyli tworząc zmienną nie musisz deklarować jej typu.
Być może spotkaliście się z opiniami, że w JavaScripcie można zrobić wszystko, że brak tam wzorców, czy dobrych praktyk. Było to na pewno prawdziwe do czasu gdy opublikowany został ES6 (ECMAScript 2015), który zmienił sporo w tej materii. Współczesny JavaScript nie tylko wymusza stosowanie dobrych praktyk, ale też daje do tego narzędzia. Dlatego współcześnie ucząc się JavaScriptu czy szukając odpowiedniej dokumentacji wpisuj raczej ES6 niż JavaScript! Przykładowe zmiany, które wprowadził ES6 możecie znaleźć tutaj: https://webapplog.com/es6/.
Równolegle do standaryzacji języka, pojawiały się języki, które miały ułatwić ustandaryzować pisanie w JavaScripcie (a także zwiększyć czytelność kodu), a ich najpopularniejsze przykłady to CoffeeScript i TypeScript.
CoffeeScript to język, który kompiluje się do JavaScriptu, a jego głownym założeniem było “It’s just JavaScript”. Powstał on w 2009 roku, przedstawił w swojej składni języka m.in. arrow operators, a w porównaniu do JavaScriptu jest znacznie bardziej “zwięzły”.
Z kolei TypeScript został stworzony przez Microsoft (pierwsza wersja opublikowana została w 2012 roku) jako nadzbiór JavaScriptu (co oznacza, że kod JavaScriptowy jest w pełni poprawnym kodem TypeScriptu). To, co głownie oferował, to mocne typowanie, klasy, czy interfejsy (dobre przedstawienie jego cech znajdziecie tutaj: https://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript), również kompiluje się do kodu javascriptowego, ale ma wykrywanie błędów w czasie kompilacji . Język ten był i jest silnie wspierany przez środowisko Angulara oraz firmę Microsoft.
Który z nich jest lepszy? Oczywiście nie ma na to pytanie jednoznacznej odpowiedzi i dużo wynika z prefenecji czy przyzyczajeń dewelopera, albo z drugiej strony wymagań projektu czy firmy.
Dodatkowe Linki:
- Dokumentacja JavaScript Mozilla: https://developer.mozilla.org/en-US/docs/web/javascript
- Porównanie TypeScript i CoffeeScript: https://www.slant.co/versus/374/378/~coffeescript_vs_typescript
Babel
Babel to narzędzie do transpilingu kodu napisanego np. w ES6/ES7 (współczesny standard JavaScript) do ECMAScript 5 (wersja standardu obsługiwana przez praktycznie wszystkie przeglądarki, nawet te nieaktualizowane od kilku lat), które jest współcześnie najszerzej ‘rozumiane’ przez przeglądarki. Jest to specjalny rodzaj ‘kompilacji’, którą możemy zdefiniować jako zamianę kodu w jednym języku, na kod w drugim. Transpiling to właśnie zamiana kodu napisanego w jednym języku (lub wg określonego standardu) na inny język o podobnym poziomie abstrakcji (można o tym myśleć jako o ‘tłumaczeniu’ kodu na tylko trochę inny język; w przeciwieństwie do kompilacji, która zamienia kod na język maszynowy).
Popularne Frameworki i biblioteki JavaScriptowe
Pakiet / biblioteka
(ang.package/library) to reużywalny kod, który możesz pobrać z internetu, i wykorzystać w swoim projekcie. Niektóre biblioteki będą korzystać z innych w swoim kodzie, więc jeśli będziesz ich używać, będziesz również potrzebował zależności do nich.
Poniżej znajdziecie krótkie opisy najpopularniejszych frameworków i bibliotek współcześnie stosowanych z JavaScriptem. Oczywiście, jest ich znacznie więcej, a poniższe informacje to tylko bardzo krótkie intro z odnośnikami do dokumentacji.
React
Biblioteka stworzona przez Facebook, głownym założeniem jest dwukierunkowy przepływ danych w cyklu:
- Na podstawie danych wejściowych w komponentach (props), jeśli dane się zmieniły warunkowo renderuje DOM (lub jego części). Jest to możliwe, ponieważ React używa tzw. Virtual DOM, o którym więcej przeczytasz tutaj (https://www.codecademy.com/articles/react-virtual-dom).
- Obsługa eventów, po wyrenderowaniu DOMa React deleguje eventy do event listenera. Na ich podstawie można zaktualizować dane w odpowiedzi (response).
- Jeśli dane zostały zmienione za pomocą eventu, proces powraca do 1.
React korzysta też z JSX, czyli nakładki na JavaScript umożliwiającej m.in. zawieranie kodu HTML bezpośrednio w JavaScriptowym kodzie. Założeniem Reacta jest też tworzenie i reużywanie komponentów reprezentujących elementy, z których tworzone są widoki.
Angular
Angular to javascriptowy framework oparty o TypeScript. Obecna wersja to Angular 4 (warto dodać, że pierwsza wersja czyli Angular.js znacznie różni się od Angular 2, ale 2 od 4 już nie tak bardzo, zwróć na to uwagę przy wyszukiwaniu tutoriali!). Jest on rozwijany przez Google’a. Angular przedstawia wiele koncepcji/wzorców odnośnie tworzenia aplikacji. Mamy więc pary komponent-kontoler, odpowiedzialne za wyświetlanie widoków, a także moduły czy serwisy… Po więcej info na ten moment możemy odesłać Was do dokumentacji, lub tego godzinnego wideo: https://www.youtube.com/watch?v=KhzGSHNhnbI
Vue.js
Vue (czytaj tak jak ang. view) to framework do budowania UI. Głowna biblioteka skupia się tylko na warstwie wyświetlania, co pozwala w łatwy sposób dodać ją do Twojego projektu. Jest to stosunkowo młoda technologia, która wyróżnia się (podobno, bo jeszcze nie sprawdziliśmy na własnej skórze) łatwością w nauce i lakkością (nie jest to wielki framework jak np. Angular).
Na pytanie który framework wybrać nie ma chyba jednoznacznej odpowiedzi ;) To zależy od wielu czynników, o których możecie przeczytać w kilku poniższych artykułach.
- https://medium.com/unicorn-supplies/angular-vs-react-vs-vue-a-2017-comparison-c5c52d620176
- https://medium.com/@samerbuna/which-javascript-frameworks-should-you-learn-in-2018-ecea9a27617d
Oboje na codzień w mniejszym lub większym stopniu korzystamy z Reacta i naszym zdaniem ( z punktu widzenia Full-Stack/Back-end Engineerów) jest on bardzo spoko :)
Poza tym warto wspomnieć o bibliotekach:
Jasmine
To biblioteka do testowania JavaScriptu, która korzysta z BDD. Jest niezależna od frameworków i posiada bardzo prostą i czytelną składnię.
Selenium
Selenium umożliwia tworzenie automatycznych testów symujujących zachowanie użytkownika w przeglądarce.
Immubtable.js
Biblioteka, która udostępnia niezmienne kolekcje i obiekty.
Redux
Biblioteka do zarządzania stanem w aplikacji (np. szeroko wykorzystywana w projektach reactowych).
A dla spragnionych jeszcze większej ilości ciekawych bibliotek polecamy poniższe linki:
Narzędzia
Zależność
(ang. dependency) są to wszystkie biblioteki z których korzysta Twój projekt, bezpośrednio, lub pośrednio (gdy biblioteka której używasz, wymaga innej do prawidłowego działania).
Pakiet manager
(ang. package manager) to narzędzie pozwalające na korzystanie z bibliotek opublikowanych w internecie. Pozwala ono na zarządzanie bibliotekami/pakietami, czyli pobranie odpowiednich ich wersji, dzięki czemu twój projekt może z nich korzystać.
Repozytorium pakietów
To miejsce w sieci, gdzie publikowane są biblioteki i frameworki. Takie projekty zawarte są potem w tzw. package registry (czyli, rejestrze pakietów) i dostępne do zaimportowania przez inne projekty.
Przykłady narzędzi:
- npm — open-Sourcowe repozytorium pakietów/pakiet manager dla JavaScript.
- yarn ‑pakiet manager dla projektów JavaScript, który korzysta z repozytorium npm.
Porównanie obu znajdziecie tutaj: https://www.keycdn.com/blog/npm-vs-yarn/
Task runner
to narzędzie pozwalające na automatyzacje zadań związanych z codzienną pracą z kodem. Takie zadania to np. sprawdzanie, czy pliki się nie zmieniły, uruchamianie testów czy np. liningu (o nim poniżej), aktualizowanie zależności w projekcie czy w końcu zbudowanie go i uruchomienie. Task runnery posiadają wbudowane zadania, ale również pozwalają na tworzenie własnych.
Przykłady technologii:
- Grunt i Gulp.js to dwa popularne task runnery, które pozwalają na zautomatyzowanie zadań tj, uruchomienie aplikacji, testów, odświeżenie aplikacji po zmianie i zapisie pliku.
- Webpack to tzw. Bundler, który zajmuje się przetwarzaniem modułów i zależności w statyczne asety dla naszej aplikacji. Jego możliwości są większe niż możliwości task runnerów.
Porównianie tych narzędzi: https://da-14.com/blog/gulp-vs-grunt-vs-webpack-comparison-build-tools-task-runners
Linter
to narzędzie, które umożliwia analizę kodu pod kątem potencjalnych błędów, niestosowania wzorców, niespójnego formatowania kodu itp. Zazwyczaj, jest ono używane przed kompilacją (stąd mówimy o takiej analizie kodu statyczna). Pozwala on na korzystanie z predefiniowanych zasad, importowanie ich z zewnętrznego źródła lub dodawanie własnych.
Przykładowe technologie:
Formater
(ang. code formatter) — narzędzie, które służy do formatowania twojego kodu na podstawie zestawu zasad. Formater może być cześcią edytora kodu, i np. może być uruchamiany z każdym zapisem pliku, albo może stanowić osobne narzędzie, które uruchamione na kodzie, zmieni go wg wytycznych.
Przykładowy formater to : Prettier
Style guide
Zestaw zasad odnośnie formatowania i organizacji kodu.
Przykład:
Tyle od nas dziś, potraktujcie ten wpis jako zapowiedź tego, co przed nami. W ramach kolejnych lekcji pojawią się omówienia wybranych technologii, a także, będziemy tworzyć własną aplikacje frontendową! :) My nie możemy się doczekać, a wy? A może macie jakieś ulubione narzędzie / bibliotekę, która powinniśmy pozać? Śmiało zostawcie komentarz!