Angular alkalmazások teljesítménynövelése
Kiss Balázs 2023.
1
Rólam
Kiss Balázs
2
Tartalomjegyzék:
3
4
Disclaimer: elég sok guide van fent a neten.
Bottom line: tapasztalat, józan ész, prog.tudás, JS, TS, HTML, CSS, Web, és végül Angular ismerete
5
6
Programozói tudás
OSI, Web API réteg
EcmaScript, HTML, CSS
Framework
Segédkönyvtárak
Architekturális döntések
Honnan tudjam, mit nem tudok?
(ha csak egy dolgot jegyzel meg ma)
7
Programozói tudás
OSI, Web API réteg
EcmaScript, HTML, CSS
Framework
Segédkönyvtárak
Architekturális döntések
8
2. Auditálás
9
2. Hogyan mérjük a performanciát?
Webalkalmazás auditálása = fancy word a checklisteken végigmenésre
10
2. Hogyan mérjük a performanciát?
Webalkalmazás auditálása
11
Ezekre vannak toolok, amiket már kezdőként is használhatunk (és haladóként is illik)
2. Hogyan mérjük a performanciát?
Webalkalmazás auditálása = fancy word a checklisteken végigmenésre
12
Online toolok, leírások, tippek böngészését javaslom, Google, Apple, Mozzilla stb.
2. Kód audit eszközök
Angular esetén javasolt kódminőség javító eszközök:
Megjegyzés: Prettier és társai kódformázás, nem szigorúan kódminőség-javító hatásúak, de fontosak
13
2. Kód audit eszközök #2
14
2. Kód audit eszközök #2
Bundle Analyzer Demo https://github.com/webpack-contrib/webpack-bundle-analyzer
15
Cheat sheet:
Stat: direkt méret
Parsed: minification után
2. Kód audit eszközök #2
Bővebben: https://blog.jakoblind.no/webpack-bundle-analyzer/
16
2. Kód audit eszközök #3
17
2. Kód audit eszközök: bónusz
18
2. Kód audit eszközök: bónusz
19
2. Webapp metrikák
Betöltés és működés mérése… több megközelítés is kering
Egy jó (újabb) kezdeményezés: https://www.w3.org/webperf/ és https://web.dev/i18n/en/vitals/ felhasználó központúság
20
2. Futó alkalmazás audit eszközök
Ezek már egy futó alkalmazás metrikáit gyűjtik: valódi performancia
21
2. Futó alkalmazás audit eszközök
(folyt.)
És még biztos vagyok benne hogy van kismillió…
Bónusz: Google Analytics
Bónusz2: Schema.org és társai
22
2. Google Lighthouse
23
3. Angular eszközök
24
3. Legfontosabb Angular eszközök
Build optimalizáció:
Runtime optimalizáció:
25
3.1. Build & Bundle
Lazy-loading modules
https://angular.io/guide/lazy-loading-ngmodules
Tehát csak igény esetén töltjük be őket: pl. amíg nem navigálunk el a felhasználó profil oldalára, addig az ezzel kapcsolatos funkciókat nem töltjük be.
26
3.1. Build & Bundle
Lazy-loading modules
https://angular.io/guide/lazy-loading-ngmodules
Tehát csak igény esetén töltjük be őket: pl. amíg nem navigálunk el a felhasználó profil oldalára, addig az ezzel kapcsolatos funkciókat nem töltjük be.
Bónusz: mikrofrontendek
27
3.1. Build & Bundle
Lazy-loading modules
https://angular.io/guide/lazy-loading-ngmodules
Tehát csak igény esetén töltjük be őket: pl. amíg nem navigálunk el a felhasználó profil oldalára, addig az ezzel kapcsolatos funkciókat nem töltjük be.
Bónusz: mikrofrontendek
28
Bónusz2: Standalone components
3.1. Standalone xy.
Lazy load-olható komponensek (angular v14 óta)
Bootstrappelhető, Modulokat hivatkozhat be, modulok is bemelhetőek (smooth átállás)
29
3.2. Build & Bundle
Server Side Rendering�https://web.dev/rendering-on-the-web/
Ötlet: rendereljük le a weboldalt úgy mint régen a szerveroldalon, és azt gyorsabban vissza tudjuk adni, mint az SPA-nkat. Mindkettőt adjuk oda, és az SPA vegye át az irányítást ha elindult
https://angular.io/guide/universal (Angular Universal)
30
4.1. Preloading
Nem összekeverendő a LazyLoading-gal
https://danielk.tech/home/complete-angular-performance-guide
31
4.2. Change Detection
32
4.2. Compiler
TS -> JS, + dekorátorok -> előállítja a Module és Component Definition-öket
4.2. Change Detection
34
4.2. Change Detection
Az angular-nak fáj-e?
35
4.2. Change Detection
Az angular-nak fáj-e?
Az Angular nagy problémája a felesleges ChangeDetection futtatás költsége.
Mélyebb megismeréshez: https://indepth.dev/posts/1053/everything-you-need-to-know-about-change-detection-in-angular
36
4.2. ChangeDetection optimalizálás
Szintek:
Change Detection csak akkor fog futni, ha a komponens inputjai változnak (vagy esemény történik a komponensben vagy gyerekeiben)
Általában érdemes használni, de vannak benne buktatók!
A changedetector ref-fel le is lehet teljesen állítani a komponens figyelését:
37
constructor(private ref: ChangeDetectorRef) {
this.ref.detach();
}
4.2. ChangeDetection optimalizálás
3. Zone.js: async folyamatokra akasztott hook-ok, a CD-triggerelésére. Minden hívásra “ráakaszkodik”
4. WebWorker api
Valódi szeparált JS szál,
Background processzekhez, mobilos feladatokhoz, de jól jöhet weben is
38
constructor(private ngZone: NgZone) {
this.ngZone.runOutsideAngular(() => {
// this will not trigger change detection
setInterval(() => doSomething(), 100)
});
}
4.2. Bónusz #2: Signals
Zone.js:
https://dev.to/this-is-angular/angular-signals-everything-you-need-to-know-2b7g
39
4.3. Tipik hiba: Function Bind
https://stackblitz.com/edit/angular-sotet-oldal-2
40
{{ getResult() }}
getResult() {
return this.sum;
}
4.3. Tipik hiba: Function Bind
https://stackblitz.com/edit/angular-sotet-oldal-2
Megoldás: propertybind, ahol lehet (vagy pure RxJS…)
Pure pipes:
https://stackblitz.com/edit/angular-sotet-oldal-2-purepipe
További példák másik előadásban:
41
{{ getResult() }}
getResult() {
return this.sum;
}
4.4. Tipik hiba #2: ExpressionChangedAfterItHasBeenCheckedError
Csak DEV módban jön elő
4.5. Track By
Minden esemény (egér mozgás, animációk stb.) kiváltja az újra renderelést
https://stackblitz.com/edit/angular-sotet-oldal-4-javtva
43
<tr *ngFor="let item of tableData; trackBy:trackByCode">
<td>{{ item.code }}</td>
<td>{{ item.name }}</td>
<td>{{ item.price | currency }}</td>
</tr>
4.6. CDK, VirtualScroll, InfiniteScroll
Angular Material CDK része az eszköztár
44
4.6. CDK, VirtualScroll, InfiniteScroll
45
overlay
dialog
snackbar
menu
tooltip
autocomplete
tabs
stepper
dynamic content
focus
trap
sidenav
dialog
CDK
4.6. CDK, VirtualScroll, InfiniteScroll
Angular Material CDK része az eszköztár
Két optimalizálás:
46
4.7. Angular Resolver
47
4.8. RxJS
Csomó hiba a Reaktív, dekleratív gondolkodásmód hiányából (szekvenciális, imperatív módon használva)
Példa1:
48
4.8. RxJS
https://angular.io/guide/rx-library
Evolúció “csúcsa”: |async pipe-ig “kicsurgatni” mindent
49
@Component({
selector: 'test',
template: `
<div *ngFor="let user of userlist">
{{ user?.name }}
{{ user?.email }}
</div>
`
})
export class MyExampleComponent {
const userList: any[]
constructor(http: HttpClient) {
this.load();
}
getUserList() {
return this.http.get(apiUrl);
}
load() {
this.getUserList().subscribe(user => {
this.userList = user;
})
};
}
@Component({
selector: 'test',
template: `
<div *ngFor="let user of userlist | async">
{{ user?.name }}
{{ user?.email }}
</div>
`
})
export class MyExampleComponent {
const userList: Observable<any>
constructor(http: HttpClient) {
this.load();
}
getUserList() {
return this.http.get(apiUrl);
}
load() {
this.userList = this.getUserList().subscribe();
}
4.8. RxJS Time
Pl. DebounceTime:
És még van pár hasonló alternatíva (throttle, audit, sample stb. )
https://dev.to/rxjs/debounce-vs-throttle-vs-audit-vs-sample-difference-you-should-know-1f21 )
50
4.9. App Shell
A technika Performancia + UX (de inkább UX) trükk
Angular-ban:
https://angular.io/guide/app-shell
Skeleton-screen, Shimmer Effect
51
További lehetőségek
52
5.1. Dev szerver csere
Fejlesztési élmény javítása (nem mindig az angular a hibás, lehet vas kell a gitlab-otok alá…)
53
Nálam:
54
original: 17246 ms
esbuild: 6747 ms
original: 13680 ms
esbuild 7843 ms
47663ms
15.317
5.2. Cache-elés
55
5.2. Cache-elés
56
5.2. Cache-elés
57
5.2. Cache-elés
*: szerintem :)
58
5.3. App felosztása
59
Nem túl összefüggő appok
5.4. CQRS modell
https://martinfowler.com/bliki/CQRS.html
Kvázi “CRUD”-nak tekintjük a state-et �(Create, Read, Update, Delete)
ugyanazok az előnyök
És ez evolválódik tovább
60
5.4. CQRS (Redux) modell
https://martinfowler.com/bliki/CQRS.html
Kvázi “CRUD”-nak tekintjük a state-et �(Create, Read, Update, Delete)
ugyanazok az előnyök
És ez evolválódik tovább
61
5.4. State kezelés könyvtárai
Ha az Angular-os vonalvezetés nem volna elég
https://ordina-jworks.github.io/angular/2018/10/08/angular-state-management-comparison.html
62
5.5. Image directive
NgOptimizedImage
LCP érték miatt
Néhány feature:
63
5.6. RxJS hasznos linkek #2
64
5.7. UI Könyvtárak
65
Clarity
Lightning
ngBootstrap
5.8. AoT, Ivy
Rendering típusok:
Ivy:
Nem kell vele foglalkozni, Angular 9 óta default dev, és prod módban is. (upgradeljetek!)
66
5.9. Bónusz: ha nem értek valamit
67
5.10. Angular Checklist
https://github.com/typebytes/angular-checklist
68
5.11. Bónusz
Az előadás közben, a nézők által élőben küldött egyéb hasznos linkek:
69
Köszönöm a figyelmet!
Kérdésed van? Keress bátran:
70