Tuning Your
Angular Application
Bonnie Brennan
and
Mateus Carniatto
Bonnie Brennan
Angular GDE
Angular Architect
ngHouston Founder
Angular Air Panelist
Mateus Carniatto
Angular Expert @ Riaktr
Angular Break the Ice Organizer
Today we will cover...
- Runtime Performance
- Page Load Speed
- Architecture
Runtime
Performance
Using Async pipe
<ng-container *ngIf="(source$ | async) as data">
<my-component [data]="data"></my-component>
</ng-container>
Advantages
- Unwraps the observable
- Automatically unsubscribes on ngOnDestroy
- Allows to use the 'as' syntax
Title Text
export class SomeComponent implements OnDestroy {
private subs = new SubSink();
...
this.subs.sink = observable$.subscribe(...); // easy syntax
this.subs.add(observable$.subscribe(...)); // if you insist
this.subs.add( // can add multiple subcriptions
observable$.subscribe(...),
anotherObservable$.subscribe(...)
);
...
// Unsubscribe when the component dies
ngOnDestroy() {
this.subs.unsubscribe();
}
}
Using subsink from Ward Bell
Bonus tip
@Component({
selector: 'my-component',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
constructor(private http: HttpClient) {
}
ngOnInit(): void {
// auto completes and unsubscribes after the http request is completed
this.http.get('http://my-data-service/users').subscribe({ ... });
}
}
Page Load Speed
Webpack bundle analyzer
// from this
// (imports the whole library)
import * as _ from 'lodash' // 23.6kb
// to this
// (imports just the needed)
import chunk as _chunk from 'lodash-es/chunk' // 3kb
Use ES modules version of libraries
Angular CLI Budgets
{
"configurations": {
"production": {
"budgets": [
{
"type": "bundle",
"name": "vendor",
"baseline": "750kb",
"warning": "100kb",
"error": "200kb"
}
]
}
}
}
Import cost for VScode
Bundle Phobia
Architecture
a.k.a. The Sibling Rule
One Last Tip
Thank you!
Matt
@c4rniatto
Bonnie
@bonnster75
ngVikings
By Mateus Carniatto
ngVikings
- 965