Az Angular Ivy 9-es verziójában való bemutatása óta jelentős változások történtek a fejlesztői környezetben, és sokak számára még mindig egyfajta "fekete dobozként" működik. Az Ivy motor bevezetésével az Angular alkalmazások teljesítménye, tesztelhetősége és fejlesztési hatékonysága drámaian javult. A megfelelő ismeretek birtokában azonban nemcsak a kód minősége, hanem az alkalmazás sebessége is javítható.

Az Ivy célja, hogy a fejlesztők számára egy könnyen testre szabható, gyorsabb és hatékonyabb környezetet biztosítson. A változások legnagyobb előnye, hogy a korábbi Angular alkalmazásokhoz képest jelentős mértékben csökkenti az alkalmazás méretét, miközben növeli annak sebességét. A kód optimalizálása révén a fejlesztők könnyebben tudják kezelni a tesztelhetőséget és hibakeresést, ami alapvetően javítja a fejlesztési folyamatok gyorsaságát.

Az egyik legfontosabb új funkció az Ivy-vel kapcsolatban az úgynevezett "tree-shaking", amely lehetővé teszi a nem használt kód eltávolítását az alkalmazás végső csomagjából. Ez csökkenti az alkalmazás méretét, és gyorsabb betöltést tesz lehetővé, amely kulcsfontosságú a felhasználói élmény javítása szempontjából. Az Ivy motor ezáltal hatékonyabban kezeli a modulokat és a komponenseket, így az alkalmazás összesített teljesítménye jelentősen javul.

A másik kulcsfontosságú újítás az AOT (Ahead-of-Time) fordítás, amely már a fejlesztés alatt biztosítja, hogy az alkalmazás optimális sebességgel fusson. Az AOT fordítás az Angular alkalmazások gyorsabb és kisebb kimenetének alapját képezi, mivel a fordító már a build során optimalizálja a kódot, így a végrehajtás gyorsabban történhet meg a böngészőben. Az új fordítási mechanizmus lehetővé teszi a fejlesztők számára, hogy a kódot még jobban testre szabják, és teljes mértékben kihasználják az Ivy előnyeit.

Emellett az Ivy előnyei közé tartozik a dinamikus komponenstöltés finomhangolása, amely lehetővé teszi az Angular alkalmazások számára, hogy csak azokat a komponenseket töltsék be, amelyekre ténylegesen szükség van. Ez nemcsak a sebességet növeli, hanem az alkalmazások memóriakezelését is optimalizálja, így még nagyobb alkalmazások esetén is hatékonyabbá válik a működés.

Fontos megemlíteni, hogy az Ivy nemcsak a már meglévő Angular alkalmazások optimalizálásában segít, hanem új alkalmazások fejlesztésénél is lehetőséget biztosít a legújabb Angular verziók kihasználására. A tesztelhetőség szempontjából az Ivy számos új lehetőséget kínál, például a tesztekhez való könnyebb hozzáférést és az egyes komponensek könnyebb izolálását. A TestBed.inject metódus például lehetővé teszi a függőségek dinamikus injektálását, így a tesztelés sokkal egyszerűbbé válik.

Az Angular új "szigorú mód" beállításai még több lehetőséget adnak a kód hibáinak előre történő észlelésére, és segítenek abban, hogy a fejlesztők elkerüljék a potenciálisan problémás mintákat, amelyeket a fordító azonnal jelez. Ez különösen hasznos lehet a nagyobb projektek esetén, ahol a kód karbantartása és bővítése folyamatos kihívást jelenthet.

Fontos azonban, hogy a fejlesztők tisztában legyenek azzal, hogy az Ivy teljes mértékű kihasználásához alapos ismeretek szükségesek. A dokumentáció és a különböző példák alapján könnyen bele lehet esni abba a csapdába, hogy túlzottan összetett megoldásokat próbálunk implementálni, amelyek végül nem hoznak érdemi előnyt. Ahelyett, hogy túl bonyolult megoldásokkal próbálnánk optimalizálni az alkalmazást, fontos, hogy mindig az egyszerűségre és a tisztán megírt, jól tesztelt kódra összpontosítsunk.

A fejlesztők számára alapvető fontosságú, hogy tisztában legyenek az Ivy által hozott új API-kal és az új szintaxissal, amelyek a fejlesztési ciklus során előnyösek lehetnek. A CSS Custom Properties integrálása, a platform specifikus provider scope-ok használata, vagy akár az új komponens API-k is olyan fejlesztői eszközkészletet biztosítanak, amellyel még inkább finomhangolható az alkalmazás működése és megjelenése.

Az Ivy tehát nem csupán a sebességet és a kód minőségét javítja, hanem a tesztelés és a hibakeresés terén is komoly előnyöket kínál. Ahhoz, hogy a fejlesztők maximálisan kihasználják ezt az új motort, elengedhetetlen a rendszeres frissítések követése, a legújabb eszközök és könyvtárak ismerete, valamint az új fejlesztési lehetőségek felfedezése.

Hogyan gyorsíthatjuk és csökkenthetjük az Angular alkalmazások csomagjait AOT fordítással?

