V současnosti je stále běžnějším trendem nasazování aplikací do cloudového prostředí, kde se kontejnerizace stává klíčovým nástrojem pro dosažení efektivity a škálovatelnosti. Docker se v tomto ohledu ukázal jako jedinečný nástroj, který umožňuje vytváření, správu a nasazování aplikací v izolovaných prostředích, jež mohou běžet jak na lokálních strojích, tak v prostředí cloudu.
Pokud chceme správně implementovat kontejnerizaci v našem projektu, je potřeba nejen pochopit základní principy fungování Dockeru, ale také umět efektivně integrovat tyto nástroje s cloudovými službami. Tento proces zahrnuje několik klíčových kroků.
Představme si například aplikaci, kterou chceme nasadit na cloudové servery. Nejdříve musíme vytvořit Dockerfile, soubor, který obsahuje instrukce pro sestavení obrazu aplikace. Tento soubor popisuje všechny kroky potřebné pro přípravu a spuštění aplikace ve formě kontejneru. Mezi základní kroky patří nastavení pracovní složky, kopírování souborů do kontejneru a definování základního obrazu, který bude použit pro spuštění.
Další krok zahrnuje sestavení obrazu a jeho testování. Použití příkazů jako npm run docker:build nebo npm run docker:debug nám umožní ověřit, že náš kontejner je správně sestaven a připraven k nasazení. Tyto příkazy také spustí náš kontejner, což nám poskytne možnost ověřit, zda aplikace funguje dle očekávání, a zjistit, jak se chová v testovacím prostředí.
Pokud je vše v pořádku, můžeme obraz publikovat do online registru Dockeru pomocí příkazu npm run docker:publish, čímž se obraz stává dostupným pro ostatní členy týmu a pro nasazení na produkční servery. Před nasazením je ovšem nutné ověřit, že image běží správně, což lze udělat pomocí příkazu docker ps, jenž ukáže běžící kontejnery, jejich stav a porty.
Pro efektivní práci s Dockerem v prostředí Visual Studio Code existuje rozšíření, které poskytuje pohodlný grafický rozhraní pro interakci s kontejnery a obrazy. To umožňuje například spouštět obrazy, označovat je nebo interagovat s běžícími kontejnery přímo z editoru, což zjednodušuje proces vývoje a testování.
Pokud mluvíme o nasazení do cloudu, máme k dispozici různé způsoby, jak kontejnery hostovat. Nejčastěji se využívají služby jako Azure, AWS nebo Google Cloud, které nabízejí širokou škálu nástrojů pro správu kontejnerů. S těmito službami se ovšem pojí různé úrovně kontroly a odpovědnosti, což je důležité vzít v úvahu při rozhodování o výběru platformy. V cloudových prostředích existují dvě hlavní možnosti: spravované a nesprávované služby. U spravovaných služeb je většina úkolů, jako je správa infrastruktury nebo bezpečnosti, delegována na poskytovatele, což usnadňuje nasazení a snižuje náklady. U nesprávovaných služeb je naopak větší odpovědnost na uživatelském týmu, který musí spravovat operační systém a další aspekty infrastruktury.
K tomu, abyste zajistili, že vaše aplikace bude v cloudu fungovat správně a efektivně, je nezbytné rozumět rozdílu mezi těmito modely a vybrat si správnou strategii pro nasazení. V některých případech se bude hodit využít cloudových nástrojů pro orchestrace kontejnerů, jako je Kubernetes, které umožňují automatické škálování kontejnerů na základě zatížení. Kubernetes také umožňuje spouštět a spravovat více instancí kontejnerů, což je ideální pro aplikace, které vyžadují vysokou dostupnost a flexibilitu.
Celý proces nasazování kontejnerů do cloudu by měl být součástí širší strategie kontinuální integrace a kontinuálního nasazení (CI/CD), která usnadní automatizaci testování, sestavení a nasazení aplikací. To znamená, že každý nový kód nebo změna v aplikaci bude automaticky testována a nasazena na produkci, což výrazně zvyšuje efektivitu vývoje a snižuje lidskou chybu.
Pro správu a monitorování těchto procesů je také dobré mít nástroje pro sledování a logování výkonu aplikace v reálném čase. Tímto způsobem získáte okamžitou zpětnou vazbu o chybách nebo problémech, které mohou nastat během provozu aplikace v cloudu. Užitečné mohou být také nástroje pro bezpečnostní audit, které vám pomohou detekovat možné slabiny a zranitelnosti v aplikaci nebo její infrastruktuře.
Jak optimalizovat architekturu pro malé a большие aplikace: přístup router-first
V průběhu vývoje softwaru se setkáváme s různými problémy, které se týkají nejen funkčnosti aplikace, ale i její struktury, škálovatelnosti a údržby. Bez ohledu na to, zda vyvíjíme malou aplikaci pro osobní projekt nebo rozsáhlý podnikový systém, je klíčové přistupovat k architektuře s ohledem na budoucí změny a potřeby. Tento text se zaměřuje na koncept router-first architektury, která je užitečná pro zajištění flexibilního, ale efektivního návrhu aplikace.
U malých aplikací, kdy je cílem rychle vytvořit funkční prototyp, často čelíme problému nedostatečného inženýrského úsilí, což může vést k riziku v budoucnu. Tento „under-engineering“ přístup, kdy se klade důraz na rychlost, může být v krátkodobém horizontu výhodný, ale v dlouhodobém měřítku se ukáže jako neudržitelný. Vývojáři tak riskují nutnost nákladného přepisování aplikace nebo ztrátu flexibility v okamžiku, kdy aplikace začne růst.
Naopak, velké podnikové aplikace čelí opačnému problému – začínají s nadměrným inženýrským úsilím. Architektura těchto systémů bývá obvykle složitá a zajišťuje rozsáhlé možnosti, které mohou být nakonec nevyužity. S rostoucí komplexitou systému se původní architektura může stát nedostatečnou, což si vynucuje nákladné změny. Tento problém se stává výrazný především u aplikací, které mají tisíce uživatelů a vysoké požadavky na rozšiřitelnost a stabilitu.
Mezi těmito extrémy se nacházejí aplikace, které nejsou ani příliš malé, ani příliš velké – tzv. LOB aplikace (Line of Business). Tyto aplikace se mohou vyvinout z malých aplikací, které postupně rostou, a přizpůsobují se konkrétním potřebám organizace. Na druhé straně mohou i velké podnikové aplikace s časem ztratit na významu a stát se specializovanými nástroji, které plní pouze jeden konkrétní účel v rámci firmy. V obou případech však může docházet k neefektivnímu řešení problému, který byl původně zamýšlen.
Když se podíváme na celkovou dynamiku vývoje softwaru, zjistíme, že skutečné nároky na architekturu aplikace nejsou vždy předvídatelné. I když plánování a inženýrství mohou pomoci, bez ohledu na to, jak dobře se připravíme, obchodní potřeby a technologie se mohou v průběhu času změnit. Proto je důležité mít flexibilní přístup k architektuře, který zohledňuje dynamiku změn a zároveň zajišťuje efektivní implementaci požadovaných funkcí. K tomu nám může pomoci pravidlo 80-20, které se zaměřuje na nalezení rovnováhy mezi flexibilitou a adekvátní podporou požadavků byznysu.
Router-first architektura je jedním z přístupů, který umožňuje udržet optimální inženýrský overhead – tedy náklady na údržbu a rozšiřitelnost kódu, aniž by to vedlo k nákladným přepisům nebo zbytečnému zpomalování vývoje. Tento přístup je zaměřen na dosažení rovnováhy mezi potřebou flexibilního a adaptivního návrhu a požadavky na rychlé doručení funkcí.
Je třeba také brát v úvahu, že software nevytváříme jen pro své vlastní potřeby, ale pro potřeby dalších lidí – tedy kolegů a uživatelů. Experimentování v kódu může být užitečné, ale pouze tehdy, pokud jsme schopni zohlednit rozdílné dovednosti a zkušenosti členů našeho týmu. Je důležité mít na paměti, že ne každý má stejné dovednosti a zkušenosti, a experimentování bez dostatečného pochopení kontextu může vést k problémům s údržbou kódu nebo zmatkům v týmu. Disciplinovaný přístup k vývoji je klíčový pro zajištění, že všechny změny budou mít dlouhodobý pozitivní efekt na celý projekt.
Optimální inženýrský overhead znamená, že architektura podporuje nejen krátkodobé potřeby aplikace, ale zároveň je dostatečně rozšiřitelná, aby se mohla přizpůsobit změnám v budoucnu. Tento přístup není pouze o správě technologií, ale i o správném plánování a udržování harmonického vztahu mezi funkcemi, náklady na údržbu a schopností reagovat na nové požadavky.
Jedním z principů router-first architektury je zaměření na vysokou úroveň myšlení, což zahrnuje zajištění shody na funkcích před začátkem kódování, plánování růstu kódu a týmu, a zavádění minimálního inženýrského overheadu. Tento přístup zahrnuje několik klíčových kroků, jako je vývoj mapy a rozsahu projektu, návrh s ohledem na lenivé načítání, implementace kostry navigace, dosažení stateless, daty řízeného návrhu, a podpora modulární architektury, která usnadňuje opětovné použití kódu a umožňuje lepší spolupráci mezi vývojáři.
Pro implementaci router-first architektury je nezbytné dobře pochopit role a funkce jednotlivých modulů v rámci aplikace. U Angular aplikací jsou klíčovým konceptem funkční moduly, které usnadňují lenivé načítání a umožňují efektivní správu závislostí mezi komponentami. S příchodem Angular 17, kdy jsou standalón komponenty povoleny výchozím nastavením, se zjednodušuje struktura aplikace, což usnadňuje její údržbu a rozšiřování.
Pokud máte správně nastavený inženýrský základ a používáte router-first přístup, můžete dosáhnout efektivní správy a rozšiřování aplikace bez toho, abyste čelili problémům, které přináší nadměrné inženýrství nebo nekontrolované experimentování s novými technologiemi.
Jak vytvářet aplikace s architekturou škálovatelnou na podnikové úrovni
Angular představuje robustní a flexibilní platformu pro vývoj složitých webových aplikací, které jsou schopné efektivně zvládat různé požadavky, zejména v rámci podnikového prostředí. Tento rámec je postaven na TypeScriptu a podporuje reaktivní programování pomocí knihoven jako RxJS a NgRx. To vše se odráží v jeho schopnosti přizpůsobit se a škálovat s rostoucími potřebami aplikace a týmu.
V první kapitole knihy, která se zaměřuje na architekturu a základní koncepty Angularu, je vysvětleno, jak pracovat s touto platformou při vývoji vysoce výkonných aplikací. Kromě reaktivního programování, které je v Angularu klíčové, jsou zde uvedeny i principy jako Flux pattern, standalone komponenty a detailní reaktivita s využitím Signals. Tato témata jsou zásadní pro porozumění základům a dalším rozšiřování Angular aplikací.
Ve druhé kapitole se čtenář seznámí s tvorbou funkcí vyhledávání a interakcí mezi komponentami, čímž si osvojuje práci s formuláři, observables, signals a subjects. Tato kapitola klade důraz na to, jak správně minimalizovat riziko úniků paměti, což je při práci s reaktivním programováním klíčové. Rozdíl mezi imperativním a reaktivním stylem programování, který je s Angular aplikacemi často spojen, je zde podrobně vysvětlen, stejně jako způsoby optimalizace výkonu aplikací pomocí signals.
Třetí kapitola se zaměřuje na vytváření architektury pro podnikové aplikace. Zde se čtenář seznámí s nejlepšími praktikami pro úspěšné řízení Angular projektů na podnikové úrovni, jako je například optimalizace výkonu podle pravidla 80/20 nebo důraz na používání Router-first architektury. Tyto techniky jsou nezbytné pro zajištění kvalitního a stabilního vývoje aplikace, která musí splňovat náročné podmínky podnikového prostředí.
V páté kapitole je pozornost věnována návrhu autentizace a autorizace v aplikacích Angular. Implementace tokenové autentizace s JWTs, implementace OOP principů pro vytváření rozšiřitelných služeb a zajištění bezpečnosti pomocí HTTP interceptors patří mezi klíčové body, které si vývojář musí osvojit. Tento proces zahrnuje i využití mezipaměti a techniky pro ochranu stavu přihlášení uživatele, což je klíčové pro úspěšné nasazení aplikace v reálném světě.
Ve čtvrté kapitole je podrobně popsaný postup při návrhu aplikací s router-first architekturou. To zahrnuje nejen definování rolí, ale i lazy loading, což znamená načítání komponent až v momentě, kdy je skutečně potřeba. To nejen šetří čas, ale i systémové zdroje. V této kapitole je rovněž zdůrazněna důležitost návrhu aplikace s ohledem na stateless a decoupled komponenty, což vede k maximální flexibilitě a škálovatelnosti celého řešení.
Aplikace na podnikové úrovni, jak ukazuje šestá kapitola, vyžadují sofistikované techniky pro správu navigace mezi rolemi uživatelů. Tato kapitola se soustředí na návrh podmíněné navigace, která se dynamicky přizpůsobuje na základě autentizačních informací. To znamená, že aplikace může reagovat na změny uživatelských rolí a podle toho měnit dostupné možnosti.
V sedmé kapitole se čtenář dozví, jak efektivně pracovat s API – ať už REST nebo GraphQL. Podnikové aplikace často vyžadují robustní backendové řešení, a proto je tento krok nezbytný pro každý moderní vývoj. Díky implementaci CI/CD pipelinek, Dockeru, a moderním nástrojům jako Apollo pro GraphQL, získává čtenář kompletní přehled o tom, jak postavit full-stack aplikaci, která je snadno škálovatelná.
Devátá kapitola nabízí praktické recepty na opětovné využití komponent, práci s datovými tabulkami a implementaci správy stavu pomocí NgRx. Tyto techniky jsou základem pro vývoj rozsáhlých aplikací, které vyžadují složité interakce mezi komponentami a uživatelskými rozhraními.
S navrhováním CI/CD pipelinek, které umožňují rychlé iterace a neustálý vývoj produktů, se čtenář setká v desáté kapitole. Automaty pro testování, nasazení na Google Cloud a CI/CD orchestrace s CircleCI jsou nezbytnými nástroji pro jakýkoliv moderní podnikový vývoj, kde je kladen důraz na rychlost nasazení a kvalitní správu kódu.
K tomu všemu je třeba si nastavit efektivní vývojové prostředí, jak ukazuje dodatek A, který čtenáře provede konfigurací nástrojů jako VS Code a CLI nástrojů Angular. Vytvoření správného vývojového prostředí je nezbytné pro dlouhodobý úspěch jakéhokoliv projektu, zejména ve velkých týmech.
Je třeba mít na paměti, že při vývoji aplikace na podnikové úrovni je kladeno velké důraz na škálovatelnost, udržitelnost kódu a flexibilitu při práci s různými technologiemi. Angular poskytuje široké možnosti, jak aplikace optimalizovat pro náročné provozní podmínky. Integrace s nástroji jako Docker, Apollo, Firebase, a různými CI/CD platformami je v dnešní době nutností pro efektivní a bezpečný vývoj.
Jaké jsou klíčové aspekty Angularu pro vývoj podnikových aplikací?
Angular je populární rámec pro vývoj jedno-stránkových aplikací (SPA), který se často využívá v podnikovém vývoji aplikací. Je to názorově řízený rámec, který obsahuje všechny potřebné nástroje pro vývoj aplikací a podporuje typovou kontrolu pomocí TypeScriptu. Mezi další klíčové koncepty, které Angular podporuje, patří například injekce závislostí (DI), což umožňuje vytvářet škálovatelné řešení vhodné pro velké týmy. Angular v tomto ohledu dává vývojářům robustní základ pro tvorbu rozsáhlých, komplexních aplikací. Naopak, React, což je flexibilní knihovna, která není názorově řízená, vyžaduje od vývojářů, aby si vybrali knihovny a nástroje z komunity, aby postavili plně vybavené aplikace. React je jistě populární volbou díky své jednodušší křivce učení a menší složitosti při začátcích, což přitahuje mnoho vývojářů. Tato skutečnost vede k mnoha diskuzím a článkům o tom, co je lepší volba, Angular nebo React. Tyto články však často obsahují povrchní informace a někdy dokonce mylné představy o Angularu, což může čtenáře zmást.
Angular jako rámec není jen o základní syntaxi a komponentách, ale o filozofii, která se odráží v jeho architektuře a ve způsobu, jakým se řeší problémy. Každá volba, kterou učiníte při výběru technologie pro váš projekt, má dlouhodobý dopad, který se projeví až po několika letech práce. V tomto ohledu je důležité si být vědom potenciálních problémů, které mohou vzniknout při škálování aplikace a jak se jim vyhnout.
Když mluvíme o architektuře Angularu, důležitým prvkem je komponentová architektura. Komponenty jsou základními stavebními bloky Angular aplikace. Každá komponenta představuje určitou část uživatelského rozhraní a její chování. Komponenty jsou navzájem propojeny a komunikují prostřednictvím služeb nebo jiných mechanizmů, což umožňuje snadnou správu a testovatelnost kódu.
Dalším důležitým konceptem, který Angular podporuje, je reaktivní programování. Reaktivní přístup znamená práci s tokem dat a událostmi v aplikaci pomocí Observable objektů. Tento přístup zjednodušuje správu asynchronních operací, což je velmi důležité pro složité podnikové aplikace, které se často setkávají s potřebou manipulace s daty z různých externích zdrojů. Reaktivní programování také umožňuje snadnou manipulaci s uživatelskými interakcemi a změnami stavu aplikace.
Modulární architektura je dalším klíčovým prvkem, který Angular podporuje. V Angularu je aplikace rozdělena do modulů, což umožňuje snadnou správu závislostí a opětovné použití kódu. Každý modul může obsahovat komponenty, služby a další moduly. Díky modulárnímu přístupu je možné efektivně rozdělovat práci mezi více vývojářů, což je zásadní pro podnikové aplikace, které mohou mít stovky nebo tisíce komponent.
S příchodem Standalone komponent, které se objevily v novějších verzích Angularu, se možnosti Angularu ještě rozšířily. Standalone komponenty umožňují vývojářům vytvářet nezávislé komponenty, které nejsou vázány na konkrétní modul. Tento přístup zjednodušuje správu aplikace a zvyšuje její flexibilitu.
Angular Router, což je nástroj pro správu navigace v aplikaci, hraje v podnikových aplikacích nezastupitelnou roli. Díky němu mohou vývojáři definovat trasy a přechody mezi různými částmi aplikace. Důležitým aspektem při práci s Angular Routerem je také správa stavu aplikace. V Angularu existuje několik způsobů, jak tuto správu realizovat – od jednoduchých služeb po komplexní řešení jako NgRx nebo Akita, které se inspirují návrhovými vzory jako je Redux.
Vývoj podnikových aplikací ve frameworku Angular zahrnuje i rozpoznání rozdílů mezi ním a alternativami jako React. Každý přístup má své výhody a nevýhody. Zatímco React se více zaměřuje na jednoduchost a flexibilitu, Angular poskytuje silně strukturovaný rámec, který usnadňuje vývoj rozsáhlých aplikací. Angular je často volbou pro týmy, které potřebují robustní řešení pro dlouhodobé projekty, kde je důležité mít jasno v architektuře a kde je vysoký důraz na údržbu a škálovatelnost kódu.
Pokud jde o budoucnost Angularu, ta je stále velmi slibná. I když se může zdát, že React dominuje vývoji moderních webových aplikací, Angular se i nadále vyvíjí a přizpůsobuje aktuálním trendům a potřebám vývojářské komunity. Nejnovější verze, jako je Angular 17, přinášejí mnoho vylepšení, které usnadňují práci s tímto rámcem a zároveň zajišťují jeho kompatibilitu s nejnovějšími technologiemi a standardy v JavaScriptu. S přechodem na engine Ivy a zlepšením podpory pro moderní nástroje jako ESLint nebo Vitest, Angular zůstává silným nástrojem pro vývoj podnikových aplikací.
Při vývoji podnikových aplikací je nezbytné udržovat Angular a jeho nástroje aktuální. Často je důležité provádět pravidelné aktualizace a kontrolovat, zda používané knihovny a nástroje neobsahují bezpečnostní nebo funkční chyby, které mohou ovlivnit výkon aplikace. Tato snaha o udržování “evergreen” verze aplikace je klíčová pro dlouhodobou úspěšnost projektu.
Jak efektivně využít NgRx a jeho alternativy pro správu stavu v Angular aplikacích
Správa stavu v aplikacích je v současnosti jedním z klíčových aspektů vývoje, přičemž frameworky jako NgRx se staly standardem pro složité a rozsáhlé aplikace v Angularu. NgRx, inspirovaný principy Redux, nabízí robustní nástroje pro práci s globálním stavem aplikace, zajištění prediktivního řízení toku dat a zvýšení testovatelnosti aplikace. I když je NgRx silným nástrojem, jeho implementace může být náročná na údržbu a vyžaduje značnou pozornost věnovanou správě kódu. V tomto textu se podíváme na to, jak správně implementovat NgRx pro správu stavu v Angular aplikacích, a prozkoumáme alternativy, které mohou být pro určité scénáře výhodnější.
Použití mock store pro testování komponent
Při testování Angular komponent, které využívají NgRx pro správu stavu, může být užitečné použít mock store. Tento přístup umožňuje nastavit specifický stav, který bude simulovat reálné scénáře a umožní ověřit, zda komponenta správně reaguje na změny stavu. Například, pokud máme komponentu CurrentWeatherComponent, která zobrazuje aktuální počasí, můžeme použít mock store k nastavení počátečního stavu a otestování, zda komponenta správně načítá data o počasí z mockovaného weather service.
Tento test simuluje stav aplikace s konkrétními daty o počasí a ověřuje, že komponenta správně zobrazuje město a teplotu. Použití mock store znamená, že není třeba se připojovat k reálnému NgRx store, což testy značně zjednodušuje a zrychluje.
NgRx/Data
Pokud pracujete s aplikacemi, které provádějí mnoho CRUD operací, může být vhodnou volbou knihovna NgRx/Data. Tento nástroj automatizuje proces vytváření store, efektů, akcí, reducerů a selektorů, což značně zjednodušuje kód. NgRx/Data je ideální pro aplikace, které často pracují s entitami a potřebují efektivně spravovat jejich stav. Ačkoli se v minulosti těšil velké oblibě, v poslední době byl tento balíček uveden do režimu údržby a již není doporučen pro nové projekty.
Pokud však přesto zvažujete jeho použití, mějte na paměti, že NgRx/Data je pouze abstrakce nad NgRx a může být složité ho implementovat, pokud nemáte dobrou znalost základů NgRx. Zároveň tento balíček nepodporuje některé pokročilé funkce, jako je hluboké klonování entit, generování klíčů nebo práci se serverovými odpověďmi v ne-normalizované podobě.
NgRx/ComponentStore
Pokud potřebujete řešit lokální stav v komponentách nebo modulech, aniž byste museli používat globální store, pak může být NgRx/ComponentStore skvělou volbou. Tento nástroj je navržen tak, aby zjednodušil správu stavu na úrovni komponenty. Umožňuje udržovat stav bez nutnosti připojovat se k celosvětovému store, což vede k čistší a snadněji udržovatelné struktuře aplikace. ComponentStore je ideální pro složité komponenty s mnoha interakcemi a lokálními stavy, protože umožňuje komponentám spravovat svůj vlastní stav pomocí reaktivních služeb, čímž se zvyšuje jejich znovupoužitelnost a nezávislost.
Pokud aplikace nevyžaduje sdílený stav mezi více komponentami a jde o menší nebo střední aplikace, které nevyužívají složitou integraci efektů nebo DevTools, NgRx/ComponentStore poskytuje snadnější a efektivnější řešení.
NgRx/Signals
NgRx/Signals je nová knihovna, která se zaměřuje na využívání signálů v Angularu pro správu stavu. Signals jsou jednodušší, efektivnější a poskytují čistější způsob, jak spravovat reaktivní stav v aplikaci. NgRx/Signals přináší deklarativní přístup k programování a usnadňuje tvorbu autonomních komponent, které lze snadno integrovat do aplikace. Tento přístup vede k jednoduššímu a přehlednějšímu kódu, což má pozitivní vliv na výkon aplikace, jelikož minimalizuje její zátěž při zachování vysoké efektivity.
SignalStore v NgRx je skvělým řešením pro nové aplikace, které chtějí využívat signály a současně udržet vysoký výkon a snadnou údržbu kódu.
Závěr
Volba mezi těmito nástroji závisí na konkrétních potřebách projektu. NgRx a jeho alternativy, jako jsou NgRx/Data, NgRx/ComponentStore a NgRx/Signals, mají své silné stránky a výhody, ale také určité omezení. Je důležité zvážit složitost aplikace, množství sdíleného stavu, potřebu reaktivity a požadavky na výkon při rozhodování, jaký nástroj zvolit pro správu stavu. Důkladné pochopení těchto nástrojů a jejich správné nasazení může výrazně zjednodušit vývoj a údržbu aplikací v Angularu.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский