Blog (39)
Komentarze (405)
Recenzje (0)
@molexorWeści z frontu część 2 — Webpack

Weści z frontu część 2 — Webpack

16.11.2016 21:47, aktualizacja: 17.11.2016 09:53

W poprzednim wpisie podejmowaliśmy parę decyzji, dotyczących naszego wyimaginowanego projektu frontendowego. Dziś, umotywuję jedną z nich.

608333

Bez zbędnych ceregieli, opisywania historii, wstępów i upiększeń. Przejdźmy do rzeczy. Co będziemy robić poprzez webpacka

  • Zarządzanie zależnościami
  • Budowanie paczki docelowej
  • Ładowanie obrazków , SASS-ów, fontów itd
  • Transpilacja
  • Serwer deweloperski i integracja z przeglądarkami

Zarządzanie zależnościami

Pytanie: jak dołączyć do projektu bibliotekę angular?

Dodać do HTML-a coś takiego:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>

Ok. Lub lokalnie

<script src="libs/angular.min.js"></script>

jeśli zainstalujemy angulara przez npm‑a (bo bower już jest nie fajny)

<script src="node_modules/angular/angular.min.js"></script>

OK. Fajnie, ale oznacza to, że "na produkcje" musimy przenieść dokładnie taką strukturę katalogów. Co więcej zawartość katalogu node_modules jest większa niż nasze potrzeby:

-rw-rw-r-- 1 michal michal     343 lip 22 17:29 angular-csp.css
-rw-rw-r-- 1 michal michal 1187559 lip 22 17:29 angular.js
-rw-rw-r-- 1 michal michal  160048 lip 22 17:29 angular.min.js
-rw-rw-r-- 1 michal michal   56905 lip 22 17:27 angular.min.js.gzip
-rw-rw-r-- 1 michal michal  430959 lip 22 17:29 angular.min.js.map
-rw-rw-r-- 1 michal michal     133 lip 22 17:29 bower.json
-rw-rw-r-- 1 michal michal      48 lip 22 17:27 index.js
-rw-rw-r-- 1 michal michal    1074 lip 22 17:27 LICENSE.md
-rw-rw-r-- 1 michal michal    2396 lis  9 21:52 package.json
-rw-rw-r-- 1 michal michal    1885 lip 22 17:27 README.md

Będziemy potrzebować do tego narzędzia, ale musielibyśmy się trochę napocić z konfiguracją w większym projekcie.

OK. to zobaczmy jak to wygląda w webpacku

Tu jest inaczej. Mamy jeden pliczek główny(lub kilka, ale o tym może w następnym wpisie). Nazwijmy go index.js Od niego wszystko się zaczyna, jest punktem wejścia. A co w środku?

require("angular");

Tak. takie coś powinno dać radę(!!!!!) Zapewni że pliki angulara znajdą się w naszym projekcie, zostaną odpowiednio przetworzone i spakowane.

Tak postępujemy z bibliotekami. Podobnie załączamy inne nasze pliki, podając ścieżkę relatywną

require("./appModule.js");

Oczywiście nic nie stoi także na przeszkodzie, aby zależności umieszczać także w innych plikach niż plik główny. Utworzony w ten sposób łańcuch zależności zapewnia spójność aplikacji, ale także zapewnia że pliczki których nie chcemy, nigdy nie znajdą się w paczce. Mowa np. o plikach z testami.

Budowanie paczki docelowej[

Mamy łańcuch zależności, który zapewnia nam budowanie paczki. Tylko , co w tym wypadku oznacza budowanie?

W konfiguracji webpacka podajemy miejsce docelowe i......


michal@cośtam:~/fakePath$ ls  -lh dist/
-rw-rw-r-- 1 michal michal 1,1M lis 12 10:08 build.js
-rw-rw-r-- 1 michal michal 1,5M lis 12 10:08 build.js.map
-rw-rw-r-- 1 michal michal     460 lis 12 10:08 index.html

Tak może wyglądać przykładowy wynik działania webpacka. Wszystkie zależności znalazły się w pliku build.js.

(idąc za podanymi przykładami znalazłaby się tu biblioteka angular, nasz plik appModule.js, oraz to, co w index.js)

Dodatkowo w plik index.html wstrzyknięto tag src z naszym "buildem".

Ot takie proste! Wszystko czego potrzebujemy jest zawarte w jednym pliku!

Ładowanie obrazków , SASS-ów, Fontów itd

Oprócz ładownia plików JS możliwe jest także ładowanie innych typów plików. Obrazów, fontów, arkuszy Sass itd. Mechanizm jest ten sam.


var url = require("file!./file.png");
require("./style.scss");
// zmienną  url możemy wykorzystać później

Obrazki załadowane bezpośrednio w kodzie HTML także zostaną dołączone


<img class="media-object" src="./cat.jpg" alt="..." height="100">

To nam daje naprawdę szereg nowych możliwości. Na czele z największą zaletą:

W podejściu komponentowym, jesteśmy w stanie w jednym folderze źródłowym zamknąć wszystkie pliki potrzebne dla danego komponentu. Kod, style, szablon html, obrazki .... Słowem wszystko w jednym miejscu . Wystarczy tylko dodać "require" do naszego kodu i gotowe!

Transpilacja

Możemy także skonfigurować nasz system w ten sposób, żeby dokonywał transpilacji naszych plików przed dołożeniem ich do pliku wyjściowego. W tym celu moglibyśmy skorzystać wspomnianego w poprzednim wpisie babel js, lub wykorzystać język Typescript.

Odpowiednie ustawienie loaderów ( o tym mowa za chwilę) pozwoli nam w 100% pracować w TS, oraz wykorzystać znane z TS odpowiedniki "require" w postaci "import"

oto przykład pliku index.ts (TS !!!!)


import "angular";
const externalModulesNames:Array<any> = [
  'ngAnimate',
  'ngSanitize',  
  ];

var baseModule  = angular.module("App" , externalModulesNames);

Serwer i integracja z przeglądarkami

Jeśli jeszcze nie jesteś przekonany, to teraz pewnie już będziesz :) Webpack oferuje zintegrowany serwer WWW, dzięki czemu twoja aplikacja uruchomi się automatycznie. Co więcej - jeśli otworzysz 5 przeglądarek z adresem uruchomionego serwera, i będziesz sterował aplikacją na jednej, wszystkie 5 będzie się synchronizować. I tak. Mowa tu także o urządzeniach mobilnych, czyli możesz w jednym czasie testować WSZYSTKO!

608376

Opowiadać można by długo. Najlepiej zobaczyć to wszystko w "w akcji".

Zapraszam do pobrania projektu testowego i uruchomienia go poleceniami:


npm intstall
npm start 

( uwaga - może wystąpić problem z instalacją sass-a. Użytkownicy linuxa powinni mieć zainstalowane w systemie gcc, U żytkownicy windowsa narzędzia do budowania c++ )

Nie wspomniałem o konfiguracji, sposobie działania, loaderach itd. To dlatego że pełno jest na ten temat materiałów. Zanim zaczniesz się tego wszystkiego uczyć warto jest zobaczyć korzyści na własnej skórze.

Do następnego!

PS. jest to druga część. część pierwsza tu: KLIK Projekt na githubie KLIK I jakby kogoś interesowała konfiguuracja webpacka w nim to polecam przeczytanie plików w folderku webpack( lub zaczekanie do następnego wpisu :) )

Wybrane dla Ciebie
Komentarze (2)