Az Angular alkalmazások teljesítményének optimalizálása érdekében az egyik kulcsfontosságú technológia az AOT (Ahead-of-Time) fordítás. Az Ivy, az Angular új belső fordító motorja, amely az Angular 9-től kezdve vált elérhetővé, lehetőséget biztosít arra, hogy az alkalmazásokat gyorsabban és kisebb csomagokban fordítsuk, mint korábban a View Engine-ben. De hogyan érhetjük el a legnagyobb hasznot az AOT fordításból, és miért fontos ezt a gyakorlatban is alkalmazni?

A klasszikus objektum-orientált programozásban jól ismert a tulajdonságok és metódusok megosztása az osztályok öröklése által. Az Angular Ivy lehetővé teszi, hogy a komponensek és direktívák metaadatait hasonló módon osszuk meg. Az öröklés során a komponensek nemcsak a logikát, hanem a megjelenítést és az eseménykezelést is örökölhetik. Például, egy SuggestedSearchComponent komponens az alap BaseSearchComponent komponensből örököl, amely biztosítja számára az alapvető keresési funkcionalitást. A SuggestedSearchComponent továbbá hozzáad egy új input tulajdonságot is: a suggestions listát, amely a keresési javaslatokat tartalmazza. Az ilyen típusú összetett komponensekben a megfelelő öröklés és adatbinding használata biztosítja, hogy a különböző komponensrészek közötti kommunikáció hatékony legyen.

Az AOT fordítás fontos előnye, hogy a fordítási időt a fejlesztési fázisokban is csökkenti, miközben minimalizálja a végső csomagok méretét. Korábban előfordulhatott, hogy egy nagy Angular alkalmazás JIT (Just-in-Time) fordítással kisebb csomagot eredményezett, mint AOT fordítással. Az Ivy fordítómotor segítségével azonban ez a különbség eltűnt, és most már minden típusú alkalmazás számára előnyös a statikus fordítás.

Az Ivy használatával az alkalmazások egyre inkább "tree-shakable" (fáról rázott) komponensekké válnak. Ez azt jelenti, hogy azok a kódrészletek, amelyeket nem használunk az alkalmazásunkban, automatikusan eltávolításra kerülnek a végső csomagból. Például, ha nem használjuk az Angular animációs vagy globalizációs API-jait, akkor ezek nem lesznek jelen a csomagban. Ez különösen fontos lehet olyan esetekben, mint például mikroszolgáltatások vagy webkomponensek, ahol a keretrendszer teljes méretének minimalizálása kiemelt cél.

Az Angular 11 a View Engine utolsó támogatott verziója, és az Ivy már teljes mértékben elérhető az alkalmazások számára. A jövőben az Ivy-ra épülő kódot célszerű előnyben részesíteni, mivel a View Engine kódot már nem ajánlott közvetlenül alkalmazni. Az Angular Kompatibilitási Fordító (Angular Compatibility Compiler) segítségével lehetséges a régebbi, View Engine által lefordított könyvtárak és alkalmazások Ivy-kompatibilissé tétele, de ez növeli a fordítási időt, és problémákat okozhat a fejlesztői környezetekben.

Az Ivy fordító minden egyes alkalmazásrészt optimalizál és lehetővé teszi az "inkrementális fordítást", amely gyorsítja a teljes alkalmazás építési idejét. Az Ivy egyik kulcsfontosságú újítása a "locality" elve, amely biztosítja, hogy a szülő komponens nem szükséges minden egyes gyermekkomponens vagy azok függőségei részletes ismeretére, elég csupán a publikus API-jukat figyelembe venni.

Emellett az Angular 12-től kezdődően a szigorú mód (strict mode) alapértelmezetté válik az új munkaterületek számára. A szigorú mód használatával a fejlesztők az összes potenciális hibát már a fordítási fázisban észlelhetik, mivel ez lehetővé teszi a szigorúbb típusellenőrzést és a potenciális hibák kiszűrését. A TypeScript fordító szigorú opciói, mint például az alwaysStrict, noImplicitAny és strictNullChecks mind hozzájárulnak a magasabb kódminőséghez, csökkentve a futásidejű hibák kockázatát.

Ezek az új fejlesztési beállítások és konfigurációk a fejlesztők produktivitásának növelését célozzák. A szigorú mód alkalmazásával nemcsak a hibák előrejelzése válik könnyebbé, hanem az alkalmazásunk is gyorsabbá és megbízhatóbbá válik. Az Angular eszköztára az újabb verziókkal egyre inkább segíti a fejlesztőket abban, hogy kisebb, gyorsabb és hatékonyabb alkalmazásokat készíthessenek.

Végül, ha Angular alkalmazásunkat sikeresen optimalizáltuk az Ivy és AOT segítségével, elérhetjük, hogy a fejlesztési folyamatok gyorsabbá váljanak, és az alkalmazásunk csomagjai jelentősen kisebbek legyenek. Ezen kívül az alkalmazásunk könnyebben skálázhatóvá válik, mivel minden nem használt kód automatikusan eltávolításra kerül a végső kódból.

Hogyan frissíthetjük Angular alkalmazásunkat a View Engine-ről Ivy-ra

A modern Angular alkalmazások folyamatosan fejlődnek, és a legújabb verziókra történő frissítés elengedhetetlen a teljesítmény, biztonság és új funkciók szempontjából. Az Angular frissítési folyamata komplex lehet, különösen akkor, ha az alkalmazásunkat a View Engine-ről az Ivy renderelőre szeretnénk migrálni. Az alábbiakban áttekintjük a szükséges lépéseket, valamint a legfontosabb frissítéseket és automatikus migrációkat, amelyek segítenek a zavartalan átállásban.

Az Angular frissítésekor a legfontosabb eszköz az ng update parancs, amely lehetővé teszi az Angular specifikus csomagok és harmadik féltől származó Angular könyvtárak frissítését. Ezzel a parancssal automatikusan elvégezhetjük a szükséges migrációkat, amelyeket az adott csomag verziójában találunk. Az ng update parancs használata egyszerűsíti a migrációt, mivel a szükséges frissítéseket és azokhoz kapcsolódó fájlokat automatikusan azonosítja.

Ha például az Angular 9-es verzióra szeretnénk frissíteni, a következő parancsot használhatjuk:

kotlin
ng update @angular/cli@^9 @angular/core@^9

Ez a parancs az összes fő Angular csomagot a legújabb 9-es verzióra frissíti, és automatikusan elvégzi a szükséges migrációkat. Az Angular CLI a munkaterületi migrációkért felelős, míg az Angular Core csomag a runtime migrációkért.

Ezen kívül lehetőség van arra, hogy minden migrációt külön commit-ban végezzünk el a --create-commits paraméterrel, így könnyebben nyomon követhetjük a migrációk által végrehajtott változtatásokat és akár vissza is vonhatjuk azokat, ha szükséges.

A migrációs folyamat során egyes esetekben opcionális migrációk is rendelkezésre állnak, amelyeket szükség szerint alkalmazhatunk. Például az Angular 12 verzió bevezetett egy opcionális migrációt, amely alapértelmezetté teszi a production build konfigurációt:

kotlin
ng update @angular/cli@^12 --migrate-only production-by-default

A migrációk során mindig figyeljünk oda a részletes változásokra és azok leírására, amelyeket a rendszer a migrációs parancsok után kiadott üzenetekben találunk. Az Angular hivatalos dokumentációja és a migrációs oldalak segítenek megérteni, hogy miért szükségesek ezek a változtatások, valamint hogyan alkalmazhatjuk őket manuálisan is.

A legfontosabb migrációk közé tartoznak a következők:

  1. Workspace verzió 9 migráció: Ez a migráció a build konfigurációkat módosítja, hogy az aot (Ahead of Time) opció automatikusan igaz legyen a fejlesztési build konfigurációban is. Ez az optimalizált kódgenerálás szempontjából kulcsfontosságú.

  2. Lusta betöltés szintaxis migráció: Az ng update parancs ezen migrációja átalakítja a string alapú lazy loaded útvonalakat, hogy azok dinamikus importálások legyenek. Az alábbi példában a régi szintaxis:

    javascript
    { path: 'dashboard', loadChildren: './dashboard.module#DashboardModule' }

    Átalakul:

    javascript
    { path: 'dashboard', loadChildren: () => import('./dashboard.module').then(m => m.DashboardModule) }

    Az új szintaxis a jövőbeli kompatibilitás érdekében elengedhetetlen.

  3. Statikus flag migráció: Az Angular 8-ban a szükséges statikus opció a ViewChild és ContentChild lekérdezésekhez lett hozzáadva. Angular 9-ben a statikus opció választhatóvá vált, és alapértelmezetten false értékre van állítva. Ez a migráció biztosítja, hogy a statikus opció helyesen legyen beállítva, ha az szükséges.

Mindezek a migrációk nemcsak az alkalmazás teljesítményét javítják, hanem segítenek abban is, hogy az Angular legújabb verzióira való átállás simábban és biztonságosabban történjen. Fontos, hogy minden frissítést és migrációt gondosan végezzünk el, és ne hagyjuk figyelmen kívül a dokumentációban található figyelmeztetéseket és ajánlásokat. Az Angular folyamatosan új verziókkal és fejlesztésekkel érkezik, ezért mindig fontos a rendszeres frissítések végrehajtása.

A migrációs folyamatot követően, ha a projektünkben külső Angular könyvtárakat is használunk, azokat is frissítenünk kell, hogy kompatibilisek legyenek a legújabb Angular verziókkal. A külső könyvtárak esetében is használhatjuk az ng update parancsot, hogy biztosítsuk a megfelelő verziók telepítését és azok migrációit.

A sikeres migráció érdekében mindig tartsuk szem előtt, hogy az Angular frissítései csak akkor lesznek teljesen hatékonyak, ha az alkalmazásunkat folyamatosan karbantartjuk, és figyelemmel kísérjük a legújabb fejlesztéseket és ajánlásokat.